behzadsp / mail-tracker
从 https://github.com/jdavidbakr/mail-tracker 分支出的自定义软件包
Requires
- php: ^8.0
- aws/aws-php-sns-message-validator: ^1.1
- aws/aws-sdk-php: ^3.133
- guzzlehttp/guzzle: ^7.0.1
- illuminate/support: ~9.0
Requires (Dev)
- mockery/mockery: ^1.4.4
- orchestra/testbench: ~7.0
- phpunit/phpunit: ^9.5.10
Suggests
- fedeisas/laravel-mail-css-inliner: Automatically inlines CSS into all outgoing mail.
This package is auto-updated.
Last update: 2024-09-18 11:37:48 UTC
README
MailTracker 将与 Laravel 的所有 outgoing emails 集成,并向其中注入跟踪代码。它还会将渲染的邮件存储在数据库中。还有一个界面可以查看已发送的邮件。
注意:如果您正在使用 Laravel 9.x,则必须使用 9.6.0 或更高版本。
从 4.x 升级到 5.x
在 4.x 及之前的版本中,sent_emails 表中有一个 recipient
列,用于存储 RFC 标准的电子邮件格式 <Name> email@example.com
。5.x 已经更新为分别存储姓名和电子邮件。已从 sent_emails
表迁移中删除了 recipient
和 sender
列,但没有添加迁移来删除这些列。已添加访问器以保留模型的 recipient
和 sender
属性,因此除非您专门查询 sender
或 recipient
列,否则无需更新任何当前使用这些代码的代码。
为了在升级后保留现有数据,请运行 artisan 命令 mail-tracker:migrate-recipients
。这将把现有的 recipient
和 sender
数据转换为新的格式。在此之后,您可以删除 recipient
和 sender
列。
此外,sent_emails
表中还有一对新的属性:opened_at
和 clicked_at
。这些属性分别存储用户首次打开和点击的时间。这已被添加到默认的跟踪索引页面。您可以将它添加到您的页面中,或者根据您的需要使用这些值。
从 3.x 升级到 4.x
从 3.x 到 4.x 没有破坏性变更,除了 4.x 仅适用于 Laravel 7+。
从 2.x 升级到 3.x
与 3.0 版本的更新相比,有一个破坏性变更,特别是关于触发的事件。如果您正在监听 PermanentBouncedMessageEvent
以捕获所有无法投递的邮件,现在有两个单独的事件:PermanentBouncedMessageEvent
将仅在永久退回时触发,而新的 ComplaintMessageEvent
将在投诉时触发。还有一个新的 EmailDeliveredEvent
事件,它在每次成功的投递事件时触发。有关设置 SES/SNS 环境以接收有关这些事件的警报的信息,请参阅下面的文档。
从 2.0 或更早版本升级
首先,通过运行
composer require jdavidbakr/mail-tracker ~2.2
如果您是从早期版本更新,则需要更新配置文件并运行新的迁移。为了获得最佳结果,请备份 config/mail-tracker.php 和 resources/views/vendor/emailTrackingViews 中的视图(如果存在),以恢复您自定义的任何值,然后删除该文件并运行
php artisan vendor:publish
php artisan migrate
另外,请注意,从 2.1.13 版本开始,sent_emails_url_clicked
表的迁移已更改。更改是将 URL 列现在是一个 TEXT
字段,以便允许更长的 URL。如果您有一个旧系统,您可能需要手动更改该列;没有包含执行此更新的迁移。
安装
通过 Composer
composer require jdavidbakr/mail-tracker
发布配置文件和迁移
php artisan vendor:publish --provider="jdavidbakr\MailTracker\MailTrackerServiceProvider"
运行迁移
php artisan migrate
注意:如果您想使用不同的连接来存储模型,请在运行迁移之前更新 mail-tracker.php 配置条目的 connection
。
如果您想使用自己的迁移,可以通过调用MailTracker::ignoreMigrations()
跳过本库的迁移。例如
// In AppServiceProvider public function boot() { MailTracker::ignoreMigrations(); }
用法
安装完成后,所有发出的邮件都将记录到数据库中。以下配置选项可在config/mail-tracker.php中找到
- name:设置您的应用名称。
- inject-pixel:设置为true将在所有发出的HTML电子邮件中注入跟踪像素。
- track-links:设置为true将重写所有锚点href链接,以包含跟踪链接。链接将将用户带回到您的网站,然后记录点击后将他们重定向到最终目的地。
- expire-days:电子邮件应在数据库中保留的天数。如果您发送大量邮件,您可能希望最终过期。将其设置为零以从不从数据库中删除旧电子邮件。
- route:跟踪URL的路由信息。根据需要设置前缀和中间件。
- admin-route:管理员的路线信息。设置前缀和中间件。
- admin-template:管理员面板和视图的参数。您可以将现有的管理员面板与MailTracker管理员面板集成。
- date-format:您可以在管理员面板中定义显示日期的格式。
- content-max-size:您可以覆盖默认的最大长度限制,用于
content
数据库字段。如果您需要将其变长,不要忘记将其类型从text
更新。
如果您不希望跟踪电子邮件,则可以在消息中添加X-No-Track
标题。将任何随机字符串放入此标题中以防止跟踪。在发送之前,将删除电子邮件中的此标题。
\Mail::send('email.test', [], function ($message) { // ... other settings here $message->getHeaders()->addTextHeader('X-No-Track',Str::random(10)); });
关于开发测试的说明
有几个人报告在测试时跟踪像素不起作用。跟踪像素发生的情况是电子邮件客户端正在连接到您的网站以记录查看。为了使这种情况发生,图像必须在客户端可见,并且客户端必须能够连接到您的服务器。
当您处于开发环境时(即使用Valet的.test
域或其他仅您的计算机所知的域)您必须在计算机上有一个电子邮件客户端。使情况更复杂的是,Gmail和一些其他基于Web的电子邮件客户端不是直接连接到图像,而是通过代理连接。该代理将无法连接到您的.test
域,因此无法正确跟踪电子邮件。我总是建议在发送电子邮件时使用mailtrap.io,这对于任何开发环境都是如此。这不仅解决了问题(mailtrap.io不使用代理服务转发电子邮件中的图像),而且还保护您不会意外地从测试环境中发送真实电子邮件。
事件
当发送电子邮件、查看电子邮件或点击链接时,其跟踪信息将通过jdavidbakr\MailTracker\Model\SentEmail模型在数据库中进行计数。为了防止在邮件大爆发情况下使数据库过载,此处理是通过派发作业到队列中完成的。您可以通过mail-tracker.tracker-queue
配置设置选择这些事件通过哪个队列派发,或者将其留为null
以使用默认队列。通过使用非默认队列,您可以优先处理应用程序关键任务,而不是这些跟踪任务。
您可能希望在事件上进行附加处理,因此在这些情况下会触发事件
- jdavidbakr\MailTracker\Events\EmailSentEvent
- 公共属性
sent_email
包含SentEmail
模型
- 公共属性
- jdavidbakr\MailTracker\Events\ViewEmailEvent
- 公共属性
sent_email
包含SentEmail
模型 - 公共属性
ip_address
包含触发事件的IP地址
- 公共属性
- jdavidbakr\MailTracker\Events\LinkClickedEvent
- 公共属性
sent_email
包含SentEmail
模型 - 公共属性
ip_address
包含触发事件的IP地址 - 公共属性
link_url
包含点击的URL
- 公共属性
如果您使用的是Amazon SNS通知系统,则可以触发这些事件,以便进行附加处理。
- jdavidbakr\MailTracker\Events\EmailDeliveredEvent(当接收到“消息已送达”事件时,您可能希望在数据库中将电子邮件标记为“良好”或“已送达”)
- 公共属性
sent_email
包含SentEmail
模型 - 公共属性
email_address
包含触发事件的特定地址
- 公共属性
- jdavidbakr\MailTracker\Events\ComplaintMessageEvent(当接收到投诉,例如被标记为“垃圾邮件”时,您可能希望从数据库中删除电子邮件)
- 公共属性
sent_email
包含SentEmail
模型 - 公共属性
email_address
包含触发事件的特定地址
- 公共属性
- jdavidbakr\MailTracker\Events\PermanentBouncedMessageEvent(当收到永久性退信时,您可能希望将电子邮件标记为“不良”或从数据库中删除)jdavidbakr\MailTracker\Events\TransientBouncedMessageEvent(当收到暂时性退信时。检查事件的公共属性
bounce_sub_type
和diagnostic_code
以确定在接收到此事件时是否需要执行附加处理。)- 公共属性
sent_email
包含SentEmail
模型 - 公共属性
email_address
包含触发事件的特定地址
- 公共属性
要安装事件监听器,您需要创建如下文件
<?php namespace App\Listeners; use jdavidbakr\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 // Access the IP address that triggered the event using $event->ip_address } }
<?php namespace App\Listeners; use jdavidbakr\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 = [ 'jdavidbakr\MailTracker\Events\EmailSentEvent' => [ 'App\Listeners\EmailSent', ], 'jdavidbakr\MailTracker\Events\ViewEmailEvent' => [ 'App\Listeners\EmailViewed', ], 'jdavidbakr\MailTracker\Events\LinkClickedEvent' => [ 'App\Listeners\EmailLinkClicked', ], 'jdavidbakr\MailTracker\Events\EmailDeliveredEvent' => [ 'App\Listeners\EmailDelivered', ], 'jdavidbakr\MailTracker\Events\ComplaintMessageEvent' => [ 'App\Listeners\EmailComplaint', ], 'jdavidbakr\MailTracker\Events\PermanentBouncedMessageEvent' => [ 'App\Listeners\BouncedEmail', ], ];
传递数据到事件监听器
通常,您可能需要将发送的电子邮件与另一个模型关联起来。处理此问题的最佳方法是向您的 outgoing 电子邮件添加一个标题,您可以在事件监听器中检索它。以下是一个示例
/** * 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-ID',$model->id); });
然后在您的事件监听器中
public function handle(EmailSentEvent $event)
{
$tracker = $event->sent_email;
$model_id = $event->sent_email->getHeader('X-Model-ID');
$model = Model::find($model_id);
// Perform your tracking/linking tasks on $model knowing the SentEmail object
}
请注意,您附加到电子邮件的标题实际上会随消息一起发送,因此不要存储任何您不希望向电子邮件接收者公开的数据。
异常
以下异常可能会抛出。您可以在异常处理程序中将它们添加到忽略列表中,或按您喜欢的任何方式处理它们。
- jdavidbakr\MailTracker\Exceptions\BadUrlLink - URL 链接出现问题。基本上,系统无法正确解析 URL 链接以发送重定向。
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 中进行自定义。
贡献
请参阅 CONTRIBUTING 和 CONDUCT 以获取详细信息。
安全
如果您发现任何安全相关的问题,请通过电子邮件 me@jdavidbaker.com 联系我,而不是使用问题跟踪器。
鸣谢
许可
麻省理工学院许可证(MIT)。更多信息请参阅许可证文件。