Laravel发信报错Maximum execution time of 60 seconds exceeded
Laravel 邮件发送60秒超时问题修复
你遇到的Maximum execution time of 60 seconds exceeded报错本质是SMTP连接/发送流程卡住触发的脚本超时,不是PHP默认执行时长过短导致,代码里存在明确问题,按以下步骤修复即可:
- 修复.env配置的格式错误
你复制的Mailtrap配置里,MAIL_FROM_ADDRESS项等号后多了一个前置空格,会导致读取到的发件人地址携带非法字符,SMTP握手阶段直接卡住。将该行修改为:
修改完成后必须执行MAIL_FROM_ADDRESS=ranahamzaghy@gmail.comphp artisan config:clear清除Laravel的配置缓存,否则旧配置不会生效。 - 修复TestMail邮件类的参数接收逻辑
路由中实例化邮件类时传入了$details数组,但邮件类的构造函数既没有声明参数接收,也没有将数据传递给视图,虽然这个问题不会直接触发超时,但会导致邮件模板无法读取传入的邮件内容。修正后的app/Mail/TestMail.php代码如下:<?php namespace App\Mail; use Illuminate\Bus\Queueable; use Illuminate\Contracts\Queue\ShouldQueue; use Illuminate\Mail\Mailable; use Illuminate\Queue\SerializesModels; class TestMail extends Mailable { use Queueable, SerializesModels; public $details; /** * Create a new message instance. * * @return void */ public function __construct($details) { $this->details = $details; } /** * Build the message. * * @return $this */ public function build() { return $this->subject('Mail from rajtechnologies.com')->view('emails.mail'); } } - 连通性排查(配置修改后仍超时再做)
执行命令telnet smtp.mailtrap.io 2525测试本地到Mailtrap SMTP服务器的端口连通性,本地开发环境、云服务商经常会默认封禁25、2525等对外SMTP端口,会导致连接一直挂起直到触发超时。如果端口不通,更换Mailtrap提供的其他可用端口(比如465、587)同时对应修改MAIL_ENCRYPTION参数即可。 - 可选优化:避免请求阻塞
如果不想让用户请求等待邮件发送流程,可以让TestMail类实现ShouldQueue接口,将邮件发送任务丢到队列异步执行,从根源上避免请求等待超时。修改后类声明为:
之后启动队列进程class TestMail extends Mailable implements ShouldQueuephp artisan queue:work即可,发邮件逻辑会在后台执行,不会阻塞当前HTTP请求。
内容的提问来源于stack exchange,提问作者hamza nadeem
相关产品推荐
相关产品推荐

