我目前正在使用 PHP 直接发送电子邮件stream_socket_client()
。
到目前为止,这工作得很好。我能够发送带有 DKIM 签名的 HTML 电子邮件,该签名通过了https://www.mail-tester.com上的所有测试
我自己的邮件服务器以及 Yahoo 和 AOL 正在接收邮件,没有投递或垃圾邮件问题。
但是当我发送到 Gmail 时,不仅电子邮件没有到达,而且没有送达报告被发送回返回路径。尽管在 SMTP 交换期间没有给出任何错误,但仍然如此。
如果我使用它向 Gmail 发送完全相同的测试电子邮件,mail()
则没有问题。我比较了两封电子邮件的来源,它们仅在 DKIM 签名上略有不同,我没有“x”标头,并且加密的标头列表不同。我不认为这是问题所在。
我可以看到的唯一区别是我正在做mail()
的事情和我还没有使用 TLS。这似乎是一个强有力的候选者,但从我所阅读的内容来看,Gmail 并没有将 TLS 作为接收电子邮件的要求。
还有什么我可能会丢失的吗?
下面是 SMTP 交换:
SMTP Connection:
HOST: 220 mx.google.com ESMTP f128si20492958wme.149 - gsmtp
EHLO: 250-mx.google.com at your service, [90.100.136.100]
FROM: 250-SIZE 157286400
RCPT: 250-8BITMIME
DATA: 250-ENHANCEDSTATUSCODES
DATA WRITE: 250-PIPELINING
QUIT: 250-CHUNKING
问题恰恰相反,Gmail 对所有行尾都很严格,而其他服务则不然。
我发现一个 rouge 额外的行尾导致通信在 FROM 失败。
上面的各种代码实际上是来自 EHLO 调用的多行响应,然后我误以为这些行是对后续调用的响应。