Laravel 8调用Mail::send发信报530 5.7.0 Must issue a STARTTLS错误
问题定位与解决方案
错误说明
你遇到的报错是SMTP服务器强制要求通信前先发起TLS加密握手返回的错误信息:
530 5.7.0 Must issue a STARTTLS command first
两种发信方式的逻辑差异
Laravel的Notification邮件通道和Mail::send的底层SMTP连接逻辑完全一致,出现一个正常一个报错的核心原因是配置加载的差异:
- Notification的邮件通道默认读取全局默认mailer配置,会完整加载
config/mail.php中的encryption参数,只要你的.env中MAIL_ENCRYPTION=tls配置正确,就会自动发起STARTTLS请求,因此运行正常 Mail::send报错通常是因为调用时加载的mailer配置缺失加密参数,常见场景包括:- 调用时手动指定了自定义mailer,对应mailer在
config/mail.php中没有配置encryption参数 - 自定义Mailable类中通过
$mailer属性指定了无加密配置的自定义mailer - 代码运行过程中临时覆盖了mail配置的
encryption值为空
- 调用时手动指定了自定义mailer,对应mailer在
修复方案
按以下步骤逐一排查即可解决:
- 检查
config/mail.php中所有用到的mailer配置,确保都存在加密配置项:
'mailers' => [ 'smtp' => [ 'transport' => 'smtp', 'host' => env('MAIL_HOST', 'smtp.qq.com'), 'port' => env('MAIL_PORT', 587), // 确保下面这行没有被注释,参数值正确 'encryption' => env('MAIL_ENCRYPTION', 'tls'), 'username' => env('MAIL_USERNAME'), 'password' => env('MAIL_PASSWORD'), 'timeout' => null, ], // 其他自定义mailer也需要按上述格式添加encryption配置 ],
- 检查
Mail::send的调用代码,确认指定的mailer和配置中的一致:
// 正确用法,使用默认mailer,加载全局配置 Mail::send(...); // 如果使用自定义mailer,确保对应配置存在encryption参数 Mail::mailer('your_custom_mailer')->send(...);
- 若配置排查无问题,可以在调用
Mail::send前临时强制设置加密参数验证:
// 临时强制覆盖默认smtp的加密配置为tls config(['mail.mailers.smtp.encryption' => 'tls']); Mail::send(...);
- 确认
.env配置的端口和加密方式匹配:
- TLS加密对应端口通常为587
- SSL加密对应端口通常为465
- 25端口为非加密端口,绝大多数云服务商和邮件服务商已经屏蔽该端口的发信请求
内容的提问来源于stack exchange,提问作者AHHP
相关产品推荐
相关产品推荐

