如果发送date标题,智能主机不会传送电子邮件?

我在Amazon Linux服务器上使用MantisBT 1.2.6。 它有自己的电子邮件发送类在PHP邮件()函数的顶层。 其实,它有其他的select,直接使用smtp或sendmail,但我使用PHP邮件。 然后PHP邮件反过来使用sendmail。

我configuration了sendmail使用智能主机,这工作正常,因为我可以写一个PHP程序通过它的mail()函数成功发送消息。

但是MantisBT发送的邮件从未到达,也没有反弹。

/var/log/maillog显示MantiBT消息成功发送到智能主机

 (relay=my-smarthost-hostname) with "stat=Sent (ok nnnn qp nnnn)" 

如果我更改了/ etc / mail / authinfo文件以使用错误的密码,那么maillog会为该中继显示“stat = Service unavailable”。

所以这个问题在MantiBT代码中似乎有些微妙。 我使用xdebug来查找它对mail()所做的调用,并获取其参数的值,并将其提取到单独的php文件中进行播放。 除了第四个参数中的“From:”之外,它还传递了一些头文件,我怀疑它们可能已经被\ n分开,而不是像RFC(2)821所要求的那样被分开,导致了问题。 但我添加了代码来将\ n更改为\ r \ n在标题string中,并没有什么区别。

最后,导致问题的原因是(正确)“Date:”标题的存在。 当我从第四个参数中删除头到邮件(),邮件立即交付。 所以我编辑了MantisBT源码不生成这个头,一切都很好(我也编辑了MantisBT源不要在“-f”选项和发件人地址之间留出空格)。

所以我的问题是,是否存在邮件()的第四个参数中的“Date:”标题已知通过智能主机发送问题。 如果智能主机不喜欢看到date标题,那么如果有后续的问题,您是不是会期待maillog中的反弹或消息?

PS我实际上称为networking解决scheme的技术支持,当我看到发送邮件在maillog中的消息,但在我把它隔离到date标题之前。 当然,没有什么用处,只是说明如何configuration您的电子邮件客户端的POP或IMAP 🙂

很明显,我已经被我自己的方法论所吓倒了。

它现在看起来像date头引起消息被智能主机接受而不被传递的原因是,我没有改变每个testing头的时间戳。 因此,智能主机看到多个消息具有相同的消息ID和时间戳,并且没有传送重复消息。

在正常工作的过程中,我发现错误的地方是-f选项被当作收件人地址(可能是因为“-f”和发件人地址之间的空格)以及其他问题。 所以有可能当我把这些东西修好的时候,一个信息就可以通过了。 但是,然后试图确认成功卡住了重复的消息陷阱。 在现实生活中,时间戳当然不会与消息ID一样重复,这只是将传递给mail()的参数捕获到独立的静态testing用例中的工件。

无论如何,我想我现在都已经设好了,我将把Date标题恢复到MantisBT代码。

之前没有多less发送邮件,这对我来说是一个学习的经验。 也许这对别人是有用的,要知道如果你想testing外发邮件,你不能使用具有不变的MessageID和Date头的jar头标题!