一、使用的模塊
"github.com/emersion/go-imap" // 讀取郵件 "github.com/emersion/go-imap/client" // 連接
"github.com/emersion/go-message" // 解析郵件
二、代碼package main.go
package main import ( "fmt" "io" "io/ioutil" "net" "time" "gitea.com/lunny/log" "github.com/emersion/go-imap" id "github.com/emersion/go-imap-id" "github.com/emersion/go-imap/client" _ "github.com/emersion/go-message/charset" "github.com/emersion/go-message/mail" ) // 登錄函數 func loginEmail(Eserver, UserName, Password string) (*client.Client, error) { dial := new(net.Dialer) dial.Timeout = time.Duration(3) * time.Second c, err := client.DialWithDialerTLS(dial, Eserver, nil) if err != nil { c, err = client.DialWithDialer(dial, Eserver) // 非加密登錄 } if err != nil { return nil, err } //登陸 if err = c.Login(UserName, Password); err != nil { return nil, err } return c, nil } func parseEmail(mr *mail.Reader) (body []byte, fileMap map[string][]byte) { for { p, err := mr.NextPart() if err == io.EOF { break } else if err != nil { break } if p != nil { switch h := p.Header.(type) { case *mail.InlineHeader: body, err = ioutil.ReadAll(p.Body) if err != nil { fmt.Println("read body err:", err.Error()) } case *mail.AttachmentHeader: fileName, _ := h.Filename() fileContent, _ := ioutil.ReadAll(p.Body) fileMap[fileName] = fileContent } } } return } func emailListByUid(Eserver, UserName, Password string) (err error) { c, err := loginEmail(Eserver, UserName, Password) if err != nil { log.Info("login:", err) return } idClient := id.NewClient(c) idClient.ID( id.ID{ id.FieldName: "IMAPClient", id.FieldVersion: "2.1.0", }, ) defer c.Close() mailboxes := make(chan *imap.MailboxInfo, 10) mailboxeDone := make(chan error, 1) go func() { mailboxeDone <- c.List("", "*", mailboxes) }() for box := range mailboxes { fmt.Println("切換目錄:", box.Name) mbox, err := c.Select(box.Name, false) // 選擇收件箱 if err != nil { fmt.Println("select inbox err: ", err) continue } if mbox.Messages == 0 { continue } // 選擇收取郵件的時間段 criteria := imap.NewSearchCriteria() // 收取7天之內的郵件 criteria.Since = time.Now().Add(-7 * time.Hour * 24) // 按條件查詢郵件 ids, err := c.UidSearch(criteria) fmt.Println(len(ids)) if err != nil { continue } if len(ids) == 0 { continue } seqset := new(imap.SeqSet) seqset.AddNum(ids...) sect := &imap.BodySectionName{Peek: true} messages := make(chan *imap.Message, 100) messageDone := make(chan error, 1) go func() { messageDone <- c.UidFetch(seqset, []imap.FetchItem{sect.FetchItem()}, messages) }() for msg := range messages { r := msg.GetBody(sect) mr, err := mail.CreateReader(r) if err != nil { fmt.Println(err) continue } header := mr.Header fmt.Println(header.Subject()) _, fileName := parseEmail(mr) for k, _ := range fileName { fmt.Println("收取到附件:", k) } } } return }
三、說明
部分內容參考了其他博主的代碼,如有侵權,請聯系我!
