先把这个结论砸在桌面上:PHP 项目发通知邮件,别碰内置的 mail() 函数,老老实实上 PHPMailer 直连 SMTP。否则邮件大概率被扔进垃圾箱、被对方服务器直接拒收,甚至连接都连不上——这真不是代码写错了,是协议和认证层面压根儿没到位。

PHP邮件发送如何配置SMTP发送通知

PHPMailer 配置 SMTP 的关键参数组合

要跑通 PHPMailer,核心就四组参数,每一组都得和服务商的要求严丝合缝。错一个,你看到的要么是 SMTP connect() failed,要么是 535 Authentication failed

这里有个常见坑:SMTP Error: Could not authenticate. 十有八九是 UsernamesetFrom() 不一致,或者密码直接填了登录密码。别问我怎么知道的,踩过的人太多了。

中文内容与 HTML 邮件必须显式设置

不设编码和格式,中文就会变成乱码,HTML 会被当成纯文本原样输出:

容易踩的坑:本地测试时看到 HTML 源码,八成是漏了 isHTML(true);主题显示成 “=?UTF-8?B?…” 这种乱码,是因为没设 CharSet,不是编码逻辑错了。

异常捕获必须带 $mail->ErrorInfo

别只靠 if ($mail->send()) 判断是否成功,失败时一定要立刻看到具体原因。正确的做法是用 try-catch 包住发送逻辑,在 catch 块里打印 $mail->ErrorInfo——这个信息比 PHP 的报错要精准十倍。

常见的返回值举例:

性能方面不用担心:每次发邮件都新建 PHPMailer 实例完全没问题,但别在循环里反复 require 'vendor/autoload.php'。Lara vel 等框架已经封装好了连接复用,不用手动优化。

Windows 本地开发想兼容旧代码?慎用 FakeSendmail

如果业务代码里全是 mail() 调用,实在不想改,FakeSendmail 是唯一可行的路径,但限制多到让人头疼:

真正容易卡住的地方是 openssl 和 sockets 扩展——很多新手折腾半天,最后发现是 extension=php_openssl.dll 没启用,或者路径写错了,却一直以为是邮件代码的问题。

本文转载于:https://www.php.cn/faq/2824513.html 如有侵犯,请联系zhengruancom@outlook.com删除。
免责声明:正软商城发布此文仅为传递信息,不代表正软商城认同其观点或证实其描述。