mehr-it / lara-ses-ext
扩展AWS SES邮件传输驱动和SES通知处理
Requires
- php: >=7.1.0
- ext-json: *
- aws/aws-sdk-php: ^3.107.1
- laravel/framework: ^7.0|^8.0
Requires (Dev)
- orchestra/testbench: ^5.0|^6.0
- phpunit/phpunit: ^7.4|^8.0
README
本软件包实现了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。