Postfix

Postfix 錯誤通知參數語法

  • March 3, 2016

請耐心等待,因為我不是專家管理員

我有一個已經執行了幾年的 linux 郵件伺服器,現在突然某個使用者無法發送電子郵件。他們立即得到“系統管理員”的回复說

501 5.5.4 error bad notify parameter syntax

這只發生在該使用者且僅在他們的電腦上。它在 Thunderbird 中執行良好,但在 Outlook 2013 中無法正常執行。其他使用者可以毫無問題地使用 Outlook 2013。

我查看了日誌,這就是該使用者嘗試發送電子郵件時的內容

replacing command "RCPT TO: <myemail@gmail.com> NOTIFY=SUCCESS,FAILURE,DELAY" with "RCPT TO: <myemail@gmail.com> NOTIFY=SUCCESS,FAILURE,DELAY NOTIFY=NEVER"

我檢查了任何可能添加標題、禁用電子郵件病毒掃描程序、重新添加帳戶等的 Outlook 規則。

我一直在閱讀,看來 NOTIFY=NEVER 不能與任何其他 NOTIFY 命令混合

我有一個像這樣的smtpd_command_filter設置

/^(RCPT\s+TO:<.*>.*)\s+NOTIFY=\S+(.*)/ $1 NOTIFY=NEVER$2
/^(RCPT\s+TO:.*)/                    $1 NOTIFY=NEVER

我不擅長正則表達式,但我猜它沒有正確解析原始命令,而是在末尾添加 NOTIFY=NEVER 而不是替換它。

與此同時,我已將其註釋掉,它會向發件人發送“您的郵件已成功發送”通知。我通過添加沉默了

smtpd_discard_ehlo_keywords = silent-discard, dsn

到 main.cf

我的新設置還可以嗎,還是我需要解決原來的問題,我猜是在正則表達式中?有任何想法嗎?

我一直在閱讀,看來 NOTIFY=NEVER 不能與任何其他 NOTIFY 命令混合

作為參考,它在RFC 1891第 5.1 節中定義

客戶端發出的 RCPT 命令可能包含可選的 esmtp 關鍵字“NOTIFY”,以指定 SMTP 伺服器應為該收件人生成 DSN 的條件。如果使用 NOTIFY esmtp-keyword,它必須有一個關聯的 esmtp-value,根據以下規則格式化,使用 RFC 822 的 ABNF:

notify-esmtp-value = "NEVER" / 1#notify-list-element

notify-list-element = "SUCCESS" / "FAILURE" / "DELAY"

筆記:

一種。多個通知列表元素,以逗號分隔,可以出現在 NOTIFY 參數中;但是,NEVER 關鍵字必須單獨出現。

灣。任何關鍵字 NEVER、SUCCESS、FAILURE 或 DELAY 都可以用大小寫字母的任意組合拼寫。


這是你的正則表達式(看起來像是從這個頁面複製的)

/^(RCPT\s+TO:<.*>.*)\s+NOTIFY=\S+(.*)/ $1 NOTIFY=NEVER$2
/^(RCPT\s+TO:.*)/                    $1 NOTIFY=NEVER

這是來自 Outlook 2013 的 RCPT 命令字元串

RCPT TO: <myemail@gmail.com> NOTIFY=SUCCESS,FAILURE,DELAY

上面的字元串將匹配第二行。*為什麼?*因為在TO:and之間&lt;myemail@gmail.com&gt;,有空格。您的第一行正則表達式不包含TO:和 ‘<` 之間的空格。

對於 ‘:’ 和 ‘<’ 之間的空格問題,這裡是RFC 5321所說的

由於它一直是錯誤的常見來源,因此值得注意的是,MAIL 命令中的 FROM 或 RCPT 命令中的 TO 後面的冒號兩側都不允許有空格。語法與上面給出的完全相同。

所以,這就是問題出現在本地的原因。看起來在違反 RFC 規範之後,outlook 之間仍然增加了空格。RCPT TO:

正則表達式解決方案:

修改正則表達式的第一行,變成這樣

/^(RCPT\s+TO:\s*&lt;.*&gt;.*)\s+NOTIFY=\S+(.*)/ $1 NOTIFY=NEVER$2

添加 \s* 將匹配後面有零個或多個空格的字元串RCPT TO:

有關正則表達式如何工作的說明,請訪問此頁面

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