覆盖Yii2 Swiftmailer收件人

时间:2016-11-10 22:30:36

标签: yii2 swiftmailer

我需要在整个Yii2应用程序中覆盖Swiftmailer send()函数的每个实例的收件人电子邮件。这是为了进行负载测试。

有一种简单的方法吗?或者至少有一种方法可以在不编辑Swiftmailer的供应商文件的情况下完成它?

1 个答案:

答案 0 :(得分:1)

如果仅用于测试,为什么不设置useFileTransport,以便电子邮件将保存在您选择的文件夹中而不是发送。为此,请按以下方式进行配置:

'components' => [
    // ...
    'mailer' => [
        'class' => 'yii\swiftmailer\Mailer',
        'useFileTransport' => true,
    ],
],

这将保存@runtime/mail文件夹中的所有电子邮件,如果您想要不同的一组:

'mailer' => [
    // ...
    'fileTransportPath' => '@runtime/mail', // path or alias here
],

如果您仍希望发送电子邮件并覆盖收件人,则可以延长yii\swiftmailer\Mailer课程。

class MyMailer extends \yii\swiftmailer\Mailer
{
    public $testmode = false;
    public $testemail = 'test@test.com';

    public function beforeSend($message)
    {
        if (parent::beforeSend($message)) {
            if ($this->testmode) {
                $message->setTo($this->testemail);
            }
            return true;
        }
        return false;
    }
}

配置它:

'components' => [
    // ...
    'mailer' => [
        'class' => 'namespace\of\your\class\MyMailer',
        // the rest is the same like in your normal config
    ],
],

您可以像使用mailer组件一样使用它。当它切换到测试模式时,修改配置:

'mailer' => [
    'class' => 'namespace\of\your\class\MyMailer',
    'testmode' => true,
    'testemail' => 'test222@test.com', // optional if you want to send all to address different than default test@test.com
    // the rest is the same like in your normal config
],

这样,每封电子邮件都会被收件人地址覆盖。