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
相关产品推荐
相关产品推荐

