是否可以拒絕 procmail 中的某些電子郵件?一世小號_米噸磷sessionrejectsbasedonemailcontent一世n小號米噸磷s和ss一世這nr和j和C噸sb一種s和d這n和米一種一世lC這n噸和n噸In SMTP s…
讓我們假設一個典型的設置,其中從 sendmail 呼叫 procmail 以將傳入的電子郵件過濾到正確的郵箱中。是在與 sendmail 的傳入 SMTP 連接仍處於活動狀態時完成,還是在電子郵件已被接受後完成?
如果是前者,那麼我理解 procmail 可能會返回到 sendmail 一個錯誤,以便 sendmail 回復一個錯誤程式碼,例如
554 Transaction failed
在接受SMTP DATA時,而不是通常的 200?在我的例子中,sendmail 從別名數據庫呼叫 procmail,條目如下:
theaddres: theaddres-somedomain-com.virtual theaddres-somedomain-com.virtual: |"/usr/libexec/sm.bin/someuser.virtual somedomain@theaddress"
然後執行 procmail 腳本:
root@mda:/etc/mail # less /usr/libexec/sm.bin/someuser.virtual /usr/local/bin/procmail -a $1 /usr/local/etc/procmailrc/someuser.virtual
編輯:
添加更詳細的解釋。首先,我想確定下面概述的基於維基百科範例的流程在 SMTP 協議中是否可行。如果是,那麼是否可以使用 procmail。然後,如果沒有(我猜是這種情況),是否存在可能的實現(例如 milter)。
S: 220 smtp.example.com ESMTP Postfix C: HELO relay.example.org S: 250 Hello relay.example.org, I am glad to meet you C: MAIL FROM:<bob@example.org> S: 250 Ok C: RCPT TO:<alice@example.com> S: 250 Ok C: RCPT TO:<theboss@example.com> S: 250 Ok C: DATA S: 354 End data with <CR><LF>.<CR><LF> C: From: "Bob Example" <bob@example.org> C: To: "Alice Example" <alice@example.com> C: Cc: theboss@example.com C: Date: Tue, 15 January 2008 16:02:43 -0500 C: Subject: Test message C: C: Hello Alice. C: This is a test message with 5 header fields and 4 lines in the message body. Now this is what I would like to see: S (after receiving the first 2 lines out of 4): 452 Requested action not taken: insufficient system storage C: QUIT S: 221 Bye {The server closes the connection}
因此,伺服器停止接收電子郵件(例如,因為它在電子郵件中檢測到序列“這是一條測試消息”)並用錯誤回复客戶端。在這種情況下,它是 452,但它可能是響應DATA 請求的任何有效錯誤。客戶可能會也可能不會回應 QUIT,我不在乎。
這可能取決於 SMTP 協議是如何在 TCP 級別實現的。我可以將從客戶端接收到的數據量限制為 50 個初始字節(例如通過限制 TCP 幀的大小)嗎?SMTP 協議是否允許我在客戶端發送 DATA 內容時回复錯誤?
此外,如果伺服器在接收到 DATA 的初始部分後故意斷開連接(而不是嘗試向客戶端發送錯誤),則與傳輸電子郵件時 TCP 連接意外斷開沒有什麼不同。表現良好的 MTA 會嘗試重新連接並重新發送電子郵件,垃圾郵件發送者可能不會費心重試。
您所描述的完全可行,但在這種情況下 Sendmail會產生退回郵件;這是協議設計的一部分。這樣做的方法是讓 Procmail 中止並使用合適的退出程式碼,將退回原因傳達回 Sendmail。
例如,要返回“使用者未知”錯誤,
:0 * ^Received: from badhelo \(badhost \[10\.9\.8\.7\]\) by yourhost { EXITCODE=67 HOST= }
指定要退出的
EXITCODE
返回程式碼,重新分配HOST
具有立即放棄目前配方文件的晦澀但有據可查的副作用。請參閱http://www.iki.fi/era/procmail/mini-faq.html#exitcode了解更多詳細資訊,例如
sysexits.h
實際退出程式碼的列表。這需要在您的個人
.procmailrc
中,而不是在/etc/procmailrc
您將無法控制是否在 SMTP 事務完成期間或之後發生這種情況。我記得當 Sendmail 仍然流行時,它實際上會在接收消息時處理 Procmail 規則,但這是一個可能取決於各種情況的實現細節,並且可能會在版本之間發生變化。無論哪種方式,SMTP 都是一種儲存轉發協議。如果交易失敗並且客戶端已經斷開連接,伺服器將嘗試連接回發送者的 MX 伺服器以傳遞退回郵件。(在某些情況下這是不可取的;例如,不應生成和傳遞退回的退回。)
無論哪種方式,為了讓 Procmail 能夠處理任何內容,您都需要已經收到整個消息;在這個後期階段顯式地失敗 SMTP
DATA
事務是毫無意義的,因為您無法撤消接收。如果您想在完成後靜默放棄消息DATA
,只需將其發送到/dev/null
.也就是說,儘早拒絕是有益的。如果您可以針對不良發件人實施 IP 級別的阻止,那麼在網路堆棧上將更加簡單和溫和。(在我正在閱讀“殭屍網路”的行之間——你知道這些發件人是否被例如 Spamhaus DNSBLs 阻止了嗎?)