|
@@ -101,32 +101,33 @@ func ListenMail(mailAddress, folder, userName, password string, readBatchSize, f
|
|
|
|
|
|
to := mbox.Messages // 此文件下的邮件总数
|
|
to := mbox.Messages // 此文件下的邮件总数
|
|
|
|
|
|
- from := uint32(1)
|
|
|
|
- // 假设需要获取最后4封邮件时
|
|
|
|
- if fromEmailIndex > 0 {
|
|
|
|
- from = uint32(fromEmailIndex)
|
|
|
|
- } else {
|
|
|
|
- var maxNum uint32
|
|
|
|
- //该次监听获取的最大数量
|
|
|
|
- maxNum = 20000
|
|
|
|
- //获取开始的邮件编号
|
|
|
|
- if to > maxNum {
|
|
|
|
- from = to - maxNum + 1
|
|
|
|
- }
|
|
|
|
- }
|
|
|
|
|
|
+ //minIndex := uint32(5)
|
|
|
|
+ //// 假设需要获取最后4封邮件时
|
|
|
|
+ //if fromEmailIndex > 0 {
|
|
|
|
+ // minIndex = uint32(fromEmailIndex)
|
|
|
|
+ //} else {
|
|
|
|
+ // var maxNum uint32
|
|
|
|
+ // //该次监听获取的最大数量
|
|
|
|
+ // maxNum = 20000
|
|
|
|
+ // //获取开始的邮件编号
|
|
|
|
+ // if to > maxNum {
|
|
|
|
+ // minIndex = to - maxNum + 1
|
|
|
|
+ // }
|
|
|
|
+ //}
|
|
//from = 310
|
|
//from = 310
|
|
|
|
|
|
- step := uint32(5)
|
|
|
|
- for i := from; i <= to; {
|
|
|
|
- end := i + step - 1
|
|
|
|
- if end > to {
|
|
|
|
- end = to
|
|
|
|
|
|
+ var isStopFor bool
|
|
|
|
+ step := uint32(1)
|
|
|
|
+ for i := to; i >= 1; {
|
|
|
|
+ start := i - step + 1
|
|
|
|
+ if start < 0 {
|
|
|
|
+ start = 1
|
|
}
|
|
}
|
|
|
|
|
|
- fmt.Printf("当前剩余%d封邮件待处理\n", to-i+1)
|
|
|
|
|
|
+ //fmt.Printf("当前剩余%d封邮件待处理\n", i-minIndex+1)
|
|
|
|
|
|
seqSet.Clear()
|
|
seqSet.Clear()
|
|
- seqSet.AddRange(i, end) // 添加指定范围内的邮件编号
|
|
|
|
|
|
+ seqSet.AddRange(start, i) // 添加指定范围内的邮件编号
|
|
|
|
|
|
// 获取整个消息正文
|
|
// 获取整个消息正文
|
|
// imap.FetchEnvelope:请求获取邮件的信封数据(例如发件人、收件人、主题等元数据)。
|
|
// imap.FetchEnvelope:请求获取邮件的信封数据(例如发件人、收件人、主题等元数据)。
|
|
@@ -150,6 +151,11 @@ func ListenMail(mailAddress, folder, userName, password string, readBatchSize, f
|
|
|
|
|
|
//log.Println("开始读取邮件内容")
|
|
//log.Println("开始读取邮件内容")
|
|
for msg := range messages {
|
|
for msg := range messages {
|
|
|
|
+ // 如果需要终止,那么就不处理了
|
|
|
|
+ if isStopFor {
|
|
|
|
+ continue
|
|
|
|
+ }
|
|
|
|
+
|
|
emailMessage, isRead, tmpErr := readEveryMsg(msg)
|
|
emailMessage, isRead, tmpErr := readEveryMsg(msg)
|
|
if tmpErr != nil {
|
|
if tmpErr != nil {
|
|
// 移除本地文件
|
|
// 移除本地文件
|
|
@@ -168,14 +174,24 @@ func ListenMail(mailAddress, folder, userName, password string, readBatchSize, f
|
|
if !isRead {
|
|
if !isRead {
|
|
continue
|
|
continue
|
|
}
|
|
}
|
|
|
|
+
|
|
|
|
+ // 判断当前邮件id是否小于等于已经监听到的最小id,如果是,那么就不处理了
|
|
|
|
+ if emailMessage.Uid <= uint32(fromEmailIndex) {
|
|
|
|
+ isStopFor = true
|
|
|
|
+ continue
|
|
|
|
+ }
|
|
// 如果取到了,那么写入待处理chan
|
|
// 如果取到了,那么写入待处理chan
|
|
// 写入邮件处理chan
|
|
// 写入邮件处理chan
|
|
mailMessageChan <- emailMessage
|
|
mailMessageChan <- emailMessage
|
|
|
|
+
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+ if isStopFor {
|
|
|
|
+ // 已经找到了最小的邮件id,那么就退出循环了
|
|
|
|
+ }
|
|
//time.Sleep(time.Second * 5) // 休眠10秒
|
|
//time.Sleep(time.Second * 5) // 休眠10秒
|
|
|
|
|
|
- i = i + step
|
|
|
|
|
|
+ i = i - step
|
|
}
|
|
}
|
|
|
|
|
|
log.Println("读取了所有邮件,完毕!")
|
|
log.Println("读取了所有邮件,完毕!")
|
|
@@ -228,7 +244,7 @@ func readEveryMsg(msg *imap.Message) (emailMessage MailMessage, ok bool, err err
|
|
// 发件人
|
|
// 发件人
|
|
{
|
|
{
|
|
fromStr := mr.Header.Get("From")
|
|
fromStr := mr.Header.Get("From")
|
|
- fmt.Println(fromStr)
|
|
|
|
|
|
+ //fmt.Println(fromStr)
|
|
// 处理无效地址的情况
|
|
// 处理无效地址的情况
|
|
if !strings.Contains(fromStr, "@") {
|
|
if !strings.Contains(fromStr, "@") {
|
|
emailMessage.FromAddress = fromStr
|
|
emailMessage.FromAddress = fromStr
|
|
@@ -266,6 +282,9 @@ func readEveryMsg(msg *imap.Message) (emailMessage MailMessage, ok bool, err err
|
|
ok = false
|
|
ok = false
|
|
return
|
|
return
|
|
}
|
|
}
|
|
|
|
+ //fmt.Println("当前邮件Uid:", emailMessage.Uid)
|
|
|
|
+ //ok = false
|
|
|
|
+ //return
|
|
|
|
|
|
for {
|
|
for {
|
|
p, tmpErr := mr.NextPart()
|
|
p, tmpErr := mr.NextPart()
|