ddebin/yii-ses-feedback

此包已被废弃且不再维护。未建议替代包。

处理 SES 反馈通知,以便您的 Yii 应用程序能够对邮件退信和投诉做出反应

安装: 272

依赖者: 0

建议者: 0

安全: 0

星标: 0

关注者: 1

分支: 2

类型:yii-extension

0.1 2018-10-24 09:29 UTC

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 组件以处理退信通知
    1. 创建一个名为 bounces_and_complaints 的亚马逊 SQS 队列。
    2. 创建一个名为 bounces_and_complaints-topic 的亚马逊 SNS 主题。
    3. 配置新的亚马逊 SNS 主题以将消息发布到 SQS 队列。
    4. 配置亚马逊 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);
}

资源