我有一个客户抱怨说他们的发票电子邮件发送不正确。据我所知,他们的发票软件是设计用来直接发送电子邮件的。
查看会话的数据包捕获,客户端似乎开发得很糟糕,正在执行以下奇怪的过程 -
-> MAIL FROM: <sender>
<- OK
-> RCPT TO: <customer>
<- OK
-> RSET
它对每封电子邮件都执行此操作,然后从头开始再执行一次,这次发送一整套MAIL/RCPT/DATA
命令。
-> MAIL FROM: <sender>
<- OK
-> RCPT TO: <customer>
<- OK
-> DATA
<- 354 OK..
-> (the email)
-> .
<- OK Queued
-> MAIL FROM: <sender>
... etc ...
让我感兴趣的是,这种方法对少数收件人有效。然而,他们这么多电子邮件丢失的原因是,如果收件人列表太大,Postfix 似乎会在第一MAIL/RCPT/RSET
阶段结束连接too many errors
。这种情况似乎发生在大约 100 个收件人之后。
RSET
250 2.0.0 Ok
MAIL FROM: <sender>
250 2.1.0 Ok
RCPT TO: <customer>
250 2.1.5 Ok
RSET
250 2.0.0 Ok
MAIL FROM: <sender>
421 4.7.0 isp-smtp-server Error: too many errors
RSET
RSET
QUIT
现在我打算回复他们,告诉他们这是软件问题。不知道他们有没有渠道可以修复它。
(编辑:显然有人告诉我它是通过 Outlook 进行的,这促使我考虑其他可能破坏此连接的系统,例如 AV -https://www.symantec.com/connect/forums/rset-command-being-sent-after-authentication-smtp-server-successful)
问题是,它在会话期间实际上根本不会报告任何错误,因此客户端不知道它正在累积错误。这也意味着我不能 100% 确定错误实际上是什么(在未完成消息的情况下发送 RSET?)
除了正常连接之外,日志没有显示任何其他内容too many errors
,这就是为什么我不得不求助于数据包捕获来找出发生了什么。
有人知道 Postfix 正在计算的具体错误是什么吗?它使用什么限制来判断错误是否太多?我的软错误限制是默认值10
,远低于客户端在断开连接之前执行的重置次数。我最初认为可能是某些收件人被拒绝,并且被拒绝的地址数量最终达到了错误限制,但我在数据包捕获中根本没有看到任何拒绝,它以命令MAIL
而不是结束RCPT
。
答案1
我仍然不确定为什么这个 Outlook 2010 客户端以这种方式发送命令,但我设法找到了 Postfix 突然决定放弃的原因。
RSET
被视为垃圾命令,默认值为smtpd_junk_command_limit
100。一旦达到此限制,hard_error
计数就会开始增加。当达到 20(默认值)时,总计 120,Postfix 会报告too many errors
。