Roc преди 1 месец
родител
ревизия
4ae6339e51
променени са 4 файла, в които са добавени 74 реда и са изтрити 2 реда
  1. 45 0
      models/report/outside_email_base_info.go
  2. 23 0
      services/pcsg/mail.go
  3. 2 0
      utils/mail/charset_reader.go
  4. 4 2
      utils/mail/imap.go

+ 45 - 0
models/report/outside_email_base_info.go

@@ -0,0 +1,45 @@
+package report
+
+import (
+	"eta/eta_email_analysis/global"
+	"time"
+)
+
+type OutsideEmailBaseInfo struct {
+	Id              int32     `gorm:"column:id;type:int(10) UNSIGNED;primaryKey;not null;" json:"id"`
+	Folder          string    `gorm:"column:folder;type:varchar(255);comment:所属文件夹;" json:"folder"`                           // 所属文件夹
+	EmailMessageUid uint32    `gorm:"column:email_message_uid;type:int(10);comment:邮件id;default:0;" json:"email_message_uid"` // 邮件id
+	Title           string    `gorm:"column:title;type:varchar(512);comment:邮件主题;" json:"title"`                              // 邮件主题
+	FromAddress     string    `gorm:"column:from_address;type:varchar(255);comment:发件人邮箱;" json:"from_address"`               // 发件人邮箱
+	From            string    `gorm:"column:from;type:varchar(255);comment:发件人名称;" json:"from"`                               // 发件人名称
+	DeliveryTime    time.Time `gorm:"column:delivery_time;type:datetime;comment:收件时间;default:NULL;" json:"delivery_time"`     // 收件时间
+	CreateTime      time.Time `gorm:"column:create_time;type:datetime;comment:添加时间;default:NULL;" json:"create_time"`         // 添加时间
+}
+
+// TableName get sql table name.获取数据库表名
+func (m *OutsideEmailBaseInfo) TableName() string {
+	return "outside_email_base_info"
+}
+
+// GetByEmailMessageIdAndFolder
+// @Description: 根据邮件id和文件夹获取邮件基本信息
+// @author: Roc
+// @datetime 2024-09-14 17:49:35
+// @param emailMessageUid uint32
+// @return item *OutsideReport
+// @return err error
+func (m *OutsideEmailBaseInfo) GetByEmailMessageIdAndFolder(emailMessageUid uint32, folder string) (item *OutsideEmailBaseInfo, err error) {
+	err = global.DEFAULT_MYSQL.Where("email_message_uid = ? AND folder = ? ", emailMessageUid, folder).First(&item).Error
+	return
+}
+
+// Add
+// @Description: 新增邮件基础信息
+// @author: Roc
+// @datetime 2024-09-14 16:23:32
+// @param item *OutsideReport
+// @return err error
+func (m *OutsideEmailBaseInfo) Add(item *OutsideEmailBaseInfo) (err error) {
+	err = global.DEFAULT_MYSQL.Create(item).Error
+	return
+}

+ 23 - 0
services/pcsg/mail.go

@@ -133,6 +133,29 @@ func handleMailMessage(emailMessage mail.MailMessage) (err error) {
 			os.Remove(v)
 		}
 	}()
+
+	// 记录邮件信息
+	{
+		obj := new(report.OutsideEmailBaseInfo)
+		outEmail, _ := obj.GetByEmailMessageIdAndFolder(emailMessage.Uid, emailMessage.Folder)
+		if outEmail == nil || outEmail.EmailMessageUid <= 0 {
+			obj = &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(obj)
+			if tmpErr != nil {
+				global.FILE_LOG.Error("保存邮件基础信息失败:" + tmpErr.Error())
+			}
+		}
+	}
+
 	//rootPath := `C:\Users\123\go\src\eta\eta_email_analysis\static\`
 	ossClient := oss.NewOssClient()
 	//fmt.Println(emailMessage.Title)

+ 2 - 0
utils/mail/charset_reader.go

@@ -62,6 +62,8 @@ var charsetMap = map[string]transform.Transformer{
 	"ks_c_5601-1987": korean.EUCKR.NewDecoder(),
 	"euc-kr":         korean.EUCKR.NewDecoder(),
 	"big5":           traditionalchinese.Big5.NewDecoder(),
+	"us-ascii":       charmap.Windows1252.NewDecoder(), // ASCII 使用 Windows-1252 解码器
+	"ascii":          charmap.Windows1252.NewDecoder(),
 }
 
 // 定义一个自定义的 CharsetReader 函数,它能够处理 gb2312 和 gbk 字符集

+ 4 - 2
utils/mail/imap.go

@@ -26,6 +26,7 @@ type MailMessage struct {
 	From        string            `description:"发件人名称"`
 	Title       string            `description:"邮件标题"`
 	Content     string            `description:"邮件主体正文"`
+	Folder      string            `description:"所属文件夹"`
 	Resources   map[string]string `description:"正文内嵌资源"`
 	Attachment  map[string]string `description:"附件资源"`
 }
@@ -160,7 +161,7 @@ func ListenMail(mailAddress, folder, userName, password string, readBatchSize, f
 				continue
 			}
 
-			emailMessage, isRead, tmpErr := readEveryMsg(msg)
+			emailMessage, isRead, tmpErr := readEveryMsg(msg, folder)
 			if tmpErr != nil {
 				// 移除本地文件
 				{
@@ -204,7 +205,7 @@ func ListenMail(mailAddress, folder, userName, password string, readBatchSize, f
 }
 
 // document link: https://github.com/emersion/go-imap/wiki/Fetching-messages
-func readEveryMsg(msg *imap.Message) (emailMessage MailMessage, ok bool, err error) {
+func readEveryMsg(msg *imap.Message, folder string) (emailMessage MailMessage, ok bool, err error) {
 	ok = true
 	defer func() {
 		if err != nil {
@@ -217,6 +218,7 @@ func readEveryMsg(msg *imap.Message) (emailMessage MailMessage, ok bool, err err
 	emailMessage.Attachment = make(map[string]string) // 附件
 
 	emailMessage.Uid = msg.Uid
+	emailMessage.Folder = folder
 	if IsHandleMessageIdMap != nil {
 		if _, has := IsHandleMessageIdMap[int(emailMessage.Uid)]; has {
 			fmt.Println("邮件已处理,邮件下标:", emailMessage.Uid)