vorakraft10/laravel-mails

Laravel Mails可以收集您可能希望跟踪的所有关于您的Laravel应用程序已发送邮件的信息。

dev-main 2024-09-27 14:25 UTC

This package is auto-updated.

Last update: 2024-09-27 14:25:16 UTC


README

Total Downloads Tests PHPStan GitHub release (latest by date) Packagist PHP Version Support Latest Version on Packagist

很高兴见到你,我们是Vormkracht10

嗨!我们是荷兰尼姆根的一家网络开发公司,我们用Laravel做所有事情:功能丰富的先进网站和大型的网络应用程序。

为什么是这个包

电子邮件作为一种协议,非常容易出错。电子邮件成功送达并不能保证,因此最好实时监控您的电子邮件发送。使用外部服务(如Postmark或Mailgun)电子邮件通过提供日志记录和投递反馈等功能而变得更好,但仍需要您的关注,并且可能会默默地失败,后果严重。因此,我们创建了Laravel Mails来填补所有这些空缺。

使用Laravel,我们创建了包来缓解许多自己的痛点,因为我们遇到了客户和项目中的某些挑战。我们在13年的网络开发经验中遇到的一个问题是,客户联系我们就说他们的邮件没有送达。

有时这是因为代码中的错误,但很多时候是因为你事先想象不到的事情出了问题。如果它能失败,它就会失败。完全运用墨菲定律!电子邮件就是那种你不喜欢的事情。

由于我们厌倦了客户需要打电话给我们,我们希望在客户注意到之前就能知道并联系他们。因此,我们创建了这个包:记录我们发送的邮件发生的所有事件,并在有问题的迹象出现时自动通过Discord(或Slack、Telegram)通知。

功能

Laravel Mails可以收集您可能希望跟踪的所有关于您的Laravel应用程序已发送邮件的信息。此包中提供了常见的用例

  • 仅使用特定属性记录所有已发送的电子邮件、附件和事件
  • 目前适用于流行的电子邮件服务提供商Postmark和Mailgun
  • 使用webhooks从电子邮件提供商收集关于投递状态的反馈
  • 您可以将Laravel中发送的电子邮件直接关联到Eloquent模型,例如与Order模型关联的订单确认电子邮件
  • 当电子邮件硬/软弹回或弹回率过高时,快速自动通知
  • 定期修剪所有记录的电子邮件,以保持数据库整洁
  • 将记录的电子邮件重新发送到另一个收件人
  • 使用互补包Filament Mails在浏览器中查看所有已发送的电子邮件

即将推出的功能

我们目前正在编写对其他流行的电子邮件服务提供商(如Resend、SendGrid、Amazon SES和Mailtrap)的邮件事件支持。

寻找一个UI?我们为你准备好了:Filament Mails

我们创建了一个名为Filament Mails的Laravel Filament插件,以便轻松查看此Laravel Mails包收集的所有数据。

它可以在美观的UI中显示有关电子邮件和事件的全部信息

Filament Mails

安装

首先使用composer安装包

composer require vormkracht10/laravel-mails

然后您可以使用以下命令发布和运行迁移

php artisan vendor:publish --tag="mails-migrations"
php artisan migrate

将您的电子邮件服务提供商的API密钥添加到Laravel项目中的config/services.php文件中,目前我们支持Postmark和Mailgun

[
    'mailgun' => [
        'token' => '...',
    ],

    'postmark' => [
        'token' => '...',
    ]
]

完成后,使用您的服务提供商的slug运行此命令

php artisan mail:webhooks [service] // where [service] is your provider, e.g. postmark or mailgun

要更改配置,您可以使用以下命令发布配置文件

php artisan vendor:publish --tag="mails-config"

这是发布配置文件的内容

return [
    // Eloquent model to use for sent emails

    'models' => [
        'mail' => Mail::class,
        'event' => MailEvent::class,
        'attachment' => MailAttachment::class,
    ],

    // Table names for saving sent emails and polymorphic relations to database

    'database' => [
        'tables' => [
            'mails' => 'mails',
            'attachments' => 'mail_attachments',
            'events' => 'mail_events',
            'polymorph' => 'mailables',
        ],

        'pruning' => [
            'enabled' => true,
            'after' => 30, // days
        ],
    ],

    'headers' => [
        'uuid' => 'X-Mails-UUID',

        'associate' => 'X-Mails-Associated-Models',
    ],

    'webhooks' => [
        'routes' => [
            'prefix' => 'webhooks/mails',
        ],

        'queue' => env('MAILS_QUEUE_WEBHOOKS', false),
    ],

    // Logging mails
    'logging' => [

        // Enable logging of all sent mails to database

        'enabled' => env('MAILS_LOGGING_ENABLED', true),

        // Specify attributes to log in database

        'attributes' => [
            'subject',
            'from',
            'to',
            'reply_to',
            'cc',
            'bcc',
            'html',
            'text',
        ],

        // Encrypt all attributes saved to database

        'encrypted' => env('MAILS_ENCRYPTED', true),

        // Track following events using webhooks from email provider

        'tracking' => [
            'bounces' => true,
            'clicks' => true,
            'complaints' => true,
            'deliveries' => true,
            'opens' => true,
        ],

        // Enable saving mail attachments to disk

        'attachments' => [
            'enabled' => env('MAILS_LOGGING_ATTACHMENTS_ENABLED', true),
            'disk' => env('FILESYSTEM_DISK', 'local'),
            'root' => 'mails/attachments',
        ],
    ],

    // Notifications for important mail events

    'notifications' => [
        'mail' => [
            'to' => ['test@example.com'],
        ],

        'discord' => [
            // 'to' => ['1234567890'],
        ],

        'slack' => [
            // 'to' => ['https://hooks.slack.com/services/...'],
        ],

        'telegram' => [
            // 'to' => ['1234567890'],
        ],
    ],

    'events' => [
        'soft_bounced' => [
            'notify' => ['mail'],
        ],

        'hard_bounced' => [
            'notify' => ['mail'],
        ],

        'bouncerate' => [
            'notify' => [],

            'retain' => 30, // days

            'treshold' => 1, // %
        ],

        'deliveryrate' => [
            'treshold' => 99,
        ],

        'complained' => [
            //
        ],

        'unsent' => [
            //
        ],
    ],
];

用法

日志记录

当您使用Laravel中的Mail Facade或Mailable发送电子邮件时,Laravel Mails会记录电子邮件发送和来自您的电子邮件服务提供商的所有事件。

将电子邮件与Eloquent模型关联

...

重新发送已记录的电子邮件

...

在诸如退订、高退订率或垃圾邮件投诉等重要事件上接收通知

...

修剪已记录的电子邮件

...

事件

根据邮件提供商,我们从电子邮件服务提供商的webhook发送这些传入事件。

\Vormkracht10\Mails\Events\MailAccepted::class,
\Vormkracht10\Mails\Events\MailClicked::class,
\Vormkracht10\Mails\Events\MailComplained::class,
\Vormkracht10\Mails\Events\MailDelivered::class,
\Vormkracht10\Mails\Events\MailEvent::class,
\Vormkracht10\Mails\Events\MailEventLogged::class,
\Vormkracht10\Mails\Events\MailHardBounced::class,
\Vormkracht10\Mails\Events\MailOpened::class,
\Vormkracht10\Mails\Events\MailResent::class,
\Vormkracht10\Mails\Events\MailSoftBounced::class,
\Vormkracht10\Mails\Events\MailUnsubscribed::class,

测试

composer test

变更日志

有关最近更改的更多信息,请参阅变更日志

贡献

有关详细信息,请参阅贡献指南

安全漏洞

请查看我们的安全策略以了解如何报告安全漏洞。

致谢

许可

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