Roc 2 周之前
父節點
當前提交
790e0e90a3
共有 3 個文件被更改,包括 81 次插入51 次删除
  1. 1 0
      models/report/outside_report_attachment.go
  2. 58 51
      services/pcsg/mail.go
  3. 22 0
      utils/common.go

+ 1 - 0
models/report/outside_report_attachment.go

@@ -66,4 +66,5 @@ type MailRule struct {
 	Author     string `json:"author"`
 	ClassifyId int    `json:"classify_id"`
 	Abstract   string `json:"abstract"`
+	RuleType   string `json:"rule_type"`
 }

+ 58 - 51
services/pcsg/mail.go

@@ -11,7 +11,6 @@ import (
 	"fmt"
 	"github.com/google/uuid"
 	"html"
-	"io/fs"
 	"log"
 	"os"
 	"path"
@@ -36,8 +35,9 @@ func ListenMail() {
 	//Fix()
 	//return
 	lockListenEmail.Lock()
+
 	// 目录创建
-	_ = ensureDirExists(fmt.Sprintf("%s%s", global.CONFIG.Serve.StaticDir, `file`))
+	_ = utils.EnsureDirExists(fmt.Sprintf("%s%s", global.CONFIG.Serve.StaticDir, `file`))
 
 	mailMessageChan := make(chan mail.MailMessage, 5) // 创建一个通道,用于接收邮件消息
 	mailMessageDoneChan := make(chan bool, 1)         // 创建一个通道,用于接收邮件消息
@@ -119,6 +119,12 @@ func afterByListen(mailMessageChan chan mail.MailMessage, mailMessageDoneChan ch
 	}
 }
 
+// handleMailMessage
+// @Description: 邮箱处理
+// @author: Roc
+// @datetime 2025-04-28 14:08:23
+// @param emailMessage mail.MailMessage
+// @return err error
 func handleMailMessage(emailMessage mail.MailMessage) (err error) {
 	defer func() {
 		if err != nil {
@@ -220,48 +226,62 @@ func handleMailMessage(emailMessage mail.MailMessage) (err error) {
 	for _, v := range ruleList {
 		tmpTitle := strings.ToLower(emailMessage.Title)
 		rule := strings.ToLower(v.Rule)
-		if strings.Contains(tmpTitle, rule) {
-			title = v.Title
-			abstract = v.Abstract
-			classifyId = v.ClassifyId
-			classify, e := report.GetClassifyByClassifyId(v.ClassifyId)
-			if e != nil {
-				err = e
-				global.FILE_LOG.Error("获取分类失败:", err)
-				return
+
+		// 规则类型校验
+		switch v.RuleType {
+		case `email`: // 邮箱号匹配
+			if strings.ToLower(emailMessage.FromAddress) != rule { // 如果邮箱号与规则不匹配,那么就过滤该规则
+				continue
+			}
+		default: // 默认标题匹配
+			if !strings.Contains(tmpTitle, rule) { // 如果标题与规则不匹配,那么就过滤该规则
+				continue
 			}
-			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 v.Author != `` {
-				if strings.Contains(v.Author, "@") {
-					sysUser, tmpErr := eta.GetSysUserByEmail(v.Author)
-					if tmpErr != nil && !utils.IsErrNoRow(tmpErr) {
-						err = tmpErr
-						return
-					}
-					if sysUser.AdminId > 0 {
-						sysUserId = sysUser.AdminId
-						sysUserName = sysUser.RealName
-					} else {
-						sysUserName = v.Author
-					}
+		}
+
+		// 配置了标题,那么就使用,否则就使用原标题
+		if v.Title != `` {
+			title = v.Title
+		}
+		abstract = v.Abstract
+		classifyId = v.ClassifyId
+		classify, e := report.GetClassifyByClassifyId(v.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 v.Author != `` {
+			if strings.Contains(v.Author, "@") {
+				sysUser, tmpErr := eta.GetSysUserByEmail(v.Author)
+				if tmpErr != nil && !utils.IsErrNoRow(tmpErr) {
+					err = tmpErr
+					return
+				}
+				if sysUser.AdminId > 0 {
+					sysUserId = sysUser.AdminId
+					sysUserName = sysUser.RealName
 				} else {
 					sysUserName = v.Author
 				}
+			} else {
+				sysUserName = v.Author
 			}
-
-			break
 		}
+
+		break
 	}
 
 	for k, v := range emailMessage.Resources {
@@ -343,16 +363,3 @@ func handleMailMessage(emailMessage mail.MailMessage) (err error) {
 
 	return
 }
-func ensureDirExists(dirPath string) error {
-	info, err := os.Stat(dirPath)
-	if err == nil {
-		if info.IsDir() {
-			return nil // 目录已存在
-		}
-		return fmt.Errorf("path '%s' exists but is not a directory", dirPath)
-	}
-	if os.IsNotExist(err) {
-		return os.MkdirAll(dirPath, fs.ModePerm)
-	}
-	return err
-}

+ 22 - 0
utils/common.go

@@ -10,8 +10,10 @@ import (
 	"github.com/astaxie/beego/logs"
 	"github.com/dgrijalva/jwt-go"
 	"gorm.io/gorm"
+	"io/fs"
 	"math"
 	"math/rand"
+	"os"
 	"os/exec"
 	"regexp"
 	"strconv"
@@ -977,3 +979,23 @@ func ContainsWholeWord(s string, word string) bool {
 	re := regexp.MustCompile(pattern)
 	return re.MatchString(s)
 }
+
+// EnsureDirExists
+// @Description: 目录创建
+// @author: Roc
+// @datetime 2025-04-28 14:08:02
+// @param dirPath string
+// @return error
+func EnsureDirExists(dirPath string) error {
+	info, err := os.Stat(dirPath)
+	if err == nil {
+		if info.IsDir() {
+			return nil // 目录已存在
+		}
+		return fmt.Errorf("path '%s' exists but is not a directory", dirPath)
+	}
+	if os.IsNotExist(err) {
+		return os.MkdirAll(dirPath, fs.ModePerm)
+	}
+	return err
+}