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

要跑通 PHPMailer,核心就四组参数,每一组都得和服务商的要求严丝合缝。错一个,你看到的要么是 SMTP connect() failed,要么是 535 Authentication failed:
Host 必须精准:QQ 邮箱用 smtp.qq.com,163 用 smtp.163.com,Gmail 用 smtp.gmail.com,别想当然写个 smtp.qq.com 却连到 163 的端口。Port 和 SMTPSecure 必须成对出现:465 端口配 'ssl',587 端口配 'tls'。注意,'tls' 不是 'starttls',写错了直接报错。Username 必须是完整邮箱地址,比如 user@qq.com,别只写个 user 糊弄。Password 不是你登录邮箱的密码,而是平台专门生成的「应用专用密码」:QQ 叫授权码,Gmail 叫应用专用密码,163 叫客户端授权码,16 位且区分大小写。填错了就等着看 SMTP Error: Could not authenticate. 吧。这里有个常见坑:SMTP Error: Could not authenticate. 十有八九是 Username 和 setFrom() 不一致,或者密码直接填了登录密码。别问我怎么知道的,踩过的人太多了。
不设编码和格式,中文就会变成乱码,HTML 会被当成纯文本原样输出:
$mail->CharSet = 'UTF-8':强制字符集,标题和正文里的中文才能正常显示。$mail->isHTML(true):启用 HTML 解析,否则 加粗 会直接显示成文字,而不是加粗效果。CharSet 设对了,它自己就能处理。容易踩的坑:本地测试时看到 HTML 源码,八成是漏了 isHTML(true);主题显示成 “=?UTF-8?B?…” 这种乱码,是因为没设 CharSet,不是编码逻辑错了。
$mail->ErrorInfo别只靠 if ($mail->send()) 判断是否成功,失败时一定要立刻看到具体原因。正确的做法是用 try-catch 包住发送逻辑,在 catch 块里打印 $mail->ErrorInfo——这个信息比 PHP 的报错要精准十倍。
常见的返回值举例:
SMTP server error: AUTH command failed → 认证失败,检查授权码和用户名。Connection timed out → 端口不通,检查服务器防火墙或者端口号。Could not instantiate mail function → 多半是 openssl 扩展没启用。性能方面不用担心:每次发邮件都新建 PHPMailer 实例完全没问题,但别在循环里反复 require 'vendor/autoload.php'。Lara vel 等框架已经封装好了连接复用,不用手动优化。
如果业务代码里全是 mail() 调用,实在不想改,FakeSendmail 是唯一可行的路径,但限制多到让人头疼:
sendmail_path 在 php.ini 中必须是绝对路径,而且要带引号和 -t 参数,比如 sendmail_path = "C:\xampp\sendmail\sendmail.exe -t"。sendmail.ini 里 smtp_server、auth_username、auth_password 全要填,而且 smtp_port 和加密方式必须和服务商一致。真正容易卡住的地方是 openssl 和 sockets 扩展——很多新手折腾半天,最后发现是 extension=php_openssl.dll 没启用,或者路径写错了,却一直以为是邮件代码的问题。
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
正版软件
正版软件
正版软件
正版软件
正版软件
1
2
3
7
8