Laravel使用SMTP发邮件触发60秒执行超时错误求助
Laravel邮件发送超时错误排查与解决
报错信息
Maximum execution time of 60 seconds exceeded in
E:\xampp\htdocs\eCommerce\vendor\symfony\mailer\Transport\Smtp\Stream\SocketStream.php
on line 154
邮件类代码
class VerifyEmail extends Mailable { use Queueable, SerializesModels; public function __construct() { } public function envelope() { return new Envelope( subject: 'VerifyEmail', ); } public function content() { return new Content( view: 'Control.auth.Verify', ); } public function attachments() { return []; } }
可能的原因
- SMTP服务器连接异常:SMTP地址、端口填写错误,或者本地网络/防火墙阻止了与SMTP服务器的连接,导致程序持续等待响应触发超时。
- SSL/TLS配置问题:SMTP要求加密连接,但本地证书配置失效、未正确开启加密,导致握手过程卡住超时。
- 同步发送阻塞:在请求流程中同步发送邮件,当邮件服务响应缓慢时,超过PHP默认的
max_execution_time限制(XAMPP默认60秒)。 - 本地环境限制:XAMPP默认的PHP执行时间阈值较低,若邮件发送流程本身耗时较长(哪怕模板简单),也会触发超时。
解决方法
1. 校验SMTP配置准确性
打开项目根目录的.env文件,核对以下核心配置:
MAIL_MAILER=smtp MAIL_HOST=你的SMTP服务器地址(例如smtp.gmail.com) MAIL_PORT=对应端口(587对应tls,465对应ssl) MAIL_USERNAME=你的邮箱账号 MAIL_PASSWORD=邮箱授权码(非登录密码,如Gmail的应用密码) MAIL_ENCRYPTION=tls # 或ssl,需与端口匹配 MAIL_FROM_ADDRESS=发件邮箱 MAIL_FROM_NAME="${APP_NAME}"
确认地址、端口、加密方式完全匹配SMTP服务商的要求。
2. 改用队列异步发送邮件
你的邮件类已引入Queueable trait,直接切换为异步发送即可避免同步阻塞:
// 替换原同步发送代码 // Mail::to($user)->send(new VerifyEmail()); // 改为队列异步发送 Mail::to($user)->queue(new VerifyEmail()); // 或延迟发送 Mail::to($user)->later(now()->addMinutes(5), new VerifyEmail());
注意:需先配置队列驱动(如数据库、Redis),并启动队列监听:
php artisan queue:work
3. 临时调整PHP执行时间限制
若需临时测试同步发送,可在发送代码前添加:
set_time_limit(120); // 将执行时间设为120秒
或修改php.ini文件中的max_execution_time值为更大的数字(如120),修改后重启XAMPP的Apache服务。
4. 排查网络与SSL问题
- 用telnet测试SMTP端口是否开放:
telnet smtp.example.com 587
- 确认本地PHP已安装OpenSSL扩展,若证书有问题,可临时关闭加密(仅测试用,生产环境不推荐):将
MAIL_ENCRYPTION设为空,端口改用25(需SMTP服务器支持)。
内容的提问来源于stack exchange,提问作者yosry
相关产品推荐
相关产品推荐

