我正在通过 SMTP 从 PHP 脚本向 Exim 4.71 服务器发送电子邮件。服务器宣传流水线,所以我试图利用它。但是,当我读回返回码时,我终于得到了554 SMTP synchronization error
. 在服务器端,错误显示为:
SMTP protocol synchronization error (next input sent too soon: pipelining was advertised): rejected "DATA" H=(localhost) [111.111.111.111] next input="To: [email protected]\nDate: Wed, 12 Jun 2013 11:35:50 +1200\nReturn-Path: [email protected]\nSubject: Blablablablabla"
我想知道为什么它说“下一个输入发送得太快”。我正在使用流水线,所以应该允许发送我的数据而不是等待任何东西。
请注意,当我不使用流水线时,一切正常。
在发送实际的 SMTP 数据之前,您必须等待对 DATA 动词的响应。这样,如果服务器拒绝 MAIL、RCPT(s) 或 DATA,您可以在将可能很大的消息体从管道中抽出之前退出事务。
使用流水线不允许在不关心它的情况下将所有内容都扔进管道,您仍然必须检查 SMTP 响应,并且有关于哪些动词必须是一起发送的集合中的最后一个的规则,等等。流水线 RFC确实解释得很好