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

Laravel 5.2 如何重写Mailgun Transport支持多域名发送并创建自定义Facade

步骤1:重写Mailgun Transport类

创建自定义Transport文件 app/Transport/BusinessMailgunTransport.php,继承Laravel原生Mailgun传输类,修改域名注入逻辑:

<?php namespace App\Transport;

use GuzzleHttp\ClientInterface;
use Illuminate\Mail\Transport\MailgunTransport as BaseMailgunTransport;

class BusinessMailgunTransport extends BaseMailgunTransport
{
    public function __construct(ClientInterface $client, $secret, $domain)
    {
        // 传入自定义业务域名,覆盖默认读取逻辑
        parent::__construct($client, $secret, $domain);
    }
}

步骤2:创建业务邮件服务提供者

创建 app/Providers/BusinessMailServiceProvider.php,单独注册业务邮件服务实例,不影响默认邮件服务逻辑:

<?php namespace App\Providers;

use App\Transport\BusinessMailgunTransport;
use Illuminate\Mail\MailServiceProvider as BaseMailServiceProvider;
use Swift_Mailer;

class BusinessMailServiceProvider extends BaseMailServiceProvider
{
    public function register()
    {
        // 注册独立的业务邮件服务别名,不和默认mail服务冲突
        $this->app->bind('mail.business', function ($app) {
            $this->registerBusinessSwiftMailer($app);
            $mailer = $this->app->make('mailer');
            $mailer->setSwiftMailer($app['swift.mailer.business']);
            return $mailer;
        });
    }

    protected function registerBusinessSwiftMailer($app)
    {
        $app['swift.mailer.business'] = $app->share(function ($app) {
            $mailgunConfig = $app['config']->get('services.mailgun', []);
            // 实例化自定义传输类时传入业务专属域名
            $transport = new BusinessMailgunTransport(
                $app->make('GuzzleHttp\ClientInterface'),
                $mailgunConfig['secret'],
                $mailgunConfig['business_domain']
            );
            return new Swift_Mailer($transport);
        });
    }
}

步骤3:创建自定义Facade

创建 app/Facades/MailByBusiness.php,绑定刚才注册的业务邮件服务:

<?php namespace App\Facades;

use Illuminate\Support\Facades\Facade;

class MailByBusiness extends Facade
{
    protected static function getFacadeAccessor()
    {
        return 'mail.business';
    }
}

步骤4:注册配置

修改 config/app.php 文件,新增服务提供者和Facade别名:

  • 在providers数组末尾添加:
    App\Providers\BusinessMailServiceProvider::class,
    
  • 在aliases数组末尾添加:
    'MailByBusiness' => App\Facades\MailByBusiness::class,
    

注意:请确保.env文件中已经正确配置MAILGUN_DOMAIN、MAILGUN_DOMAIN_FOR_BUSINESS、MAILGUN_SECRET三个参数,且邮件驱动MAIL_DRIVER设置为mailgun

效果说明

  • 调用默认 Mail::send() 时,会继续使用原逻辑,读取MAILGUN_DOMAIN配置发送邮件
  • 调用 MailByBusiness::send() 时,会自动使用MAILGUN_DOMAIN_FOR_BUSINESS配置的业务域名发送
  • Laravel邮件所有原生方法(queue、raw、send等)都可以在MailByBusiness上正常使用,底层逻辑和默认邮件服务完全一致,仅发送域名不同

内容的提问来源于stack exchange,提问作者Hasan Hafiz Pasha

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 09:54:04