Laravel 9发送邮件至Mailtrap无响应,触发超时错误
问题描述
我搞不懂现在的状况:正在开发的项目已经进行了一个月,几乎每天都会用Mailtrap测试邮件发送。昨天一切正常,但现在发送邮件时页面会一直加载,直到触发Maximum execution time of 60 seconds exceeded错误,而且Mailtrap收件箱里完全没收到邮件。
这明显不合理——$recipient变量只包含单个邮箱地址,发一封邮件不该花一分钟。
.env 配置
MAIL_MAILER=smtp MAIL_HOST=smtp.mailtrap.io MAIL_PORT=2525 MAIL_USERNAME= [hidden] MAIL_PASSWORD= [hidden] MAIL_ENCRYPTION=tls MAIL_FROM_ADDRESS=hello@example.com MAIL_FROM_NAME="${APP_NAME}"
MailController.php 代码片段
Mail::to($recipient)->send(new \App\Mail\InvitationMail($data[$userIndex],$recipient,$status,$invitation,$event,$Campaign)) ->attach(public_path($invitation["attachmentPath"]),['as' => $invitation['attachmentName']]); sleep(2);
App\Mail\InvitationMail 完整代码
<?php namespace App\Mail; use Illuminate\Bus\Queueable; use Illuminate\Mail\Mailable; use Illuminate\Queue\SerializesModels; class InvitationMail extends Mailable { use Queueable, SerializesModels; public $emailOfthisRecipient; public $CampaignStatus; public $invitationData; public $eventData; public $campaignData; public $dataRecipient; public function __construct($data,$recipient,$status,$invitation,$event,$Campaign) { $this->dataRecipient = $data; //^ done $this->emailOfthisRecipient = $recipient; //^ done $this->CampaignStatus = $status; //^ done $this->invitationData = $invitation; //^ done $this->eventData = $event; //^ done $this->campaignData = $Campaign; } /** * Build the message. * * @return $this */ public function build() { return $this->subject('Event Invitation')->view('emails.InvitationMail'); } }
排查与解决建议
验证Mailtrap凭据与网络连接
- 登录Mailtrap后台确认
MAIL_USERNAME和MAIL_PASSWORD是否正确,可能是凭据过期或后台配置变更; - 用
nc -zv smtp.mailtrap.io 2525命令测试SMTP端口是否能连通,排查防火墙、代理或ISP限制导致的网络问题。
- 登录Mailtrap后台确认
改用异步队列发送邮件
同步发送会阻塞请求,一旦SMTP响应慢就容易超时。把send()改成queue(),用队列异步处理:Mail::to($recipient)->queue(new \App\Mail\InvitationMail($data[$userIndex],$recipient,$status,$invitation,$event,$Campaign)) ->attach(public_path($invitation["attachmentPath"]),['as' => $invitation['attachmentName']]);记得启动队列服务:
php artisan queue:work排查附件问题
- 确认
public_path($invitation["attachmentPath"])指向的文件存在且权限正常; - 先注释掉
attach()代码,测试是否还超时,判断是否是附件过大或读取异常导致的卡住。
- 确认
查看Laravel日志
打开storage/logs/laravel.log,里面会有超时背后的具体错误细节(比如SMTP认证失败、DNS解析错误等),是最直接的排查线索。临时调整超时(仅用于排查)
在控制器开头加ini_set('max_execution_time', 120);,临时调高执行时间,看是否能发送成功,判断是单纯超时还是连接故障。
内容的提问来源于stack exchange,提问作者Bachar ELkarni
相关产品推荐
相关产品推荐

