Postfix的错误通知参数语法

请忍受我,因为我不是专家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式的工作原理,请访问此页面 。