|
@@ -19,14 +19,14 @@ import (
|
|
|
)
|
|
|
|
|
|
type MailMessage struct {
|
|
|
- Date time.Time `description:"收件时间"`
|
|
|
- Uid uint32 `description:"该邮件在邮箱中的唯一id"`
|
|
|
- FromEmail string `description:"发件人邮箱"`
|
|
|
- From string `description:"发件人名称"`
|
|
|
- Title string `description:"邮件标题"`
|
|
|
- Content string `description:"邮件主体正文"`
|
|
|
- Resources map[string]string `description:"正文内嵌资源"`
|
|
|
- Attachment map[string]string `description:"附件资源"`
|
|
|
+ Date time.Time `description:"收件时间"`
|
|
|
+ Uid uint32 `description:"该邮件在邮箱中的唯一id"`
|
|
|
+ FromAddress string `description:"发件人邮箱"`
|
|
|
+ From string `description:"发件人名称"`
|
|
|
+ Title string `description:"邮件标题"`
|
|
|
+ Content string `description:"邮件主体正文"`
|
|
|
+ Resources map[string]string `description:"正文内嵌资源"`
|
|
|
+ Attachment map[string]string `description:"附件资源"`
|
|
|
}
|
|
|
|
|
|
func ListenMail(mailAddress, folder, userName, password string, readBatchSize, fromEmailIndex int, mailMessageChan chan MailMessage, mailMessageDoneChan chan bool) (err error) { // 收件箱
|
|
@@ -114,6 +114,7 @@ func ListenMail(mailAddress, folder, userName, password string, readBatchSize, f
|
|
|
from = to - maxNum + 1
|
|
|
}
|
|
|
}
|
|
|
+ //from = 310
|
|
|
|
|
|
step := uint32(5)
|
|
|
for i := from; i <= to; {
|
|
@@ -160,14 +161,16 @@ func ListenMail(mailAddress, folder, userName, password string, readBatchSize, f
|
|
|
os.Remove(v)
|
|
|
}
|
|
|
}
|
|
|
- global.FILE_LOG.Fatalf("读取邮件内容时出现错误:%v \n", tmpErr)
|
|
|
+ global.FILE_LOG.Errorf("读取邮件内容时出现错误:%v \n", tmpErr)
|
|
|
continue
|
|
|
}
|
|
|
- // 如果取到了,那么写入待处理chan
|
|
|
- if isRead {
|
|
|
- // 写入邮件处理chan
|
|
|
- mailMessageChan <- emailMessage
|
|
|
+ // 如果没有取到,那么就过滤
|
|
|
+ if !isRead {
|
|
|
+ continue
|
|
|
}
|
|
|
+ // 如果取到了,那么写入待处理chan
|
|
|
+ // 写入邮件处理chan
|
|
|
+ mailMessageChan <- emailMessage
|
|
|
}
|
|
|
|
|
|
//time.Sleep(time.Second * 5) // 休眠10秒
|
|
@@ -180,119 +183,6 @@ func ListenMail(mailAddress, folder, userName, password string, readBatchSize, f
|
|
|
return
|
|
|
}
|
|
|
|
|
|
-//func ListenMail(mailAddress, folder, userName, password string, readBatchSize int, mailMessageChan chan MailMessage, mailMessageDoneChan chan bool) (err error) { // 收件箱
|
|
|
-// defer func() {
|
|
|
-// if err != nil {
|
|
|
-// fmt.Println("err:", err.Error())
|
|
|
-// }
|
|
|
-// }()
|
|
|
-// // 建立与 IMAP 服务器的连接
|
|
|
-// c, err := client.DialTLS(mailAddress, nil)
|
|
|
-// if err != nil {
|
|
|
-// fmt.Printf("连接 IMAP 服务器失败: %+v \n", err)
|
|
|
-// return
|
|
|
-// }
|
|
|
-// // 最后一定不要忘记退出登录
|
|
|
-// defer func() {
|
|
|
-// _ = c.Logout()
|
|
|
-// }()
|
|
|
-//
|
|
|
-// // 登录
|
|
|
-// if err = c.Login(userName, password); err != nil {
|
|
|
-// fmt.Printf("邮箱[%s] 登录失败: %v \n", fmt.Sprintf("%s:%s", userName, mailAddress), err)
|
|
|
-// return
|
|
|
-// }
|
|
|
-// // 列出当前邮箱中的文件夹
|
|
|
-// mailboxes := make(chan *imap.MailboxInfo, 10)
|
|
|
-// done := make(chan error, 1) // 记录错误的 chan
|
|
|
-// go func() {
|
|
|
-// done <- c.List("", "*", mailboxes)
|
|
|
-// }()
|
|
|
-// log.Println("-->当前邮箱的文件夹 Mailboxes:")
|
|
|
-//
|
|
|
-// var folderExists bool
|
|
|
-// for m := range mailboxes {
|
|
|
-// log.Println("* ", m.Name)
|
|
|
-// if m.Name == folder {
|
|
|
-// folderExists = true
|
|
|
-// }
|
|
|
-// }
|
|
|
-//
|
|
|
-// if err := <-done; err != nil {
|
|
|
-// log.Fatalf("列出邮箱列表时,出现错误:%v \n", err)
|
|
|
-// }
|
|
|
-// log.Println("-->列出邮箱列表完毕!")
|
|
|
-// if !folderExists {
|
|
|
-// err = errors.New(fmt.Sprintf("文件夹[%s] 不存在 \n", folder))
|
|
|
-// return
|
|
|
-// }
|
|
|
-//
|
|
|
-// // 选择指定的文件夹
|
|
|
-// mbox, err := c.Select(folder, false)
|
|
|
-// if err != nil {
|
|
|
-// err = errors.New(fmt.Sprintf("选择邮件箱失败: %+v", err))
|
|
|
-// return
|
|
|
-// }
|
|
|
-// //log.Printf("mbox %+v \n", mbox)
|
|
|
-// log.Printf("当前文件夹[%s]中,总共有 %d 封邮件 \n", folder, mbox.Messages)
|
|
|
-// if mbox.Messages == 0 {
|
|
|
-// //log.Fatalf("当前文件夹[%s]中没有邮件", folder)
|
|
|
-// return
|
|
|
-// }
|
|
|
-//
|
|
|
-// // 创建一个序列集,用于批量读取邮件
|
|
|
-// seqSet := new(imap.SeqSet)
|
|
|
-//
|
|
|
-// // 假设需要获取最后4封邮件时
|
|
|
-// from := uint32(1)
|
|
|
-// to := mbox.Messages // 此文件下的邮件总数
|
|
|
-// if mbox.Messages > 2 {
|
|
|
-// from = mbox.Messages - 1
|
|
|
-// }
|
|
|
-// //from = mbox.Messages - 9
|
|
|
-// //to = mbox.Messages - 9
|
|
|
-// from = mbox.Messages
|
|
|
-// to = mbox.Messages
|
|
|
-// seqSet.AddRange(from, to) // 添加指定范围内的邮件编号
|
|
|
-//
|
|
|
-//
|
|
|
-//
|
|
|
-// // 获取整个消息正文
|
|
|
-// // imap.FetchEnvelope:请求获取邮件的信封数据(例如发件人、收件人、主题等元数据)。
|
|
|
-// // imap.FetchRFC822:请求获取完整的邮件内容,包括所有头部和正文。
|
|
|
-// items := []imap.FetchItem{imap.FetchFlags, imap.FetchEnvelope, imap.FetchRFC822}
|
|
|
-//
|
|
|
-// // 获取邮件内容 Start
|
|
|
-// messages := make(chan *imap.Message, readBatchSize) // 创建一个通道,用于接收邮件消息
|
|
|
-// fetchDone := make(chan error, 1) // 创建一个通道,用于接收错误消息
|
|
|
-// go func() {
|
|
|
-// // Fetch方法用于从服务器获取邮件数据,这里请求了邮件的信封和完整内容
|
|
|
-// fetchDone <- c.Fetch(seqSet, items, messages)
|
|
|
-// }()
|
|
|
-//
|
|
|
-// if err := <-fetchDone; err != nil {
|
|
|
-// log.Fatalf("获取邮件信息出现错误:%v \n", err)
|
|
|
-// }
|
|
|
-// // 获取邮件内容 End
|
|
|
-//
|
|
|
-// log.Println("开始读取邮件内容")
|
|
|
-// for msg := range messages {
|
|
|
-// mailMessage, tmpErr := readEveryMsg(msg)
|
|
|
-// if tmpErr != nil {
|
|
|
-// global.FILE_LOG.Fatalf("读取邮件内容时出现错误:%v \n", tmpErr)
|
|
|
-// continue
|
|
|
-// }
|
|
|
-// // 写入邮件处理chan
|
|
|
-// mailMessageChan <- emailMessage
|
|
|
-// }
|
|
|
-//
|
|
|
-// time.Sleep(time.Second * 5) // 休眠10秒
|
|
|
-//
|
|
|
-// log.Println("读取了所有邮件,完毕!")
|
|
|
-//
|
|
|
-// return
|
|
|
-//}
|
|
|
-
|
|
|
// document link: https://github.com/emersion/go-imap/wiki/Fetching-messages
|
|
|
func readEveryMsg(msg *imap.Message) (emailMessage MailMessage, ok bool, err error) {
|
|
|
ok = true
|
|
@@ -337,15 +227,23 @@ func readEveryMsg(msg *imap.Message) (emailMessage MailMessage, ok bool, err err
|
|
|
|
|
|
// 发件人
|
|
|
{
|
|
|
- from, err := mr.Header.AddressList("From")
|
|
|
- if err != nil {
|
|
|
- log.Println("发件人 异常:", err.Error())
|
|
|
- }
|
|
|
- if len(from) > 0 {
|
|
|
- emailMessage.FromEmail = from[0].Address
|
|
|
- emailMessage.From = from[0].Name
|
|
|
- //mailMessage.From = from[0].String()
|
|
|
- //log.Println("发件人 From:", from)
|
|
|
+ fromStr := mr.Header.Get("From")
|
|
|
+ fmt.Println(fromStr)
|
|
|
+ // 处理无效地址的情况
|
|
|
+ if !strings.Contains(fromStr, "@") {
|
|
|
+ emailMessage.FromAddress = fromStr
|
|
|
+ emailMessage.From = fromStr
|
|
|
+ } else {
|
|
|
+ from, tmpErr := mr.Header.AddressList("From")
|
|
|
+ if tmpErr != nil {
|
|
|
+ log.Println("发件人 异常:", err.Error())
|
|
|
+ }
|
|
|
+ if len(from) > 0 {
|
|
|
+ emailMessage.FromAddress = from[0].Address
|
|
|
+ emailMessage.From = from[0].Name
|
|
|
+ //mailMessage.From = from[0].String()
|
|
|
+ //log.Println("发件人 From:", from)
|
|
|
+ }
|
|
|
}
|
|
|
}
|
|
|
|
|
@@ -479,7 +377,7 @@ func isIgnore(emailMessage MailMessage) bool {
|
|
|
lowerFrom := strings.ToLower(emailMessage.From)
|
|
|
for _, email := range global.CONFIG.Email.IgnoreEmail {
|
|
|
if utils.ContainsWholeWord(lowerFrom, email) {
|
|
|
- global.FILE_LOG.Infof("发件人包含%s,过滤掉,标题:%s", email, emailMessage.From)
|
|
|
+ global.FILE_LOG.Infof("发件人包含%s,过滤掉,发件人:%s;标题:%s;所属下标:%d", email, emailMessage.From, emailMessage.Title, emailMessage.Uid)
|
|
|
return true
|
|
|
}
|
|
|
}
|
|
@@ -487,23 +385,23 @@ func isIgnore(emailMessage MailMessage) bool {
|
|
|
// 邮件标题中包含待过滤的字符串(大小写敏感的标题),那么就过滤
|
|
|
for _, email := range global.CONFIG.Email.IgnoreEmailCaseSensitive {
|
|
|
if utils.ContainsWholeWord(emailMessage.From, email) {
|
|
|
- global.FILE_LOG.Infof("发件人包含%s,过滤掉,标题:%s", email, emailMessage.From)
|
|
|
+ global.FILE_LOG.Infof("发件人包含%s,过滤掉,发件人:%s;标题:%s;所属下标:%d", email, emailMessage.From, emailMessage.Title, emailMessage.Uid)
|
|
|
return true
|
|
|
}
|
|
|
}
|
|
|
- // 发件人中包含待过滤的字符串,那么就过滤
|
|
|
- lowerFromAddress := strings.ToLower(emailMessage.FromEmail)
|
|
|
+ // 发件人地址中包含待过滤的字符串,那么就过滤
|
|
|
+ lowerFromAddress := strings.ToLower(emailMessage.FromAddress)
|
|
|
for _, emailAddress := range global.CONFIG.Email.IgnoreEmailAddress {
|
|
|
if utils.ContainsWholeWord(lowerFromAddress, emailAddress) {
|
|
|
- global.FILE_LOG.Infof("发件人邮箱包含%s,过滤掉,标题:%s", emailAddress, emailMessage.FromEmail)
|
|
|
+ global.FILE_LOG.Infof("发件人邮箱包含%s,过滤掉,发件人邮箱地址:%s;标题:%s;所属下标:%d", emailAddress, emailMessage.FromAddress, emailMessage.Title, emailMessage.Uid)
|
|
|
return true
|
|
|
}
|
|
|
}
|
|
|
|
|
|
- // 邮件标题中包含待过滤的字符串(大小写敏感的标题),那么就过滤
|
|
|
+ // 邮件地址中包含待过滤的字符串(大小写敏感的标题),那么就过滤
|
|
|
for _, emailAddress := range global.CONFIG.Email.IgnoreEmailAddressCaseSensitive {
|
|
|
- if utils.ContainsWholeWord(emailMessage.FromEmail, emailAddress) {
|
|
|
- global.FILE_LOG.Infof("发件人邮箱包含%s,过滤掉,标题:%s", emailAddress, emailMessage.FromEmail)
|
|
|
+ if utils.ContainsWholeWord(emailMessage.FromAddress, emailAddress) {
|
|
|
+ global.FILE_LOG.Infof("发件人邮箱包含%s,过滤掉,发件人邮箱地址:%s;标题:%s;所属下标:%d", emailAddress, emailMessage.FromAddress, emailMessage.Title, emailMessage.Uid)
|
|
|
return true
|
|
|
}
|
|
|
}
|
|
@@ -512,7 +410,7 @@ func isIgnore(emailMessage MailMessage) bool {
|
|
|
lowerTitle := strings.ToLower(emailMessage.Title)
|
|
|
for _, title := range global.CONFIG.Email.IgnoreEmailTitle {
|
|
|
if utils.ContainsWholeWord(lowerTitle, title) {
|
|
|
- global.FILE_LOG.Infof("邮件标题包含%s,过滤掉,标题:%s", title, emailMessage.Title)
|
|
|
+ global.FILE_LOG.Infof("邮件标题包含%s,过滤掉,标题:%s,所属下标:%d", title, emailMessage.Title, emailMessage.Uid)
|
|
|
return true
|
|
|
}
|
|
|
}
|
|
@@ -520,7 +418,7 @@ func isIgnore(emailMessage MailMessage) bool {
|
|
|
// 邮件标题中包含待过滤的字符串(大小写敏感的标题),那么就过滤
|
|
|
for _, title := range global.CONFIG.Email.IgnoreEmailTitleCaseSensitive {
|
|
|
if utils.ContainsWholeWord(emailMessage.Title, title) {
|
|
|
- global.FILE_LOG.Infof("邮件标题包含%s,过滤掉,标题:%s", title, emailMessage.Title)
|
|
|
+ global.FILE_LOG.Infof("邮件标题包含%s,过滤掉,标题:%s,所属下标:%d", title, emailMessage.Title, emailMessage.Uid)
|
|
|
return true
|
|
|
}
|
|
|
}
|