philsown/maileable

Maileable,一个用于为 Laravel Mailable 消息添加过滤器的库

dev-develop 2020-05-26 12:26 UTC

README

此代码处于积极开发中,没有发布。请勿使用此库。这主要在github上,所以Paul可以阅读它。嗨,Paul!

关于 Maileable

Maileable 是一个用于为 Laravel Mailable 消息添加过滤器的库,可以在消息发送之前修改 Mailable 或 Swift_Message 对象。将其视为电子邮件的响应中间件。

“Maileable” 这个名字是对“malleable”(可塑的)一词的戏谑,在英语中,除了其他含义外,还意味着“易受影响;柔韧的”。这个库的目标是在发送消息之前轻松更改消息。

为什么

示例目录中有几个案例,例如确保发件人有姓名并且格式整洁,在邮件主题前添加品牌,或在邮件正文中添加或修改内容。最后一个案例最好使用 Blade 模板处理,但这里演示了概念。您可以修改电子邮件标题。记录。我相信还有很多想法。

为什么不用 Illuminate\Mail\Events\MessageSending 事件?嗯,是的,你也可以这样做,我想。这基本上给你提供了分组你的 Mailable 命名空间(如 Mail\OrdersMail\Newsletter)并基于命名空间应用过滤器的可能性。

如何

安装

使用 Composer 安装。

将仓库添加到你的 composer.json 文件中。

{
    "repositories": [
        {
            "type": "git",
            "url": "https://github.com/philsown/maileable"
        }
    ]
}

minimum-stability 设置为 dev

{
    "minimum-stability": "dev",
}

使用 require 命令安装。

$ composer require philsown/mailable

将服务提供者添加到 config/app.php 提供者的数组中。

<?php

return [
    // ...
    'providers' => [
        // ...

        /*
         * Application Service Providers...
         */
        App\Providers\AppServiceProvider::class,
        App\Providers\AuthServiceProvider::class,
        // App\Providers\BroadcastServiceProvider::class,
        App\Providers\EventServiceProvider::class,
        App\Providers\RouteServiceProvider::class,

        // add Maileable anywhere in here, really
        Maileable\Providers\MailFilterServiceProvider::class,
    ],
    // ...
];

发布供应商配置。

$ php artisan vendor:publish --provider=Maileable\Providers\MailFilterServiceProvider --tag=config

这将创建 config/maileable.php。编辑此文件以将过滤器连接到你的 Mailable。下面将进行解释。

使用

简短版本

  1. 更新 Mailable 的 use 语句以使用 Maileable 的类,抱歉 :(
  2. 使用 make:mailfilter 生成器创建一个邮件过滤器。
  3. 完善过滤器方法。
  4. 在发布的 config/maileable.php 文件中将过滤器连接起来。

长版本

步骤 1:更新现有 Mailable 类中的 Mailable use 语句

对此表示歉意。如果有人知道如何解决这个问题,我将非常乐意听取。

<?php
# app/Mail/YourEmail.php

namespace App\Mail;

// Change this line in your Mailable class
use Maileable\Mail\Mailable;

// everything else is the same
class YourEmail extends Mailable
{
    public function build()
    {
        // the rest of this class is unchanged
    }
}

步骤 2:使用生成器创建邮件过滤器

有一个生成器可以使用这个 artisan 命令

$ php artisan make:mailfilter YourFilterName

此命令除了名称外没有其他参数。这将从一个位于 app\Mail\Filters 目录的存根中创建一个邮件过滤器,如果该目录不存在,则创建该目录。

步骤 3:完善过滤器类的过滤器方法

选择您要过滤的类是 \Swift_Message 还是 Illuminate\Mail\Mailable

如果您想过滤 \Swift_Message 类,将 $modifies 设置为 'swift'(或者去掉它并让它默认来自 FilterAbstract)。这是默认设置,让您可以轻松地调整电子邮件消息的细节。此过滤发生在邮件发送器调用 Illuminate\Mail\Mailable::runCallbacks 时,基本上是在最后可能的点。

如果您想过滤 Illuminate\Mail\Mailable,请将 $modifies 设置为 'mailable'。如果您想使用 Mailable 类中包含的任何信息,例如获取 Mailable 的类名或视图名,这很有用。这个过滤操作发生在调用 Mailable::send 方法时。这只是做事的一种稍微不同一点的方法,但我认为有一个选择是好的。

使用 @param phpdoc 告诉您的 IDE 消息变量的类型。

对于 \Swift_Message,使用

<?php
    /**
     * Filter
     *
     * @param Swift_Message $message
     *
     * @return void
     */
    public function filter($message)

对于 Illuminate\Mail\Mailable,使用

<?php
    /**
     * Filter
     *
     * @param Mailable $message
     *
     * @return void
     */
    public function filter($message)

然后简单地用一些执行您所需操作的代码填充过滤方法。

<?php

    // ...

    /**
     * Filter
     *
     * @param Mailable $message
     *
     * @return void
     */
    public function filter($message)
    {
        $froms = $message->from;

        foreach ($froms as &$from) {
            if ('contact@mycompany.com' != $from['address'] || !empty($from['name'])) {
                continue;
            }

            $from['name'] = 'My Company';
        }

        $message->from = $froms;
    }

    // ...

步骤 4。将过滤方法连接到上面发布的 config/maileable.php 文件

将过滤连接到配置文件 config/maileable.php 中的各种 Mailable 类。这是通过使用模式选择类,然后为匹配该模式的 Mailable 分配一个或多个过滤器来实现的。

<?php

return [
    'filters' => [
        'App\Mail\*' => [
            \App\Mail\Filters\ThinkBeforeYouPrint::class,
            \App\Mail\Filters\AddSubjectBranding::class,
        ],
        'App\Mail\Orders\*' => [
            \App\Mail\Filters\ShippingDisclaimer::class,
        ],
        'App\Mail\Newsletter\*' => [
            \App\Mail\Filters\AddUnsubscribeHeaders::class,
        ],
    ],
];

支持和问题

可能存在很多问题,我从未在队列消息中使用过它,所以... YMMV。但是,试试看,让我知道进展情况或者如果您需要帮助的话!

贡献

感谢您的关注!要贡献,请fork这个仓库并提交一个pull request。

许可

Maileable 是开源软件,许可协议为 MIT 许可