PHP调用mail()发送邮件含句号时收信失败问题咨询
问题原因与解决方案
mail()函数返回值为TRUE仅表示PHP已成功将邮件提交给服务器上配置的邮件传输代理(MTA,常见如sendmail、postfix等),不代表邮件已成功投递到收件方服务器、或通过对方的反垃圾校验。
带句号的邮件无法被接收的常见原因
- 反垃圾规则拦截:绝大多数主流邮件服务商的反垃圾策略会对陌生发件人的邮件做内容特征校验,你示例里主题、内容包含的
xyz.com是典型域名格式,在发件域名未配置SPF、DKIM、DMARC等身份校验记录的前提下,这类内容很容易被判定为垃圾邮件,甚至被直接拒收不进入垃圾邮箱。 - 老旧MTA的转义bug:虽然SMTP协议规定只有单独处于行首的
.才是邮件内容终止符,但部分老旧的MTA实现存在逻辑缺陷,会错误识别内容中其他位置的句号触发终止逻辑,导致邮件内容被截断、格式异常被拒收。
解决方法
- 优先使用成熟的第三方邮件类库:替换原生
mail()函数,改用PHPMailer、SwiftMailer等常用邮件类库发送邮件,这类库底层已经自动处理了所有SMTP协议的转义规则,不需要手动处理内容中的句号,同时也支持SMTP直连发送、身份校验配置等功能,投递成功率远高于原生mail()。 - 手动做SMTP转义:如果必须使用原生
mail()函数,可以手动对邮件内容做转义处理:将内容中所有行首位置的.替换为..即可符合SMTP协议规范,避免MTA错误识别终止符。 - 完善发件域名的校验记录:给你发送邮件所用的域名配置SPF、DKIM、DMARC记录,大幅降低被对方反垃圾规则拦截的概率,也可以在邮件发送后查看服务器MTA的运行日志,根据投递到对方服务器返回的错误码定位具体是拦截还是内容格式问题。
内容的提问来源于stack exchange,提问作者Norm Strassner
相关产品推荐
相关产品推荐

