skitlabs/laravel-mailgun-multiple-domains

支持多个发件域名,无需修改调用代码

3.0.0 2022-03-15 10:53 UTC

This package is auto-updated.

Last update: 2024-09-22 10:59:29 UTC


README

仅从一个域名发送邮件时,通过 Mailgun 发送邮件非常简单。
对于任何额外的域名,调用代码需要确定使用哪个邮件传输。
当使用依赖于发件人的邮件程序时,这可能会特别麻烦,这通常是在可邮寄对象内部设置的。

使用此包后,调用代码不再关注配置的邮件程序。

<?php declare(strict_types=1);

// app/Mail/ImportantMessage.php
class ImportantMessage extends \Illuminate\Mail\Mailable
{
    public function build() : self
    {
        return $this
            ->subject('Important message')
            ->from('you@acme.tld') // The sender is often determined _inside_ the mailable
            ->view('...', []);
    }
}

/** @var \App\Mail\ImportantMessage $mailable */

// Without this package, the calling code has to select the right mailer 
\Illuminate\Support\Facades\Mail::mailer('mailgun-acme.tld')->to('j.doe@example.net')->queue($mailable);

// This package will handle the mailer configuration for you. So the above is as simple as;
\Illuminate\Support\Facades\Mail::to('j.doe@example.net')->queue($mailable);

安装

您可以通过 composer 安装此包

composer require skitlabs/laravel-mailgun-multiple-domains

工作原理

此包包含一个监听器,它连接到 Illuminate\Mail\Events\MessageSending 事件,该事件在发送电子邮件之前分发。
然后,根据消息中的 from 域重新配置当前 Transport。这对直接和队列消息都有效,无需额外配置!

感谢 Laravel 的自动发现(❤),无需组装!

要求

为此功能正常工作,有一些要求;

  • PHP 8.0 或 8.1
  • Laravel >= 9.0
  • Laravel 需要内部使用 symfony/mailer(默认)

旧版本

尚未使用 Laravel 9?此包的版本 2 支持 Laravel 7 和 8。

composer require skitlabs/laravel-mailgun-multiple-domains=^2.0

用法

如果您已将 mailgun 配置在 mg.{domain.tld} 下,并且您的密钥对所有要发送的域名都有效;您就可以开始发送电子邮件了!👍

假设您正在以 sales@acme.app 的身份发送消息。在发送消息之前,此包将设置 mailgun 域名为:mg.acme.app

如果我需要针对每个域名自定义设置怎么办?

将发送域名添加到您的 mailgun 配置中的 domains 键。

如果没有指定域名,则默认为 mg.{domain.tld}
如果未配置 secretendpoint,则默认使用您配置的全局默认值。

<?php declare(strict_types=1);

// config/services.php

return [
    // ... Other services

    'mailgun' => [
        'domain' => env('MAILGUN_DOMAIN'),
        'secret' => env('MAILGUN_SECRET'),
        'endpoint' => env('MAILGUN_ENDPOINT', 'api.mailgun.net'),
        'domains' => [
            'example.net' => [
                'domain' => 'custom-mg-domain.example.net',
                'secret' => 'overwrite-the-secret-or-null',
                'endpoint' => 'overwrite-the-endpoint-or-null',
            ],
            'awesome.app' => [
                'secret' => 'only-change-the-secret-for-this-domain',
            ],
        ],
    ],
];

如果我需要自定义如何确定这些设置怎么办?

如果标准的解析发件人属性的方法不适用于您的用例,请创建一个实现 MailGunSenderPropertiesResolver 的自定义解析器。查看 默认实现 以获取灵感。

一旦您有了自己的具体实现,就可以在您的任何服务提供程序中覆盖默认绑定;

<?php declare(strict_types=1);

use Illuminate\Support\ServiceProvider;
use SkitLabs\LaravelMailGunMultipleDomains\Contracts\MailGunSenderPropertiesResolver;

// app/Providers/AppServiceProvider.php
class AppServiceProvider extends ServiceProvider
{
    public function register()
    {
        // ...

        $this->app->bind(MailGunSenderPropertiesResolver::class, static function () : MailGunSenderPropertiesResolver {
            return new \Acme\CustomSenderPropertiesResolver();        
        });
    }
}

如果我的邮件程序有不同的名称怎么办?

在实例化 ReconfigureMailGunOnMessageSending 时,指定您的邮件程序名称作为第二个参数。

<?php declare(strict_types=1);

use Illuminate\Support\Facades\Config;
use SkitLabs\LaravelMailGunMultipleDomains\Contracts\MailGunSenderPropertiesResolver;
use SkitLabs\LaravelMailGunMultipleDomains\Listeners\ReconfigureMailGunOnMessageSending;

Config::set('mail.default', 'custom-mailer-name');
Config::set('mail.mailers.custom-mailer-name', [
    'transport' => 'mailgun',
]);

/** @var MailGunSenderPropertiesResolver $resolver */
$handler = new ReconfigureMailGunOnMessageSending($resolver, 'custom-mailer-name'); 

测试

composer test

变更日志

有关最近更改的更多信息,请参阅 CHANGELOG

许可

MIT 许可证(MIT)。有关更多信息,请参阅 许可文件