thinkphp 5.1 邮件发送报 smtp connect failed 的核心原因是四层校验未通过:邮箱服务未开启、未用或填错授权码、加密协议与端口不匹配(如qq邮箱必须ssl+465)、php未启用或兼容openssl扩展。

TP5.1 邮件发送报 SMTP connect failed,核心原因不是代码写错,而是连接前的四层校验没通过:邮箱服务未开启、授权码未用或填错、加密协议与端口不匹配、PHP底层支持缺失。下面分四点直击要害。
检查邮箱端口与加密方式是否严格匹配
QQ邮箱必须用 ssl + 465;填 tls 或 587 直接拒绝,连握手都失败。163邮箱推荐 ssl + 465(国内更稳),也可选 tls + 587。Gmail 只认 tls + 587,填 ssl + 465 会报 Unable to connect with TLS。腾讯企业邮箱多数子域名(如 exmail.qq.com)强制 ssl + 465,务必以邮箱后台「SMTP设置」页面为准。
显式配置 config/mail.php 中的 encryption 和 port
ThinkPHP 5.1 不读 .env 的 MAIL_ENCRYPTION 和 MAIL_PORT,必须手动写死或显式调用 env()。
- 打开 config/mail.php,定位到 'smtp' 配置块
- 写明:
'encryption' => 'ssl'(对应 QQ/163)或'encryption' => 'tls'(对应 Gmail) - 同时指定:
'port' => 465或'port' => 587,严禁留空或用默认 25 端口(阿里云/腾讯云轻量服务器基本全封) - 若想用环境变量管理,写成:
'encryption' => env('MAIL_ENCRYPTION', 'ssl')和'port' => (int)env('MAIL_PORT', 465),并确保 .env 中有且仅有这两行:MAIL_ENCRYPTION=sslMAIL_PORT=465(无空格、无注释)
确认邮箱 POP3/SMTP 已开启且使用授权码
登录邮箱网页端操作:
- QQ邮箱:设置 → 账户 → 找到「POP3/IMAP/SMTP/Exchange/CardDAV/CalDAV服务」→ 开启「POP3/SMTP服务」→ 用手机验证码生成 16 位授权码
- 163邮箱:设置 → POP3/SMTP/IMAP → 开启 SMTP 服务 → 获取客户端授权码(不是登录密码)
- 用户名字段必须填完整邮箱地址(如
xxx@qq.com),不能只填前缀
验证 OpenSSL 扩展是否启用且兼容
没有 OpenSSL,SSL/TLS 连接根本建不起来。在服务器上执行:
-
php -m | grep openssl—— 若无输出,说明未启用 - 打开 php.ini,找到
;extension=openssl,删掉前面的分号 - 重启 Web 服务(Apache/Nginx)和 PHP-FPM
- PHP 8.1+ 搭配 OpenSSL 3.0 时,还可能因协议版本不匹配失败,可临时降级测试或更新 PHPMailer 到 v6.9+











