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

Laravel 6.2无需数据库全局重发发送失败邮件的方法

Laravel 6.2 全局邮件自动重发方案(无数据库依赖)

核心思路

通过包装Laravel原生的Mailer类,在不修改原有业务代码的前提下,全局添加邮件发送失败后的自动重试逻辑,无需依赖数据库存储重试任务。

实现步骤

1. 创建带重试逻辑的Mailer装饰器

新建app/Mail/RetryableMailer.php文件,封装原生Mailer并添加重试:

<?php

namespace App\Mail;

use Illuminate\Mail\Mailer;
use Illuminate\Support\Facades\Retry;

class RetryableMailer extends Mailer
{
    protected $originalMailer;

    public function __construct(Mailer $originalMailer)
    {
        $this->originalMailer = $originalMailer;
        // 复制原生Mailer的所有属性,保证原有功能正常
        foreach (get_object_vars($originalMailer) as $key => $value) {
            $this->$key = $value;
        }
    }

    public function send($view, array $data = [], $callback = null)
    {
        // 自定义重试规则:最多重试3次,每次间隔1秒
        return Retry::times(3)->sleep(1)->attempt(function () use ($view, $data, $callback) {
            $this->originalMailer->send($view, $data, $callback);
        });
    }
}

2. 全局替换Mailer绑定

在app/Providers/AppServiceProvider.php的register方法中,用装饰器替换原生Mailer:

<?php

namespace App\Providers;

use App\Mail\RetryableMailer;
use Illuminate\Mail\Mailer;
use Illuminate\Support\ServiceProvider;

class AppServiceProvider extends ServiceProvider
{
    public function register()
    {
        $this->app->extend(Mailer::class, function ($originalMailer, $app) {
            return new RetryableMailer($originalMailer);
        });
    }
}

自定义调整

  • 修改重试次数:将times(3)改为你需要的重试上限,比如times(5)
  • 修改重试间隔:将sleep(1)改为间隔秒数,比如sleep(2)表示每次重试间隔2秒
  • 精准捕获异常:可在attempt闭包内手动try-catch,仅对邮件传输异常(如Swift_TransportException)触发重试,避免无关异常干扰

优势

  • 全局生效:所有通过Mail门面或辅助函数发送的邮件都会自动应用重试逻辑,无需修改原有业务代码
  • 无数据库依赖:重试逻辑在内存中完成,不需要额外存储重试任务
  • 兼容原生功能:完全保留Laravel邮件系统的所有原有特性

内容的提问来源于stack exchange,提问作者Kavan Prajapati

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.23 04:27:30