@@ -5,6 +5,11 @@ import (
55 "strings"
66)
77
8+ const (
9+ DefaultSenderBlacklistID = "default_sender_blacklist"
10+ DefaultSenderWhitelistID = "default_sender_whitelist"
11+ )
12+
813// FilterRule 是独立的邮件过滤规则,可被多个转发规则复用。
914type FilterRule struct {
1015 ID string `json:"id"`
@@ -48,6 +53,69 @@ func normalizeFilterRule(rule FilterRule) FilterRule {
4853 return rule
4954}
5055
56+ func ensureDefaultSenderFilterRulesNoLock () {
57+ ensureDefaultFilterRuleNoLock (FilterRule {
58+ ID : DefaultSenderBlacklistID ,
59+ Name : "默认发件人黑名单" ,
60+ Type : "sender" ,
61+ Mode : "blacklist" ,
62+ Patterns : []string {},
63+ Enabled : true ,
64+ })
65+ ensureDefaultFilterRuleNoLock (FilterRule {
66+ ID : DefaultSenderWhitelistID ,
67+ Name : "默认发件人白名单" ,
68+ Type : "sender" ,
69+ Mode : "whitelist" ,
70+ Patterns : []string {},
71+ Enabled : true ,
72+ })
73+ }
74+
75+ func ensureDefaultFilterRuleNoLock (rule FilterRule ) {
76+ rule = normalizeFilterRule (rule )
77+ for i , existing := range config .FilterRules {
78+ if existing .ID == rule .ID {
79+ existing .Name = rule .Name
80+ existing .Type = rule .Type
81+ existing .Mode = rule .Mode
82+ config .FilterRules [i ] = normalizeFilterRule (existing )
83+ return
84+ }
85+ }
86+ config .FilterRules = append (config .FilterRules , rule )
87+ }
88+
89+ func addSenderToDefaultFilterRuleNoLock (mode string , sender string ) (FilterRule , bool ) {
90+ sender = strings .TrimSpace (sender )
91+ if sender == "" {
92+ return FilterRule {}, false
93+ }
94+
95+ ruleID := DefaultSenderBlacklistID
96+ if mode == "whitelist" {
97+ ruleID = DefaultSenderWhitelistID
98+ }
99+ ensureDefaultSenderFilterRulesNoLock ()
100+
101+ for i , rule := range config .FilterRules {
102+ if rule .ID != ruleID {
103+ continue
104+ }
105+ rule = normalizeFilterRule (rule )
106+ for _ , pattern := range rule .Patterns {
107+ if strings .EqualFold (pattern , sender ) {
108+ config .FilterRules [i ] = rule
109+ return rule , false
110+ }
111+ }
112+ rule .Patterns = append (rule .Patterns , sender )
113+ config .FilterRules [i ] = normalizeFilterRule (rule )
114+ return config .FilterRules [i ], true
115+ }
116+ return FilterRule {}, false
117+ }
118+
51119func applyFilterRules (ids []string , rules map [string ]FilterRule , msg * Message ) filterResult {
52120 for _ , id := range ids {
53121 rule , ok := rules [id ]
0 commit comments