Email

是否可以拒絕 procmail 中的某些電子郵件?一世小號_米噸磷sessionrejectsbasedonemailcontent一世n小號米噸磷s和ss一世這nr和j和C噸sb一種s和d這n和米一種一世lC這n噸和n噸In SMTP s…

  • March 4, 2022

讓我們假設一個典型的設置,其中從 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 能夠處理任何內容,您都需要已經收到整個消息;在這個後期階段顯式地失敗 SMTPDATA事務是毫無意義的,因為您無法撤消接收。如果您想在完成後靜默放棄消息DATA,只需將其發送到/dev/null.

也就是說,儘早拒絕是有益的。如果您可以針對不良發件人實施 IP 級別的阻止,那麼在網路堆棧上將更加簡單和溫和。(在我正在閱讀“殭屍網路”的行之間——你知道這些發件人是否被例如 Spamhaus DNSBLs 阻止了嗎?)

引用自:https://serverfault.com/questions/774769