Postfix 錯誤通知參數語法
請耐心等待,因為我不是專家管理員
我有一個已經執行了幾年的 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之間<myemail@gmail.com>
,有空格。您的第一行正則表達式不包含TO:
和 ‘<` 之間的空格。對於 ‘:’ 和 ‘<’ 之間的空格問題,這裡是RFC 5321所說的
由於它一直是錯誤的常見來源,因此值得注意的是,MAIL 命令中的 FROM 或 RCPT 命令中的 TO 後面的冒號兩側都不允許有空格。語法與上面給出的完全相同。
所以,這就是問題出現在本地的原因。看起來在違反 RFC 規範之後,outlook 之間仍然增加了空格。
RCPT TO:
正則表達式解決方案:
修改正則表達式的第一行,變成這樣
/^(RCPT\s+TO:\s*<.*>.*)\s+NOTIFY=\S+(.*)/ $1 NOTIFY=NEVER$2
添加 \s* 將匹配後面有零個或多個空格的字元串
RCPT TO:
有關正則表達式如何工作的說明,請訪問此頁面。