请耐心等待,因为我不是专业的管理员
我有一个运行了几年的 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:
有关正则表达式的工作原理,请访问这一页。