我正在通过 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"
我想知道为什么它说“下一个输入发送得太早”。我正在使用流水线,因此应该允许发送我的数据而不等待任何事情。
请注意,当我不使用流水线时,一切都顺利。
答案1
您必须等待对 DATA 动词的响应,然后才能发送实际的 SMTP 数据。这样,如果服务器拒绝 MAIL、RCPT 或 DATA,您可以在将可能很大的消息体送入管道之前退出事务。
使用管道不允许把所有东西都扔进管道而不去管它,你仍然必须检查 SMTP 响应,并且有一些规则规定哪些动词必须是一起发送的集合中的最后一个,等等。流水线RFC解释得很好