mehr-it/lara-ses-ext

扩展AWS SES邮件传输驱动和SES通知处理

2.0.0 2020-12-09 07:00 UTC

This package is auto-updated.

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


README

Latest Version on Packagist Build Status

本软件包实现了Laravel中通过AWS SES发送邮件的扩展驱动。它在分发时触发一个自定义事件,包含传递的消息的精确副本,用于存档目的。

此外,还存在一个辅助函数,它将SES发布的状态通知转换为Laravel事件。

安装

composer require mehr-it/lara-ses-ext

本软件包使用Laravel的包自动发现,因此服务提供程序将自动加载。

邮件器配置

config/mail.php配置文件中将邮件器的传输选项设置为"ses-ext"

'mailers' => [
    'ses' => [
        'transport' => 'ses-ext',
    ]
]

请确保您的config/services.php配置文件包含以下选项

'ses' => [
    'key'    => 'your-ses-key',
    'secret' => 'your-ses-secret',
    'region' => 'ses-region',  // e.g. us-east-1
],

分发事件

SesMessageDispatched事件在消息传递给SES后立即由驱动程序触发。它包含SES分配的消息ID和传递的原始消息数据的副本。

您可以使用此信息来存档每个发送消息的精确副本。

添加自定义信息

有时在接收到分发事件时,了解发送消息的额外信息可能很有帮助。例如,如果需要将收件人的用户ID存储到邮件存档中。

使用ses-ext驱动程序,这可以通过在mailable中使用InternalMailHeaders特质并在build函数中调用withInternalHeader方法来实现

use InternalMailHeaders;

/**
 * Build the message.
 *
 * @return $this
 */
public function build()
{
    $this->view('emails.orders.shipped');

    $this->withInternalHeader('user-id', $userId);
}

内部标题不会发送到SES,但在发送消息之前被删除。

处理SesMessageDispatched事件时,可以轻松检索内部标题值。

$userId = $event->getInternalHeaderValue('user-id');

SES通知

AWS SES提供通知来监控发送活动。对于退回、投诉和投递,都可以接收到通知。要接收通知,SES必须配置为将它们发送到SNS主题。然后SNS可以将通知传递到您的应用程序,例如通过webhook或SQS队列。有关更多信息,请参阅AWS SES文档

接收SNS通知不在本库的范围内,但SesNotificationHandler类有助于将接收到的SES通知转换为Laravel事件。因此,必须将原始JSON通知字符串传递给handle方法

$handler = app(SesNotificationHandler::class);

$handler->handle('{"notificationType":"Delivery", "mail":{ ...} }');

handle方法解析JSON并使用应用程序事件分派器发出相应的事件。根据通知类型,触发以下事件之一

  • SesMessageDelivered - 当消息被投递时
  • SesMessageComplained - 当收到投诉时
  • SesMessageBounced - 当发生退回时

事件获取器提供对SES提供的所有通知信息的访问。

测试驱动程序

当使用其他邮件驱动程序(如数组驱动程序)测试您的应用程序时,不会触发SesMessageDispatched事件。如果测试依赖于该事件,可以使用"ses-ext-simulation"驱动程序。它的行为与"ses-ext"驱动程序完全一样,但不调用SES API。相反,生成并返回随机消息ID。