使用 exim ACL 拒絕包含許多收件人/抄送收件人的電子郵件
我在通過我的郵件伺服器發送許多 (>20) 收件人或抄送收件人的電子郵件時遇到問題。更糟糕的是,這些是郵件列表,因此可以接觸到數百人。然後人們回复-所有引起惱人的大量消息。
使用者教育不是一種選擇(他們是故意這樣做的)。我可以在郵件伺服器中過濾這些郵件嗎?例如,使用 Exim ACL。
recipient_max
不是一種選擇,因為這也會限制Bcc
應該通過的 ’ed 郵件。
首先,重要的是您要了解客戶可以發送一封在 To 標頭中包含 1 個地址的電子郵件,但如果他們知道如何恰到好處地濫用它,他們實際上會將其發送給 1000 人。計算 To: 或 Cc: 標頭中的電子郵件地址數量並不能保證您會阻止客戶發送的電子郵件。如果他們以幼稚的方式濫用您的系統,您只會阻止他們的電子郵件。但是,您說他們只是將所有內容都放在 To 欄位中(即天真的方式),因此該答案的其餘部分假定這是將數據送出到您的 Exim 伺服器的方式。
現在,按照您的要求直接回答您的問題:在 DATA ACL 中(僅在 DATA ACL 中!),您可以通過兩步過程檢查 To 或 Cc 標頭中的電子郵件地址數量。要測試這些標頭,您可以使用 $ h_To: and $ h_Cc:尾隨冒號是必需的。假設 To: 標頭是:
"Org user" <todd@example.org>,<tlyons@example.com>,"Todd Lyons" <todd@example.net>
通過此範例,我將向您展示兩步過程的每個步驟的作用:
# Step 1: To header converted to a (colon-separated) list $ exim -be '${addresses:"Org user" <todd@example.org>,<tlyons@example.com>,"Todd Lyons" <todd@example.net>}' todd@example.org:tlyons@example.com:todd@example.net # step 2: Now count the number of list items $ exim -be '${listcount:${addresses:"Org user" <todd@example.org>,<tlyons@example.com>,"Todd Lyons" <todd@example.net>}}' 3
使用目前版本的 exim (4.82),這最終在您的 DATA ACL 中將如下所示:
deny message = Too many recipients condition = ${if >{ ${listcount:${addresses:$h_To:,$h_Cc:}} }{10} {yes}{no}}
如果您使用的是舊版本,例如 Debian stable 中的版本,您可以使用舊版本迭代列表並增加計數器:
deny message = Too many recipients condition = ${if >{ ${reduce {${addresses:$h_To:,$h_Cc:}} {0} {${eval:$value+1}}}} {10} {yes}{no}}
請注意,在上述兩種情況下,{yes}{no} 部分都是多餘的。${if…} 語句的返回始終是真或假,因此考慮到這一點,您可以根據需要將其關閉。我更喜歡明確地放入它,因為它使它更具可讀性(對我以及任何可能跟隨我並且必須閱讀此程式碼的人)。