Roc 2 luni în urmă
părinte
comite
c723abf337
3 a modificat fișierele cu 289 adăugiri și 52 ștergeri
  1. 10 0
      models/report/outside_report.go
  2. 141 18
      services/pcsg/fix.go
  3. 138 34
      utils/mail/fix.go

+ 10 - 0
models/report/outside_report.go

@@ -174,3 +174,13 @@ func GetMailOutsideReportHistory3() (items []*OutsideReport, err error) {
 
 	return
 }
+
+// GetOutsideReportListByCondition
+// @Description: 获取没有用户的信息
+// @return items
+// @return err
+func GetOutsideReportListByCondition(condition string, pars []interface{}) (items []*OutsideReport, err error) {
+	err = global.DEFAULT_MYSQL.Where(" 1 = 1 "+condition, pars...).Find(&items).Error
+
+	return
+}

+ 141 - 18
services/pcsg/fix.go

@@ -15,7 +15,7 @@ import (
 	"strings"
 )
 
-func Fix() {
+func FixEmailBaseInfo() {
 	mailAddress := fmt.Sprintf("%s:%d", global.CONFIG.Email.Host, global.CONFIG.Email.Port)
 
 	// 建立与 IMAP 服务器的连接
@@ -63,7 +63,7 @@ func Fix() {
 	}
 
 	// 选择指定的文件夹
-	mbox, err := c.Select(global.CONFIG.Email.Folder, false)
+	mbox, err := c.Select(global.CONFIG.Email.Folder, true)
 	if err != nil {
 		err = errors.New(fmt.Sprintf("选择邮件箱失败: %+v", err))
 		return
@@ -75,25 +75,13 @@ func Fix() {
 		return
 	}
 
-	list, err := report.GetNoSysUserNameOutsideReport()
+	to := mbox.Messages // 此文件下的邮件总数
+
+	err = mail.ListenMailV2(c, to)
 	if err != nil {
-		fmt.Println("获取没有用户的信息失败:", err)
-		return
+		fmt.Println("处理失败:", err)
 	}
 
-	for _, v := range list {
-		_, fromName, tmpErr := mail.ListenMailV2(c, v.EmailMessageUID)
-		if tmpErr != nil {
-			fmt.Println(v.Title, ",获取失败:", tmpErr)
-			continue
-		}
-		v.SysUserName = fromName
-		tmpErr = v.Update([]string{"SysUserName"})
-		if tmpErr != nil {
-			fmt.Println(v.Title, ",更新信息失败:", tmpErr)
-			continue
-		}
-	}
 }
 
 func FixHistory() {
@@ -422,3 +410,138 @@ func FixHistory1226() {
 		}
 	}
 }
+
+func FixUserName() {
+	var condition string
+	var pars []interface{}
+	idList := []int{409, 398, 395, 406, 411, 404, 402, 397, 410, 403, 407, 391, 392, 393, 394, 390, 388, 389, 396, 399, 400, 401, 405, 408, 415, 416}
+	condition += " AND classify_id IN ? "
+	pars = append(pars, idList)
+
+	list, err := report.GetOutsideReportListByCondition(condition, pars)
+	if err != nil {
+		fmt.Println("获取报告失败:", err)
+		return
+	}
+
+	obj := report.OutsideEmailBaseInfo{}
+	for _, v := range list {
+		// 没有id就忽略
+		if v.EmailMessageUID <= 0 {
+			continue
+		}
+		emailMessage, err := obj.GetByEmailMessageIdAndFolder(uint32(v.EmailMessageUID), "INBOX")
+		if err != nil {
+			fmt.Println("查找邮件失败:", err)
+			continue
+		}
+
+		title := emailMessage.Title
+		var abstract string
+		var classifyId int
+		var classifyName string
+		var sysUserId int
+		var sysUserName string
+
+		sysUserName = emailMessage.FromAddress
+		// 查找用户
+		if emailMessage.From != `` {
+			tmpEmailStrList := strings.Split(sysUserName, "<")
+			if len(tmpEmailStrList) >= 2 {
+				sysUserName = tmpEmailStrList[1]
+				tmpEmailStrList = strings.Split(sysUserName, ">")
+				if len(tmpEmailStrList) >= 2 {
+					sysUserName = tmpEmailStrList[0]
+				}
+			}
+			sysUser, tmpErr := eta.GetSysUserByEmail(sysUserName)
+			if tmpErr != nil && !utils.IsErrNoRow(tmpErr) {
+				err = tmpErr
+				return
+			}
+			if tmpErr == nil {
+				sysUserId = sysUser.AdminId
+				sysUserName = sysUser.RealName
+			}
+		}
+		title = strings.Replace(title, "[PCI ANALYTICS CLOUD PLATFORM(00) Fwd] - ", "", -1)
+
+		for _, ruleInfo := range ruleList {
+			tmpTitle := strings.ToLower(emailMessage.Title)
+			rule := strings.ToLower(ruleInfo.Rule)
+			if strings.Contains(tmpTitle, rule) {
+				title = ruleInfo.Title
+				abstract = ruleInfo.Abstract
+				classifyId = ruleInfo.ClassifyId
+				classify, e := report.GetClassifyByClassifyId(ruleInfo.ClassifyId)
+				if e != nil {
+					err = e
+					global.FILE_LOG.Error("获取分类失败:", err)
+					return
+				}
+				classifyName = classify.ClassifyName
+
+				// 特殊规则
+				//if strings.Contains(title, "海外分公司市场信息月报") || strings.Contains(title, "区域市场信息月报") {
+				//	if emailMessage.From == "report.pcanalyst00@petrochina-usa.com" {
+				//		sysUserName = "PCI"
+				//		break
+				//	} else {
+				//		v.Author = emailMessage.From
+				//	}
+				//}
+
+				if ruleInfo.Author != `` {
+					if strings.Contains(ruleInfo.Author, "@") {
+						sysUser, tmpErr := eta.GetSysUserByEmail(ruleInfo.Author)
+						if tmpErr != nil && !utils.IsErrNoRow(tmpErr) {
+							err = tmpErr
+							return
+						}
+						if sysUser.AdminId > 0 {
+							sysUserId = sysUser.AdminId
+							sysUserName = sysUser.RealName
+						} else {
+							sysUserName = ruleInfo.Author
+						}
+					} else {
+						sysUserName = ruleInfo.Author
+					}
+				}
+
+				break
+			}
+		}
+
+		updateCols := make([]string, 0)
+		if v.SysUserID != sysUserId {
+			v.SysUserID = sysUserId
+			updateCols = append(updateCols, "sys_user_id")
+		}
+		if v.SysUserName != sysUserName {
+			v.SysUserName = sysUserName
+			updateCols = append(updateCols, "sys_user_name")
+		}
+		if v.Abstract != abstract {
+			v.Abstract = abstract
+			updateCols = append(updateCols, "abstract")
+		}
+		if v.ClassifyID != classifyId {
+			v.ClassifyID = classifyId
+			updateCols = append(updateCols, "classify_id")
+		}
+		if v.ClassifyName != classifyName {
+			v.ClassifyName = classifyName
+			updateCols = append(updateCols, "classify_name")
+		}
+
+		if len(updateCols) > 0 {
+			err = v.Update(updateCols)
+			if err != nil {
+				fmt.Println(v.OutsideReportID, "更新失败:", err)
+			}
+		}
+	}
+
+	fmt.Println("修复完成")
+}

+ 138 - 34
utils/mail/fix.go

@@ -3,49 +3,125 @@ package mail
 import (
 	"errors"
 	"eta/eta_email_analysis/global"
+	"eta/eta_email_analysis/models/report"
 	"fmt"
 	"github.com/emersion/go-imap"
 	"github.com/emersion/go-imap/client"
+	"github.com/emersion/go-message"
 	"github.com/emersion/go-message/mail"
 	"log"
 	"strings"
+	"time"
 )
 
-func ListenMailV2(c *client.Client, index int) (fromAddress, fromName string, err error) { // 收件箱
+func ListenMailV2(c *client.Client, to uint32) (err error) { // 收件箱
+	obj := new(report.OutsideEmailBaseInfo)
 	// 创建一个序列集,用于批量读取邮件
 	seqSet := new(imap.SeqSet)
-	seqSet.AddRange(uint32(index), uint32(index)) // 添加指定范围内的邮件编号
-
-	// 获取整个消息正文
-	// imap.FetchEnvelope:请求获取邮件的信封数据(例如发件人、收件人、主题等元数据)。
-	// imap.FetchRFC822:请求获取完整的邮件内容,包括所有头部和正文。
-	items := []imap.FetchItem{imap.FetchFlags, imap.FetchEnvelope, imap.FetchRFC822}
-
-	// 获取邮件内容 Start
-	messages := make(chan *imap.Message, 5) // 创建一个通道,用于接收邮件消息
-	fetchDone := make(chan error, 1)        // 创建一个通道,用于接收错误消息
-	go func() {
-		// Fetch方法用于从服务器获取邮件数据,这里请求了邮件的信封和完整内容
-		fetchDone <- c.Fetch(seqSet, items, messages)
-	}()
-
-	err = <-fetchDone
-	if err != nil {
-		global.LOG.Errorf("获取邮件信息出现错误:%v \n", err)
-		return
-	}
-	// 获取邮件内容 End
 
-	//log.Println("开始读取邮件内容")
-	for msg := range messages {
-		return readEveryMsgV2(msg)
+	var isStopFor bool
+	step := uint32(1)
+	for i := to; i >= 1; {
+		start := i - step + 1
+		if start < 0 {
+			start = 1
+		}
+
+		//fmt.Printf("当前剩余%d封邮件待处理\n", i-minIndex+1)
+
+		seqSet.Clear()
+		seqSet.AddRange(start, i) // 添加指定范围内的邮件编号
+
+		// 获取整个消息正文
+		// imap.FetchEnvelope:请求获取邮件的信封数据(例如发件人、收件人、主题等元数据)。
+		// imap.FetchRFC822:请求获取完整的邮件内容,包括所有头部和正文。
+		items := []imap.FetchItem{imap.FetchFlags, imap.FetchEnvelope, imap.FetchRFC822}
+
+		// 获取邮件内容 Start
+		messages := make(chan *imap.Message, global.CONFIG.Email.ReadBatchSize) // 创建一个通道,用于接收邮件消息
+		fetchDone := make(chan error, 1)                                        // 创建一个通道,用于接收错误消息
+		go func() {
+			// Fetch方法用于从服务器获取邮件数据,这里请求了邮件的信封和完整内容
+			fetchDone <- c.Fetch(seqSet, items, messages)
+		}()
+
+		err = <-fetchDone
+		if err != nil {
+			global.LOG.Errorf("获取邮件信息出现错误:%v \n", err)
+			return
+		}
+		// 获取邮件内容 End
+
+		//log.Println("开始读取邮件内容")
+		for msg := range messages {
+			// 如果需要终止,那么就不处理了
+			if isStopFor {
+				continue
+			}
+
+			emailMessage, isRead, tmpErr := readEveryMsgV2(msg)
+			if tmpErr != nil {
+				continue
+			}
+			if !isRead {
+				continue
+			}
+
+			// 记录邮件信息
+			{
+				outEmail, _ := obj.GetByEmailMessageIdAndFolder(emailMessage.Uid, emailMessage.Folder)
+				if outEmail == nil || outEmail.EmailMessageUid <= 0 {
+					outsideEmail := &report.OutsideEmailBaseInfo{
+						Id:              0,
+						Folder:          emailMessage.Folder,
+						EmailMessageUid: emailMessage.Uid,
+						Title:           emailMessage.Title,
+						FromAddress:     emailMessage.FromAddress,
+						From:            emailMessage.From,
+						DeliveryTime:    emailMessage.Date,
+						CreateTime:      time.Now(),
+					}
+					tmpErr := obj.Add(outsideEmail)
+					if tmpErr != nil {
+						fmt.Println("保存邮件基础信息失败:" + tmpErr.Error())
+					}
+				}
+			}
+
+		}
+
+		if isStopFor {
+			// 已经找到了最小的邮件id,那么就退出循环了
+		}
+		//time.Sleep(time.Second * 5) // 休眠10秒
+
+		i = i - step
 	}
 
+	log.Println("读取了所有邮件,完毕!")
+
 	return
 }
 
 // document link: https://github.com/emersion/go-imap/wiki/Fetching-messages
-func readEveryMsgV2(msg *imap.Message) (fromAddress, fromName string, err error) {
+func readEveryMsgV2(msg *imap.Message) (emailMessage MailMessage, ok bool, err error) {
+	emailMessage = MailMessage{}
+
+	message.CharsetReader = myCharsetReader
+	emailMessage.Resources = make(map[string]string)  // 内嵌资源
+	emailMessage.Attachment = make(map[string]string) // 附件
+
+	emailMessage.Uid = msg.Uid
+	emailMessage.Folder = global.CONFIG.Email.Folder
+	if IsHandleMessageIdMap != nil {
+		if _, has := IsHandleMessageIdMap[int(emailMessage.Uid)]; has {
+			fmt.Println("邮件已处理,邮件下标:", emailMessage.Uid)
+			return
+		}
+	}
+
+	//log.Printf("当前邮件的消息序列号 %+v \n", msg.SeqNum)
+	//log.Println("-------------------------")
 	// 获取邮件正文
 	r := msg.GetBody(&imap.BodySectionName{})
 	if r == nil {
@@ -59,31 +135,59 @@ func readEveryMsgV2(msg *imap.Message) (fromAddress, fromName string, err error)
 		return
 	}
 
+	// 收件时间
+	{
+		date, err := mr.Header.Date()
+		if err != nil {
+			log.Println("收件时间 异常:", err.Error())
+		}
+		emailMessage.Date = date
+		//log.Println("收件时间 Date:", date)
+	}
+
 	// 发件人
 	{
 		fromStr := mr.Header.Get("From")
 		//fmt.Println(fromStr)
 		// 处理无效地址的情况
 		if !strings.Contains(fromStr, "@") {
-			fromStr = strings.TrimSpace(fromStr)
-			fromStr = strings.TrimPrefix(fromStr, `"`)
-			fromStr = strings.TrimSuffix(fromStr, `"`)
-			//fmt.Println(fromStr)
-			fromAddress = fromStr
-			fromName = 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 {
-				fromAddress = from[0].Address
-				fromName = from[0].Name
+				emailMessage.FromAddress = from[0].Address
+				emailMessage.From = from[0].Name
 				//mailMessage.From = from[0].String()
 				//log.Println("发件人 From:", from)
 			}
 		}
 	}
 
+	//if to, err := mr.Header.AddressList("To"); err == nil {
+	//	log.Println("收件人 To:", to)
+	//}
+	//log.Printf("抄送 Cc: %+v \n", msg.Envelope.Cc)
+
+	// 邮件标题
+	subject, err := mr.Header.Subject()
+	if err != nil {
+		log.Println("邮件主题 Subject ERR:", err)
+	} else {
+		//log.Println("邮件主题 Subject:", subject)
+	}
+	emailMessage.Title = subject
+
+	// 过滤
+	if isIgnore(emailMessage) {
+		ok = false
+		return
+	}
+
+	ok = true
+
 	return
 }