package repository import ( "fmt" "github.com/emersion/go-imap" "github.com/emersion/go-imap/client" "github.com/emersion/go-message/charset" "github.com/emersion/go-message/mail" "github.com/xuri/excelize/v2" "io" "io/ioutil" "log" "os" "path/filepath" "strconv" "strings" "testData/global" "testData/repository/report_reader" "testData/utils" "time" ) func Emails() { fmt.Println("Connecting to server...") // Connect to server c, err := client.DialTLS("imap.exmail.qq.com:993", nil) if err != nil { fmt.Println("连接IMAP服务器出错:", err) return } fmt.Println("Connected QQ Imap Receive Server(imap.exmail.qq.com)...") // Login if err = c.Login("data_analyse@tkplusemi.com", "Tkpluse123ip"); err != nil { fmt.Println("登陆IMAP服务器出错:", err) return } //if err := c.Login("jh_peng@tkplusemi.com", "Jimmy123"); err != nil { // log.Fatal(err) //} fmt.Println("Logged in...") global.IMAP = c // List mailboxes mailboxes := make(chan *imap.MailboxInfo, 10) done := make(chan error, 10) go func() { done <- global.IMAP.List("", "*", mailboxes) }() log.Println("Mailboxes:") for m := range mailboxes { fmt.Println("* " + m.Name) } if err := <-done; err != nil { fmt.Println(err) } // Select INBOX mbox, err := global.IMAP.Select("INBOX", false) if err != nil { fmt.Println(err) } fmt.Println("mbox:", mbox) //fmt.Println("Flags for INBOX:", mbox.Flags) // 创建搜索条件 criteria := imap.NewSearchCriteria() // 搜索未读标志的邮件 criteria.WithoutFlags = []string{"\\Seen"} // 获取未读标志邮件的UID ids, _ := global.IMAP.UidSearch(criteria) // 按UID获取邮件 seqset := new(imap.SeqSet) seqset.AddNum(ids...) // 获取邮件 messages := make(chan *imap.Message) section := imap.BodySectionName{} // 获取邮件标志, 内容 items := []imap.FetchItem{imap.FetchFlags, section.FetchItem()} done = make(chan error, len(ids)) go func() { // 按UID获取邮件 done <- global.IMAP.UidFetch(seqset, items, messages) }() imap.CharsetReader = charset.Reader for msg := range messages { start := time.Now() r := msg.GetBody(§ion) if r == nil { log.Println("服务器未返回邮件正文") } fmt.Printf("获取邮件内容耗时:%s\n", time.Now().Sub(start).String()) mr, err := mail.CreateReader(r) if err != nil { log.Fatal(err) } header := mr.Header var subject string var company string // 获取邮件发件人 if from, err := header.AddressList("From"); err == nil { fmt.Println(from[0].Address) startFrom := time.Now() address := from[0].Address if orgsender, err := header.AddressList("X-Qq-Csender"); err == nil { // X-Qq-Orgsender if len(orgsender) > 0 && orgsender[0].Address != "" { address = orgsender[0].Address } } if len(from) != 1 { fmt.Printf("当前邮件耗时:%s\n", time.Now().Sub(start).String()) fmt.Printf("当前邮件处理From耗时:%s\n", time.Now().Sub(startFrom).String()) continue } var needHandle bool if address == "crmic_smc_atm_zy@smc.crmicro.com" { // 获取邮件主题 if subject, err = header.Subject(); err == nil { if strings.Contains(subject, "J106397_FT") { company = "华润赛美科" needHandle = true } } } if !needHandle { fmt.Printf("当前邮件耗时:%s\n", time.Now().Sub(start).String()) fmt.Printf("当前邮件处理From耗时:%s\n", time.Now().Sub(startFrom).String()) continue } log.Println("From:", from) } // 处理邮件正文 for { p, err := mr.NextPart() if err == io.EOF { break } else if err != nil { log.Fatal("NextPart:err ", err) } switch h := p.Header.(type) { case *mail.AttachmentHeader: // 正文内附件 b, _ := ioutil.ReadAll(p.Body) filename, _ := h.Filename() var a []byte p.Body.Read(a) suffixIndex := strings.LastIndex(filename, ".") suffix := strings.ToLower(filename[suffixIndex:]) filename = filename[:suffixIndex] + suffix //if !strings.Contains(filename, ".xlsx") && !strings.Contains(filename, ".xls") && !strings.Contains(filename, ".CSV") { // continue //} if suffix != ".xlsx" && suffix != ".xls" && suffix != ".csv" { continue } // 根据公司名生成文件路径 folderPath := utils.MakeSavePath(company) var newFileName string if strings.Contains(filename, ".xlsx") { newFileName = filepath.Join(folderPath, time.Now().Format("20060102150405.xlsx")) f, _ := os.OpenFile(newFileName, os.O_RDWR|os.O_CREATE, 0766) _, err = f.Write(b) if err != nil { log.Println("download file", filename, "err") _ = os.Remove(filename) } f.Close() } else if strings.Contains(filename, ".xls") { newFileName = filepath.Join(folderPath, time.Now().Format("20060102150405.xls")) f, _ := os.OpenFile(newFileName, os.O_RDWR|os.O_CREATE, 0766) _, err = f.Write(b) if err != nil { log.Println("download file", filename, "err") _ = os.Remove(filename) } _ = f.Close() utils.ToXlsx("xls", newFileName) newFileName += ".xlsx" } else if strings.Contains(filename, ".csv") { newFileName = filepath.Join(folderPath, time.Now().Format("20060102150405.xlsx")) rows := strings.Split(string(b), "\r\n") f := excelize.NewFile() // 获取Sheet工作表名称 sheetName := f.GetSheetName(0) for i := 0; i < len(rows); i++ { columns := strings.Split(rows[i], ",") _ = f.SetSheetRow(sheetName, string(byte(65))+strconv.Itoa(i+1), &columns) } _ = f.SaveAs(newFileName) _ = f.Close() } // 处理Excel switch company { case "华润赛美科": report_reader.FTSMCReportReader(newFileName) } fmt.Printf("当前邮件耗时:%s\n", time.Now().Sub(start).String()) default: fmt.Printf("当前邮件耗时:%s\n", time.Now().Sub(start).String()) continue } } } // 添加标志 item := imap.FormatFlagsOp(imap.AddFlags, true) // 已读标志\Seen flags := []interface{}{imap.SeenFlag} // 将处理的未读邮件设置为已读 err = global.IMAP.UidStore(seqset, item, flags, nil) if err != nil { log.Println(err) } global.IMAP.Logout() }