221 lines
6.1 KiB
Go
221 lines
6.1 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("wip@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()
|
|
}
|