Postfix 错误的通知参数语法

Postfix 错误的通知参数语法

请耐心等待,因为我不是专业的管理员

我有一个运行了几年的 Linux 邮件服务器,现在突然某个用户无法发送电子邮件。他们立即收到“系统管理员”的回复,说

501 5.5.4 error bad notify parameter syntax

这种情况只发生在该用户身上,并且只发生在他们的电脑上。它在 Thunderbird 中运行良好,但在 Outlook 2013 中却不行。其他用户可以毫无问题地使用 Outlook 2013。

我查看了日志,这是该用户尝试发送电子邮件时显示的内容

replacing command "RCPT TO: <[email protected]> NOTIFY=SUCCESS,FAILURE,DELAY" with "RCPT TO: <[email protected]> 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

我的新设置可以吗?还是我需要修复原始问题(我猜是正则表达式的问题)?有什么想法吗?

答案1

我已经阅读过,似乎 NOTIFY=NEVER 不能与任何其他 NOTIFY 命令混合使用

作为参考,它定义在RFC 1891第 5.1 节

客户端发出的 RCPT 命令可能包含可选的 esmtp 关键字“NOTIFY”,以指定 SMTP 服务器应为该收件人生成 DSN 的条件。如果使用 NOTIFY esmtp 关键字,则它必须具有关联的 esmtp 值,该值根据以下规则使用 RFC 822 的 ABNF 进行格式化:

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

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

笔记:

a. 多个通知列表元素(以逗号分隔)可以出现在一个 NOTIFY 参数中;但是,NEVER 关键字必须单独出现。

b. 任何关键字 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: <[email protected]> NOTIFY=SUCCESS,FAILURE,DELAY

上面的字符串将匹配第二行。为什么?因为TO:和之间有空格。正则表达式的第一行在和'<'之间不包含空格。<[email protected]>TO:

对于 ':' 和 '<' 之间的空格问题,这里是什么RFC 5321

由于这是常见的错误来源,因此值得注意的是,MAIL 命令中的 FROM 或 RCPT 命令中的 TO 后面的冒号两侧不允许有空格。语法与上面完全相同。

所以,这就是问题出现在本地的原因。看起来像前景仍有增加空间因此RCPT TO:违反了 RFC 规范。

正则表达式解决方案:

修改正则表达式的第一行,使其变成这样

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

添加 \s* 将匹配后面有零个或多个空格的字符串RCPT TO:

有关正则表达式的工作原理,请访问这一页

相关内容