You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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');
    }
}

排查与解决建议

  1. 验证Mailtrap凭据与网络连接

    • 登录Mailtrap后台确认MAIL_USERNAME和MAIL_PASSWORD是否正确,可能是凭据过期或后台配置变更;
    • 用nc -zv smtp.mailtrap.io 2525命令测试SMTP端口是否能连通,排查防火墙、代理或ISP限制导致的网络问题。
  2. 改用异步队列发送邮件
    同步发送会阻塞请求,一旦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

  3. 排查附件问题

    • 确认public_path($invitation["attachmentPath"])指向的文件存在且权限正常;
    • 先注释掉attach()代码,测试是否还超时,判断是否是附件过大或读取异常导致的卡住。
  4. 查看Laravel日志
    打开storage/logs/laravel.log,里面会有超时背后的具体错误细节(比如SMTP认证失败、DNS解析错误等),是最直接的排查线索。

  5. 临时调整超时(仅用于排查)
    在控制器开头加ini_set('max_execution_time', 120);,临时调高执行时间,看是否能发送成功,判断是单纯超时还是连接故障。


内容的提问来源于stack exchange,提问作者Bachar ELkarni

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.24 10:48:17