rule.go 2.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495
  1. package rule
  2. import (
  3. "github.com/Jinnrry/pmail/config"
  4. "github.com/Jinnrry/pmail/consts"
  5. "github.com/Jinnrry/pmail/db"
  6. "github.com/Jinnrry/pmail/dto"
  7. "github.com/Jinnrry/pmail/dto/parsemail"
  8. "github.com/Jinnrry/pmail/models"
  9. "github.com/Jinnrry/pmail/services/rule/match"
  10. "github.com/Jinnrry/pmail/utils/context"
  11. "github.com/Jinnrry/pmail/utils/send"
  12. log "github.com/sirupsen/logrus"
  13. "github.com/spf13/cast"
  14. "strings"
  15. )
  16. func GetAllRules(ctx *context.Context, userId int) []*dto.Rule {
  17. var res []*models.Rule
  18. var err error
  19. if userId == 0 {
  20. return nil
  21. } else {
  22. err = db.Instance.Where("user_id=?", userId).Decr("sort").Find(&res)
  23. }
  24. if err != nil {
  25. log.WithContext(ctx).Errorf("sqlERror :%v", err)
  26. }
  27. var ret []*dto.Rule
  28. for _, rule := range res {
  29. ret = append(ret, (&dto.Rule{}).Decode(rule))
  30. }
  31. return ret
  32. }
  33. func MatchRule(ctx *context.Context, rule *dto.Rule, email *parsemail.Email) bool {
  34. for _, r := range rule.Rules {
  35. var m match.Match
  36. switch r.Type {
  37. case match.RuleTypeRegex:
  38. m = match.NewRegexMatch(r.Field, r.Rule)
  39. case match.RuleTypeContains:
  40. m = match.NewContainsMatch(r.Field, r.Rule)
  41. case match.RuleTypeEq:
  42. m = match.NewEqualMatch(r.Field, r.Rule)
  43. }
  44. if m == nil {
  45. continue
  46. }
  47. if !m.Match(ctx, email) {
  48. return false
  49. }
  50. }
  51. return true
  52. }
  53. func DoRule(ctx *context.Context, rule *dto.Rule, email *parsemail.Email, user *models.User) {
  54. log.WithContext(ctx).Debugf("执行规则:%s", rule.Name)
  55. switch rule.Action {
  56. case dto.READ:
  57. if email.MessageId > 0 {
  58. _, err := db.Instance.Table(&models.UserEmail{}).Where("email_id=? and user_id=?", email.MessageId, rule.UserId).Cols("is_read").Update(map[string]interface{}{"is_read": 1})
  59. if err != nil {
  60. log.WithContext(ctx).Errorf("sqlERror :%v", err)
  61. }
  62. }
  63. case dto.DELETE:
  64. _, err := db.Instance.Table(&models.UserEmail{}).Where("email_id=? and user_id=?", email.MessageId, rule.UserId).Cols("status").Update(map[string]interface{}{"status": consts.EmailStatusDel})
  65. if err != nil {
  66. log.WithContext(ctx).Errorf("sqlERror :%v", err)
  67. }
  68. case dto.FORWARD:
  69. if strings.Contains(rule.Params, config.Instance.Domain) {
  70. log.WithContext(ctx).Errorf("Forward Error! loop forwarding!")
  71. return
  72. }
  73. err := send.Forward(ctx, email, rule.Params, user)
  74. if err != nil {
  75. log.WithContext(ctx).Errorf("Forward Error:%v", err)
  76. }
  77. case dto.MOVE:
  78. _, err := db.Instance.Table(&models.UserEmail{}).Where("email_id=? and user_id=?", email.MessageId, rule.UserId).Cols("group_id").Update(map[string]interface{}{"group_id": cast.ToInt(rule.Params)})
  79. if err != nil {
  80. log.WithContext(ctx).Errorf("sqlERror :%v", err)
  81. }
  82. }
  83. }