请忍受我,因为我不是专家pipe理员
我有一个已经运行了几年的Linux邮件服务器,现在突然间某个用户无法发送邮件。 他们立即得到“系统pipe理员”的回应
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 =从不能与任何其他NOTIFY命令混合
我有一个这样的smtpd_command_filter设置
/^(RCPT\s+TO:<.*>.*)\s+NOTIFY=\S+(.*)/ $1 NOTIFY=NEVER$2 /^(RCPT\s+TO:.*)/ $1 NOTIFY=NEVER
我不擅长正则expression式,但我猜测它不是正确parsing原始命令,并且正在添加NOTIFY = NEVER而不是replace它。
在此期间,我已经评论说,发送“您的消息已成功交付”的通知发回给发件人。 我通过join使其沉默
smtpd_discard_ehlo_keywords = silent-discard, dsn
到main.cf
我的新设置是好还是我需要修复原来的问题,我猜是在正则expression式? 有任何想法吗?
我一直在阅读,似乎NOTIFY =从不能与任何其他NOTIFY命令混合
作为参考,它在RFC 1891第5.1节中定义
客户端发出的RCPT命令可能包含可选的esmtp-keyword“NOTIFY”,以指定SMTP服务器应该为其生成DSN的条件。 如果使用NOTIFY esmtp-keyword,则必须使用RFC 822的ABNF,根据以下规则,具有关联的esmtp-value:
notify-esmtp-value = "NEVER" / 1#notify-list-element notify-list-element = "SUCCESS" / "FAILURE" / "DELAY"笔记:
一个。 以逗号分隔的多个通知列表元素可以出现在NOTIFY参数中; 但是,NEVER关键字本身必须出现。
湾 从来没有,成功,失败,或延迟的任何关键字可能拼写成大小写字母的任意组合。
这是你的正则expression式(看起来像从这个页面复制)
/^(RCPT\s+TO:<.*>.*)\s+NOTIFY=\S+(.*)/ $1 NOTIFY=NEVER$2 /^(RCPT\s+TO:.*)/ $1 NOTIFY=NEVER
这是Outlook 2013中的RCPT命令string
RCPT TO: <[email protected]> NOTIFY=SUCCESS,FAILURE,DELAY
上面的string将匹配第二行。 为什么? 因为在TO:和<[email protected]>之间有空格。 您的第一行正则expression式不包含TO:和<<之间的空格。
对于':'和'<'问题之间的空间,这里是RFC 5321所说的
由于它是一个常见的错误来源,所以值得注意的是在MAIL命令的FROM或者RCPT命令的TO之后冒号的两边都不允许有空格。 语法与上面给出的完全相同。
所以,这就是为什么问题出现在本地。 看起来outlook仍然在RCPT TO:之后join空格 RCPT TO:从而违反了RFC规范。
正则expression式解决scheme:
修改正则expression式的第一行,所以它成为这个
/^(RCPT\s+TO:\s*<.*>.*)\s+NOTIFY=\S+(.*)/ $1 NOTIFY=NEVER$2
添加\ s *将匹配RCPT TO:之后有零个或多个空白string的stringRCPT TO:
有关正则expression式的工作原理,请访问此页面 。