Laravel 5.6及Homestead更新后MailTrap无法发件求助
我之前在升级Laravel到5.6版本并更新Homestead后,也碰到过和你一模一样的MailTrap发件问题,结合你的配置和已经做的操作,给你几个实用的排查方向:
修正MAIL_ENCRYPTION配置:
Laravel 5.6开始,.env文件里的null会被解析成字符串"null",而不是PHP的null值,这会导致SMTP加密设置异常。你可以把MAIL_ENCRYPTION=null改成MAIL_ENCRYPTION=(直接留空),或者明确设置为tls——MailTrap的2525端口是支持TLS加密的,这样更稳妥。检查Homestead的网络连通性:
有时候Homestead升级后,虚拟机的网络规则会变化,导致无法连接MailTrap服务器。你可以登录到Homestead虚拟机(vagrant ssh),执行以下命令测试连通性:telnet mailtrap.io 2525如果连接失败(显示无法打开连接),可以试试重启Homestead虚拟机(
vagrant reload --provision),或者检查虚拟机的防火墙设置是否阻止了2525端口的出站请求。查看Laravel日志定位具体错误:
不要盲目试配置,先看日志!打开storage/logs/laravel.log,搜索和邮件相关的错误信息(比如Swift_TransportException),里面会明确告诉你是认证失败、连接超时还是其他问题。比如我当时就是日志里提示“Invalid encryption type: null”,才发现是配置解析的问题。强制刷新配置并同步虚拟机:
你已经做了清缓存和重启,但有时候共享目录的.env文件修改可能没同步到虚拟机。试试在Homestead虚拟机里的项目根目录执行:php artisan config:clear php artisan cache:clear php artisan config:cache如果还是不行,执行
vagrant provision重新配置虚拟机,确保所有环境变量都正确加载。用原生SMTP测试排除Laravel框架问题:
写个简单的测试脚本,绕开Laravel的邮件系统,直接用SwiftMailer测试连接,这样能快速定位是框架配置问题还是底层网络/认证问题。比如在项目根目录创建test-mail.php:require 'vendor/autoload.php'; // 替换成你的MailTrap账号信息 $transport = (new Swift_SmtpTransport('mailtrap.io', 2525)) ->setUsername('XXX') ->setPassword('XXX') ->setEncryption(null); $mailer = new Swift_Mailer($transport); $message = (new Swift_Message('Test Mail from Homestead')) ->setFrom(['admin@foo.com' => 'John Smith']) ->setTo(['your-test-email@example.com']) ->setBody('If you get this, the SMTP connection works!'); try { $sent = $mailer->send($message); echo "Successfully sent $sent message(s)!"; } catch (Exception $e) { echo "Error: " . $e->getMessage(); }然后在虚拟机里执行
php test-mail.php,如果这个脚本能发邮件,那问题肯定出在Laravel的配置加载上;如果也失败,那就是网络或者MailTrap账号的问题。
内容的提问来源于stack exchange,提问作者Yahya Uddin

