henryavila/email-tracking

使用 Mailgun Hooks 跟踪电子邮件投递。所有数据都存储在 Email 模型的数据库中


README

使用 Laravel 跟踪电子邮件

放弃 Laravel Nova

由于我放弃了 Laravel Nova 以支持 Filament,因此此包将不再为 Laravel Nova 提供支持。此包与 Laravel Nova 相关的确切内容已移至新包 https://packagist.org.cn/packages/henryavila/laravel-nova-email-tracking 如果您正在使用 Laravel Nova,请使用此新包。

Mailgun 配置

在 Mailgun 界面上,向 URL <APP_URL>/webhooks/mailgun 添加一个 webhook

安装

https://laravel.net.cn/docs/master/mail#mailgun-driver 上设置 Laravel Mail 与 Mailgun

在您的 .env 文件中定义环境变量

MAIL_MAILER=mailgun
MAILGUN_DOMAIN=yourdomain.com
MAILGUN_SECRET=key-99999999999999999999999999999999

通过 composer 安装包

composer require henryavila/email-tracking

使用以下命令发布迁移并运行

php artisan vendor:publish --tag="email-tracking-migrations"
php artisan migrate

使用以下命令发布配置文件

php artisan vendor:publish --tag="email-tracking-config"

这是发布配置文件的内容

return [
    /**
     * if defined, the Email model will use this database connection.
     * This connection name must be defined in database.connections config file
     */
    'email-db-connection' => null,

    /**
     * Save the HTML Body of all sent messages
     */
    'log-body-html' => true,

    /**
     * Save the TXT Body of all sent messages
     */
    'log-body-txt' => true,
];

配置

在所有可以发送电子邮件的模型上添加 trait ModelWithEmailsSenderTrait

对于 Laravel 10,在 EventServiceProvider.php 文件中添加此代码

   protected $listen = [
        \Illuminate\Mail\Events\MessageSent::class => [
            \HenryAvila\EmailTracking\Listeners\LogEmailSentListener::class,
        ],
   ];

对于 Laravel 11,在 AppServiceProvider.phpboot() 方法中添加此代码

public function boot(): void
{
    // ...
    \Illuminate\Support\Facades\Event::listen(
        events: \Illuminate\Mail\Events\MessageSent::class,
        listener: \HenryAvila\EmailTracking\Listeners\LogEmailSentListener::class
    );
}

此时,从应用程序发送的所有电子邮件都将被记录在应用程序中,但发送者不会保存

保存电子邮件发送者

要能够跟踪电子邮件发送者,您必须创建一个自定义 MailableNotification

Mailable

创建新的 Mailable 时,必须扩展具有 HenryAvila\EmailTracking\Mail\TrackableMail 的类

此外,您必须更改构造函数和内容函数。

这是默认邮件类

class SampleMail extends \Illuminate\Mail\Mailable
{
    public function __construct()
    {
        //
    }

    public function content(): Content
    {
        return new Content(
            view: 'view.name',
        );
    }	
}

将类更改为以下内容

class SampleMail extends \HenryAvila\EmailTracking\Mail\TrackableMail
{
    public function __construct($modelSender)
    {
        $viewData = [];
        parent::__construct($modelSender, 'view.name', $viewData]);
    }
}

要发送 Mailable,只需在 Mailable 构造函数中传递模型即可

// example: Send the Sample Mail to User with id 1
$user = User::find(1);
Mail::to($user)->send(new App\Mail\SampleMail($user));

Notification

创建通知时,您只需更改 toMail() 方法。用以下代码替换默认代码

public function toMail($notifiable): MailMessage
{
    return (new MailMessage)
        ->line('The introduction to the notification.')
        ->action('Notification Action', url('/'))
        ->line('Thank you for using our application!');
}

用此代码替换

public function __construct(protected \Illuminate\Database\Eloquent\Model $model)
{
    //
}

public function toMail($notifiable): MailMessage
{
    return (new \HenryAvila\EmailTracking\Notifications\TrackableNotificationMailMessage($this->model))
        ->line('The introduction to the notification.')
        ->blankLine()
        ->line('Another line, after a blank line')
        ->blankLineIf($condition)
        ->action('Notification Action', url('/'))
        ->line('Thank you for using our application!');
}

要发送通知

// User with id 1 send the sample notification to multiple $clientes
$user = User::find(1);
Notification::send($clientes, new SampleNotification($user));

测试

composer test

变更日志

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

贡献

有关详细信息,请参阅 CONTRIBUTING

安全漏洞

有关报告安全漏洞的详细信息,请参阅 我们的安全策略

致谢

许可证

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