ThinkPHP邮件发送失败主因是SMTP加密方式与端口不匹配、未启用OpenSSL/sockets扩展、云服务器防火墙拦截、邮箱未开启SMTP服务或未使用授权码。QQ邮箱必须ssl+465,163/Gmail需tls+587,且config/mail.php须显式配置encryption和port,不可依赖.env或默认值25。

ThinkPHP 部署后邮件发送失败,多数不是代码写错,而是环境配置和平台策略没对上。核心问题集中在 SMTP 连接握手阶段——加密方式、端口、授权码、扩展支持、防火墙这五项,只要有一项不匹配,就会静默失败或报 Connection could not be established 类错误。
确认邮箱服务商的加密协议与端口组合
不同邮箱对加密方式和端口是硬绑定的,不能混搭: - QQ 邮箱(含腾讯企业邮部分子域名):必须用 ssl + 465,填 tls 或 587 直接拒绝 - 163 邮箱:推荐 tls + 587(国内更稳),也可用 ssl + 465 - Gmail / Outlook:仅支持 tls + 587,填 ssl + 465 会触发 `Unable to connect with TLS` - 腾讯企业邮箱(exmail.qq.com):以管理后台说明为准,部分实例强制 ssl + 465显式配置 config/mail.php 中的 encryption 和 port
ThinkPHP 5.1 不自动读取 `.env` 里的 `MAIL_ENCRYPTION` 和 `MAIL_PORT`,必须手动写进 `config/mail.php`: - 打开 `config/mail.php`,定位 `'smtp'` 配置块 - 明确设置 `'encryption' => 'ssl'` 或 `'tls'`,严格对应你选的端口 - 同时设置 `'port' => 465` 或 `587`,**不要依赖默认值 25**(云服务器基本全封) - 若想用环境变量控制,写成: `'encryption' => env('MAIL_ENCRYPTION', 'ssl')`, `'port' => (int)env('MAIL_PORT', 465)`, 并确保 `.env` 中有 `MAIL_ENCRYPTION=ssl` 和 `MAIL_PORT=465`,且无空格、无注释检查 PHP 是否启用 OpenSSL 及 sockets 扩展
SMTP 加密连接依赖这两个扩展: - 运行 `php -m | grep openssl` 和 `php -m | grep sockets`,确认都存在 - 若缺失,在 `php.ini` 中取消以下两行前的分号: `extension=openssl` `extension=sockets` - Windows 下对应为 `extension=php_openssl.dll` 和 `extension=php_sockets.dll` - 修改后务必重启 Web 服务(Nginx/Apache)和 PHP-FPM,否则不生效验证邮箱授权码与 SMTP 开启状态
- QQ / 163 / 网易企业邮等,**密码字段必须填「授权码」,不是登录密码** - 登录邮箱网页版 → 设置 → 账户 → 找到「POP3/IMAP/SMTP 服务」→ 开启并生成授权码 - 授权码是一串独立字符,通常 16 位,复制粘贴时注意别带空格或换行 - 检查 `config/mail.php` 中 `'username'` 填的是邮箱完整地址(如 `xxx@qq.com`),`'password'` 是刚生成的授权码不复杂但容易忽略。



















