zanysoft/mail-tracker

记录并跟踪所有从Laravel发出的邮件

1.0 2020-12-04 13:32 UTC

This package is auto-updated.

Last update: 2024-09-16 09:16:50 UTC


README

Latest Version on Packagist Software License Total Downloads Travis

MailTracker将挂钩到Laravel的所有发出的邮件,并向其中注入跟踪代码。它还会将渲染的邮件存储在数据库中。还有一个界面可以查看已发送的邮件。

安装

通过Composer

$ composer require zanysoft/mail-tracker

发布配置文件和迁移

$ php artisan vendor:publish --provider="ZanySoft\MailTracker\MailTrackerServiceProvider"

运行迁移

$ php artisan migrate

注意:如果您想使用不同的连接来存储模型,请在运行迁移之前更新mail-tracker.php配置条目connection

用法

安装后,所有发出的邮件都将记录到数据库中。以下是在config/mail-tracker.php中可用的配置选项:

  • name:设置您的应用名称。
  • inject-pixel:设置为true以将跟踪像素注入所有发出的HTML电子邮件。
  • track-links:设置为true以将所有锚点href链接重写为包含跟踪链接。该链接将用户带回到您的网站,然后在记录点击后将他们重定向到最终目的地。
  • expire-days:电子邮件应保留在数据库中的天数。如果您发送大量邮件,您可能希望它最终过期。将其设置为零以从不从数据库中清除旧邮件。
  • route:跟踪URL的路由信息。根据需要设置前缀和中件。
  • admin-route:管理员的路由信息。设置前缀和中件。
  • admin-template:管理员面板和视图的参数。您可以将现有的管理员面板与MailTracker管理员面板集成。
  • date-format:您可以在管理员面板中定义显示日期的格式。

如果您不希望跟踪某些电子邮件,则可以在消息中添加X-No-Track头。将任何随机字符串放入此头以防止跟踪发生。在发送邮件之前,将删除该头。

\Mail::send('email.test', [], function ($message) {
    // ... other settings here
    $message->getHeaders()->addTextHeader('X-No-Track',Str::random(10));
});

事件

当发送电子邮件、查看电子邮件或点击链接时,其跟踪信息将使用ZanySoft\MailTracker\Model\SentEmail模型在数据库中进行计数。此处理通过向默认队列分派任务来完成,以防止在邮件大爆发情况下数据库被压垮。

您可能想要对这些事件进行进一步处理,因此在这些情况下会触发一个事件

  • ZanySoft\MailTracker\Events\EmailSentEvent
  • ZanySoft\MailTracker\Events\ViewEmailEvent
  • ZanySoft\MailTracker\Events\LinkClickedEvent

如果您使用Amazon SNS通知系统,则会触发这些事件,以便您可以进行进一步处理。

  • ZanySoft\MailTracker\Events\EmailDeliveredEvent(当您收到“消息已投递”事件时,您可能希望在数据库中将电子邮件标记为“良好”或“已投递”)
  • ZanySoft\MailTracker\Events\ComplaintMessageEvent(当您收到投诉时,例如标记为“垃圾邮件”,您可能希望从数据库中删除该电子邮件)
  • ZanySoft\MailTracker\Events\PermanentBouncedMessageEvent(当您收到永久退回时,您可能希望将电子邮件标记为不良或从数据库中删除它)

要安装事件监听器,您需要创建一个如下所示的文件

<?php

namespace App\Listeners;

use ZanySoft\MailTracker\Events\ViewEmailEvent;

class EmailViewed
{
    /**
     * Create the event listener.
     *
     * @return void
     */
    public function __construct()
    {
        //
    }

    /**
     * Handle the event.
     *
     * @param  ViewEmailEvent  $event
     * @return void
     */
    public function handle(ViewEmailEvent $event)
    {
        // Access the model using $event->sent_email...
    }
}
<?php

namespace App\Listeners;

use ZanySoft\MailTracker\Events\PermanentBouncedMessageEvent;

class BouncedEmail
{
    /**
     * Create the event listener.
     *
     * @return void
     */
    public function __construct()
    {
        //
    }

    /**
     * Handle the event.
     *
     * @param  PermanentBouncedMessageEvent  $event
     * @return void
     */
    public function handle(PermanentBouncedMessageEvent $event)
    {
        // Access the email address using $event->email_address...
    }
}

然后,您必须在您的\App\Providers\EventServiceProvider $listen数组中注册您想要处理的事件

/**
 * The event listener mappings for the application.
 *
 * @var array
 */
protected $listen = [
    'ZanySoft\MailTracker\Events\EmailSentEvent' => [
        'App\Listeners\EmailSent',
    ],
    'ZanySoft\MailTracker\Events\ViewEmailEvent' => [
        'App\Listeners\EmailViewed',
    ],
    'ZanySoft\MailTracker\Events\LinkClickedEvent' => [
        'App\Listeners\EmailLinkClicked',
    ],
    'ZanySoft\MailTracker\Events\EmailDeliveredEvent' => [
        'App\Listeners\EmailDelivered',
    ],
    'ZanySoft\MailTracker\Events\ComplaintMessageEvent' => [
        'App\Listeners\EmailComplaint',
    ],
    'ZanySoft\MailTracker\Events\PermanentBouncedMessageEvent' => [
        'App\Listeners\BouncedEmail',
    ],
];

向事件监听器传递数据

在许多情况下,您可能需要将一封已发送的电子邮件链接到另一个模型。处理这种情况的最好方法是向您的发件人电子邮件中添加一个标题,您可以在事件监听器中检索它。以下是一个示例

/**
 * Send an email and do processing on a model with the email
 */
\Mail::send('email.test', [], function ($message) use($email, $subject, $name, $model) {
    $message->from('from@johndoe.com', 'From Name');
    $message->sender('sender@johndoe.com', 'Sender Name');
    $message->to($email, $name);
    $message->subject($subject);

    // Create a custom header that we can later retrieve
    $message->getHeaders()->addTextHeader("X-MODEL", "Model Name");
    $message->getHeaders()->addTextHeader('X-Model-ID',$model->id);
});

然后在您的事件监听器中

public function handle(EmailSentEvent $event)
{
    $tracker = $event->sent_email;
    $model_id = $event->sent_email->getHeader('X-Model-ID');
    // or
    $model_id = $event->sent_email->getModelId();

    $model_name = $event->sent_email->getHeader('X-Model');
    // or
    $model_name = $event->sent_email->getModel();

    $model = app("App\\$model_name")->find($model_id);
    // Perform your tracking/linking tasks on $model knowing the SentEmail object
}

请注意,您附加到电子邮件的标题实际上会随消息一起发送,因此不要存储任何您不希望暴露给电子邮件收件人的数据。

异常

可能会抛出以下异常。您可以将它们添加到异常处理程序的忽略列表中,或者按您的意愿处理它们。

  • ZanySoft\MailTracker\Exceptions\BadUrlLink - URL链接出现问题。要么是base64编码的URL有问题(仅适用于通过2.1版本发送的邮件),要么找不到电子邮件哈希来应用链接。

Amazon SES功能

如果您使用Amazon SES,您可以在跟踪中添加一些附加信息。要设置SES回调,首先在SES控制面板中设置您域下的SES通知。然后通过转到通知主题的管理面板并创建一个订阅,为从管理页面复制的URL订阅主题。系统应立即响应该订阅请求。如果您愿意,可以使用多个订阅(例如,一个用于投递,一个用于退回)。请参阅上述失败的邮件上触发的事件。 为了增加安全性,建议将主题ARN设置到mail-tracker配置中。

视图

当您执行php artisan vendor:publish时,简单视图将添加到您的资源/views/vendor/emailTrakingViews中,您可以进行自定义。

管理面板

MailTracker附带内置管理区域。与包一起发布的默认配置将其放在can:see-sent-emails中间件后面;您可以为该规则创建一个门或将其更改为使用您自己的。您还可以更改默认前缀,甚至完全禁用管理路由。

路由名称是'mailTracker_Index'。标准管理面板路由位于/email-manager。您可以使用路由名称将它们包含到现有的管理菜单中。您可以在配置文件中自定义您的路由。您可以看到所有已发送的电子邮件、总打开次数、总URL点击次数、显示个别电子邮件和显示URL点击详细信息。

所有视图(电子邮件模板、面板)都可以在resources/views/vendor/emailTrakingViews中进行自定义。

安全

如果您发现任何与安全相关的问题,请通过info@zanysoft.net联系,而不是使用问题跟踪器。

许可证

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