thinkphp邮件发送失败主因是smtp配置四点未对齐:加密协议与端口组合错误、config/mail.php未显式配置encryption和port、openssl扩展未启用或版本不兼容、授权码未开启及云服务器出站端口未放行。

ThinkPHP邮件发送失败,八成卡在SMTP配置环节。不是代码写错了,而是加密方式、端口、授权码、扩展支持这四点没对齐。下面分四步直接解决。
确认邮箱服务商要求的加密协议与端口
填错组合,连接直接被拒绝,连认证环节都进不去。
- QQ邮箱:必须用 ssl + 465,填 tls 或 587 会报 Connection could not be established
- 163邮箱:推荐 tls + 587(国内更稳),也可用 ssl + 465;但务必用授权码,不是登录密码
- Gmail / Outlook:只认 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;TP6 虽支持环境变量,但必须通过 env() 显式调用才生效,不能留空或依赖默认值。
- 打开
config/mail.php,找到'smtp'配置块 - 写死或动态读取:
'encryption' => env('MAIL_ENCRYPTION', 'ssl'),'port' => (int)env('MAIL_PORT', 465) - 严禁使用 port=25——阿里云/腾讯云轻量服务器默认封禁该端口,国内基本不可用
- .env 文件中确保有两行且无空格:
MAIL_ENCRYPTION=ssl、MAIL_PORT=465
检查 OpenSSL 扩展与协议兼容性
没有 OpenSSL,SSL/TLS 连接根本无法建立;PHP 8.1+ 搭配 OpenSSL 3.0 后,还可能因协议版本不匹配失败。
- 终端执行:
php -m | grep openssl,确认输出含openssl - 若无输出,编辑
php.ini,取消extension=openssl(Linux)或extension=php_openssl.dll(Windows)前的分号 - 重启 Web 服务(Apache/Nginx)和 PHP-FPM,否则扩展不生效
- PHP 8.1+ 用户注意:若用 tls + 587,
MAIL_ENCRYPTION必须明确设为tls,不能留空或写STARTTLS
验证授权码启用与服务器出站规则
账号密码没错,但收不到邮件?大概率是邮箱没开 SMTP 服务,或云服务器拦住了出站连接。
- QQ/163/网易邮箱:登录网页版邮箱 → 设置 → 账户 → 找到「POP3/IMAP/SMTP 服务」→ 开启,并生成「授权码」代替登录密码
- 云服务器安全组:检查是否放行对应 出站(outbound)规则,目标端口为 465 或 587,协议为 TCP
- 发件人地址(From)必须与
username完全一致,例如admin@yourdomain.com,否则部分企业邮箱会静默拦截 - 临时排除干扰:关闭 ThinkPHP 日志(
config/log.php中设'level' => [])和缓存('default' => 'null')
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











