Laravel发送邮件触发fwrite()错误,附.env配置求排查
这个errno=10054错误本质是TCP连接被远程SMTP服务器强制关闭,结合你的.env配置(使用Mailtrap的SMTP服务),我整理了几个按优先级排序的排查方向:
1. 优先验证Mailtrap凭证有效性
Mailtrap的测试SMTP凭证和具体收件箱绑定,很容易出现以下问题:
- 你切换了Mailtrap里的测试收件箱,但.env里的
MAIL_USERNAME和MAIL_PASSWORD还是旧收件箱的信息 - 测试凭证出现异常(虽然Mailtrap测试凭证一般不会过期,但偶尔会有特殊情况)
解决方法:登录你的Mailtrap后台,找到当前使用的测试收件箱,复制它的SMTP配置信息,和.env里的内容逐行对比,确保完全一致。
2. 检查SMTP端口与加密方式的匹配性
你当前用的PORT=2525 + ENCRYPTION=tls组合本身是Mailtrap支持的,但部分网络环境可能会屏蔽2525端口。可以尝试切换到其他Mailtrap支持的端口组合:
- 端口465 + 加密方式
ssl - 端口587 + 加密方式
tls
修改.env后,务必运行以下命令清除Laravel配置缓存,确保新配置生效:
php artisan config:clear php artisan cache:clear
3. 排查网络连接层面的问题
这个错误大概率和网络限制有关,比如:
- 服务器/本地机器的防火墙、安全组阻止了出站连接到
smtp.mailtrap.io的对应端口 - 代理、VPN或者ISP限制了SMTP流量
测试方法:在你的服务器或本地终端运行telnet命令测试连接:
telnet smtp.mailtrap.io 2525
如果连接失败(提示无法打开连接),你需要:
- 检查服务器防火墙规则,开放对应端口的出站权限
- 联系主机提供商确认是否有SMTP端口限制
4. 修复.env里的格式错误
注意你.env里的MAIL_FROM_NAME用了HTML实体",这在.env文件里是无效的,应该改成标准的双引号:
MAIL_FROM_NAME="${APP_NAME}"
或者直接写死名称:
MAIL_FROM_NAME="Your App Name"
5. 排除Laravel框架层面的问题
如果上面的步骤都没解决,可以写一个简单的独立PHP脚本(用PHPMailer)测试SMTP连接,排除Laravel框架的问题:
<?php require 'vendor/autoload.php'; use PHPMailer\PHPMailer\PHPMailer; use PHPMailer\PHPMailer\SMTP; use PHPMailer\PHPMailer\Exception; $mail = new PHPMailer(true); try { $mail->isSMTP(); $mail->Host = 'smtp.mailtrap.io'; $mail->SMTPAuth = true; $mail->Username = '4fe075e8cb5300'; $mail->Password = '5800191ac8e718'; $mail->SMTPSecure = PHPMailer::ENCRYPTION_STARTTLS; $mail->Port = 2525; $mail->setFrom('hello@example.com', 'Your App'); $mail->addAddress('your-test-email@example.com'); $mail->isHTML(true); $mail->Subject = 'SMTP Connection Test'; $mail->Body = 'This is a test to verify SMTP connectivity'; $mail->send(); echo 'Test email sent successfully!'; } catch (Exception $e) { echo "Error: {$mail->ErrorInfo}"; }
如果这个脚本也报错,那问题肯定出在SMTP服务器或网络上;如果脚本能成功发送,那你需要重新检查Laravel的邮件配置,比如是否有自定义的邮件服务提供者覆盖了默认配置。
6. 确认Mailtrap服务状态
偶尔Mailtrap的SMTP服务会出现临时故障,你可以查看Mailtrap后台的状态通知,确认服务是否正常运行。
内容的提问来源于stack exchange,提问作者FLASH TUBE

