thinkphp6邮件发不出去首要检查config/mail.php配置:host、port、username、password、from等键名必须准确,值须为字符串或数组,.env变量不自动生效;qq邮箱用587端口配tls,163邮箱用465配ssl,密码必须为授权码,from必须是含address和name的数组。

thinkphp6 邮件发不出去?先查 config/mail.php 的 key 名和值类型
ThinkPHP6 只读 config/mail.php,不认 .env 里的 MAIL_HOST 这类变量。写错一个键名,比如把 host 写成 smtp_host,就会静默失败,日志里只报 Connection could not be established with host smtp.qq.com。
必须严格按框架约定填:
- host:填 'smtp.qq.com'(不要带 ssl:// 前缀)
- port:QQ 邮箱用 587,163 邮箱用 465,不能混
- username:必须是完整邮箱地址,如 'notify@example.com'
- password:填 SMTP 授权码,不是登录密码(QQ/163 后台开启 SMTP 服务时生成)
- from:必须是数组,含 address 和 name 两个键,缺一不可
同步发邮件会卡住整个请求,必须走 think-queue 异步
在控制器或 ExceptionHandler::report() 里直接调用 Mail::send(),一旦 SMTP 超时(比如网络抖动),用户就要等满 30 秒才看到 500 页面。生产环境严禁这么做。
正确做法是封装成队列任务:
- 执行 composer require topthink/think-queue
- 配置驱动为 Redis 或 Database(推荐 Redis)
- 发送逻辑包在 try/catch 里,失败只记日志,不抛异常
- 设置 maxTries = 1,避免重复投递导致用户收多封验证码邮件
- 别在 report() 里发信——调试模式下它可能被调两次
短信发送别自己拼 HTTP 请求,优先用官方 SDK
自己封装 cURL 调腾讯云/阿里云短信接口,容易漏签名、时区、编码、重试逻辑。直接用官方 SDK 更稳:
- 腾讯云:执行 composer require tencentcloud/tencentcloud-sdk-php
- 引入类:use TencentCloud\Sms\V20210111\SmsClient 和 SendSmsRequest
- Credential 构造必须用 SecretId 和 SecretKey,不能硬编码在代码里(应从环境变量读取)
- 注意短信模板 ID 和签名必须已审核通过,否则返回 InvalidParameterValue.TemplateNotExist
云服务器发不出邮件?大概率是端口被封了
阿里云、腾讯云默认封掉出站的 25/465/587 端口。本地开发用 Docker 也得确认容器网络能通外网 SMTP。
必须手动操作:
- 进安全组,添加 outbound 规则放开对应端口
- 登录服务器检查防火墙:ufw status 或 iptables -L
- 测试连通性:telnet smtp.qq.com 587(若超时,就是网络层被拦)
最常被忽略的是:即使配置全对、扩展装好、代码没报错,只要这个端口不通,邮件就永远发不出去。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











