SMTP连接失败首要排查网络与端口连通性,再检查认证配置、加密方式匹配、域名DNS记录及发信头合规性,禁用mail()改用PHPMailer等SMTP方案。
SMTP 连接被拒绝或超时,先查网络和端口
很多情况下根本连不上邮件服务器,不是代码写错了,而是基础网络不通。PHP 的 fsockopen 或 stream_socket_client 直接报错 Connection refused 或 Operation timed out,就得从服务器环境入手:
- 确认目标 SMTP 服务器地址(如
smtp.gmail.com)和端口(587或465)拼写无误,注意有些服务商只开放特定端口(比如腾讯企业邮箱禁用25,必须用587) - 在 PHP 服务器上手动测试连通性:
telnet smtp.example.com 587或nc -zv smtp.example.com 587;如果失败,说明防火墙、安全组或 ISP 层面拦截了 outbound 连接 - 部分云主机(如阿里云、腾讯云新购实例)默认屏蔽
25端口,且不支持解封,必须改用587或465并启用 TLS/SSL - 检查 PHP 所在服务器是否被目标邮件服务商拉黑(可查 IP 是否在 Spamhaus 或 MXToolbox 黑名单中)
PHPMailer 报 SMTP Error: Could not authenticate
认证失败是线上最常见问题,原因往往不在密码本身,而在账号权限或协议配置:
- 确认邮箱开启了「SMTP 服务」且生成了专用密码(如 Gmail 的 App Password、QQ 邮箱的授权码),不能直接用登录密码(尤其开启两步验证后)
- 检查
SMTPAuth是否设为true,且Username填的是完整邮箱地址(如[email protected]),不是用户名前缀 - 端口与加密方式必须匹配:
587对应TLS(SMTPSecure = 'tls'),465对应SSL(SMTPSecure = 'ssl');混搭会导致静默认证失败 - 某些企业邮箱(如网易企业邮)要求用户名格式为
[email protected],而密码必须是管理员后台单独分配的 SMTP 密码,和 Web 登录密码不同
发信成功但进垃圾箱,重点看 SPF/DKIM/DMARC 和发信头
邮件能发出去不代表能被正常投递——收件方服务器会校验发信身份。PHPMailer 默认发信头简陋,极易触发反垃圾规则:
- 确保域名已配置 SPF 记录(如
v=spf1 include:smtp.example.com ~all),且实际发信 IP 在允许列表中 - 使用真实、可回溯的
From地址(如[email protected]),避免用免费邮箱(@gmail.com)作为发件人,否则多数企业邮箱直接拒收 - 设置
Sender和Reply-To(即使和From一致),并确保From域名有 MX 记录(哪怕只是空记录) - 避免邮件正文含大量链接、图片外链、促销词汇;首次上线建议先用文本纯内容测试,再逐步加 HTML 和样式
用 mail() 函数发不出信,别硬扛
Linux 服务器上的 mail() 函数依赖本地 MTA(如 sendmail/postfix),线上环境几乎不可靠: