test_data/repository/email.go
2024-11-27 16:52:51 +08:00

232 lines
6.5 KiB
Go

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(&section)
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
}
}
} else if address == "jcet_mes_cj02@jcetglobal.com" {
// 获取邮件主题
if subject, err = header.Subject(); err == nil {
if strings.Contains(subject, "深圳思远_日报") {
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)
case "江苏长电科技":
report_reader.FTSuQianChangDianReportReader(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()
}