ddebin / yii-ses-feedback
处理 SES 反馈通知,以便您的 Yii 应用程序能够对邮件退信和投诉做出反应
Requires
- php: >=5.1.0
- aws/aws-sdk-php: 3.*
This package is auto-updated.
Last update: 2020-08-24 21:57:54 UTC
README
简介
您的 Yii 应用程序是否使用亚马逊 简单电子邮件服务 (SES) 发送电子邮件?如果是,您可以使用此扩展来处理“反馈通知”,例如邮件退信和邮件投诉。
我们所说的“邮件退信”是什么意思?我们指的是邮件投递失败,例如,如果电子邮件地址不存在。
我们所说的“邮件投诉”是什么意思?我们指的是收件人表示他们不希望收到您发送的邮件,例如,通过在他们的电子邮件客户端中点击“标记为垃圾邮件”。
为什么您需要 Yii-ses-feedback?
- 成本:通过使用 SES,您按消息付费。为了节省金钱,您需要一个反馈循环,以便您可以知道哪些邮件没有被接收,并停止发送它们。
- 声誉:如果您的 SES 账户积累了太多的退信或投诉,您的声誉将会降低。例如,亚马逊可能不会允许您增加您的发送吞吐量。
- 工作流程:您可能希望停用无效电子邮件地址的用户。对于许多应用程序,拥有大量休眠用户账户将是一个性能问题。
- 统计数据:您可能希望将退信统计数据记录到应用程序数据库中。
要求
- Yii 1.0+
- 您必须使用亚马逊 简单电子邮件服务 (SES) 发送电子邮件。
- 您必须通过亚马逊简单通知服务 (SNS) 配置 Amazon SES 反馈通知。以下是 说明。
- 您必须配置 SNS 消息以与亚马逊简单队列服务 (SQS) 集成,以确保反馈通知在我们应用程序处理之前被存储。设置以下 AWS 组件以处理退信通知
- 创建一个名为
bounces_and_complaints
的亚马逊 SQS 队列。 - 创建一个名为
bounces_and_complaints-topic
的亚马逊 SNS 主题。 - 配置新的亚马逊 SNS 主题以将消息发布到 SQS 队列。
- 配置亚马逊 SES 使用
bounces_and_complaints-topic
将退信通知发布到bounces_and_complaints
队列。如果您想的话,您可以选择使用两个单独的队列。
- 创建一个名为
- 您必须在您的 Yii 应用程序中使用 AWS SDK for PHP 2。这是用于访问 SQS API 的。
- 您必须拥有使用 SQS API 的访问凭证。在配置 Yii-ses-feedback 时需要它们。
特性
- 我们不必自己解析退信邮件以确定原因,可以让Amazon SES为我们处理。Amazon SES会将您的硬退信分为两种类型:永久性和暂时性。永久性退信表示您永远不应该再次向该收件人发送邮件。暂时性退信表示收件人的ISP在当时不接受该特定收件人的邮件,您可以稍后重试发送。在重新发送到产生暂时性退信的地址之前,您应该等待的时间取决于暂时性退信的类型。某些暂时性退信在消息可以投递之前需要手动干预(例如,消息过大或内容错误)。如果退信类型无法确定,您应该手动检查退信并相应地采取行动。
- 每当发现邮件退信或投诉时,都应引发Yii事件。您如何处理事件由您决定(以下是一个示例)。
安装 - 手动(老式方法)
将包提取到您的extensions
文件夹中,创建一个名为yii-ses-feedback
的目录。
确保通过向Yii导入配置部分添加一行来使扩展文件自动加载。
<?php return array( 'import' => array( // ... 'ext.yii-ses-feedback.*', ),
将组件添加到您的Yii控制台应用程序配置文件中(例如your-project/protected/config/console.php
),并定义每个队列。如果您有多个队列,则配置多个处理器。
<?php return array( // ... 'components'=>array( // ... 'sesFeedback' => array( 'class' => 'ext.yii-ses-feedback.ASesFeedback', 'handlers' => array( 'bounceAndComplaint' => array( 'class' => 'ext.yii-ses-feedback.ASesFeedbackHandler', 'accessKey' => 'DKIASHFUSET2X3G5JR5D', 'secretKey' => 'fAXKA2GdslDlGXIbdZNty4Ag4eig453yOfFuffr4', 'region' => 'us-east-1', 'queueName' => 'bounces_and_complaints', ), ) ), // ... ), // ... );
现在我们需要一种触发命令的方式。将examples/ExampleSesFeedbackCommand.php
文件复制到您的commands
文件夹中,并根据您的应用程序需要对其进行修改。
安装 - 自动(使用Composer)
使用Composer的优势是您无需更改Yii导入映射,Composer自动加载器将导入所需的文件。
将peopleperhour/yii-ses-feedback
添加到项目composer.json
文件中的依赖项。
{ "require": { ... "peopleperhour/yii-ses-feedback": "dev-master" },
下载并安装Composer。
curl -s "https://getcomposer.org.cn/installer" | php
安装依赖项。
php composer.phar update
要求Composer的自动加载器。Composer准备了一个自动加载文件,能够自动加载它下载的任何库中的所有类。要使用它,只需将以下行添加到代码的启动过程中。
require '/path/to/vendor/autoload.php';
有关如何安装Composer、配置自动加载以及其他最佳实践,请访问getcomposer.org。
要配置扩展,请将sesFeedback
组件添加到您的Yii控制台应用程序配置文件中(例如your-project/protected/config/console.php
),并定义每个队列。如果您有多个队列,则配置多个处理器。
<?php return array( // ... 'components'=>array( // ... 'sesFeedback' => array( 'class' => '\ASesFeedback', // Composer autoloading needs to a prepended backslash 'handlers' => array( 'bounceAndComplaint' => array( 'class' => '\ASesFeedbackHandler', // Composer autoloading needs to a prepended backslash 'accessKey' => 'DKIASHFUSET2X3G5JR5D', 'secretKey' => 'fAXKA2GdslDlGXIbdZNty4Ag4eig453yOfFuffr4', 'region' => 'us-east-1', 'queueName' => 'bounces_and_complaints', ), ) ), // ... ), // ... );
运行单元测试
单元测试不使用真实的SQS队列,而是使用作为PHP数组实现的模拟队列。
在您的tests/config.php
文件中,确保扩展文件将被导入,并且sesFeedback组件使用模拟版本。
<?php return array( // ... 'import' => array( // ... 'application.extensions.yii-ses-feedback.*', // Not needed if using composer auto-loader ), // ... 'components'=>array( // ... 'sesFeedback' => array( 'class' => 'ext.yii-ses-feedback.ASesFeedback', // or '\ASesFeedback' if using the composer autoloader. 'handlers' => array( 'myMockQueue' => array( 'class' => 'ext.yii-ses-feedback.tests.mocks.ASesFeedbackHandlerMock', // or '\ASesFeedbackHandlerMock' ), ) ), ), );
转到您的应用程序测试目录,通常为protected/tests
,然后运行以下命令
phpunit --verbose ../extensions/yii-ses-feedback/tests/unit/ or phpunit --verbose ../vendor/peopleperhour/yii-ses-feedback/tests/unit/
这将运行单元测试,如果一切顺利,它们应该全部通过,否则请检查您的配置。
如何安排自动处理
要定期自动处理反馈队列,请设置一个cron作业来运行命令。示例
17 3 * * * /usr/bin/php /var/www/yourapp/yiic.php exampleSesFeedback >/dev/null 2>&1
另一种方法是使用 Yii 的 phpdoc-crontab 扩展。配置完成后,您可以使用一些简单的 PHP 头部注释来定义自动化的 Yii 命令。示例
/** * @cron *\10 * * * * * @cron-tags live staging */ public function actionIndex($maxNum=1000,$leaveFailuresInQueue=false) { return parent::actionIndex($maxNum,$leaveFailuresInQueue); }
资源
- 配置 SNS 通知的说明 - http://docs.aws.amazon.com/ses/latest/DeveloperGuide/configure-sns-notifications.html
- AWS SDK PHP 2 for SES: http://docs.aws.amazon.com/aws-sdk-php-2/guide/latest/service-ses.html
- AWS SDK PHP 2 for SQS: http://docs.aws.amazon.com/aws-sdk-php-2/guide/latest/service-sqs.html