我需要在整个Yii2应用程序中覆盖Swiftmailer send()
函数的每个实例的收件人电子邮件。这是为了进行负载测试。
有一种简单的方法吗?或者至少有一种方法可以在不编辑Swiftmailer的供应商文件的情况下完成它?
答案 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
],
这样,每封电子邮件都会被收件人地址覆盖。