我正在运行一些单元测试,其中一项测试检查是否生成并发送了电子邮件。
我已经检查了文档,以强制Yii将电子邮件保存到文件中,而不是发送,我已按如下方式配置mailer
组件:
'mailer' => [
'class' => 'yii\swiftmailer\Mailer',
'viewPath' => '@common/mail',
// send all mails to a file by default. You have to set
// 'useFileTransport' to false and configure a transport
// for the mailer to send real emails.
'useFileTransport' => true
],
运行测试时,我看到Yii::info
函数发出的BaseMailer send()
消息。
[yii \ mail \ BaseMailer :: send]“将电子邮件“直接付款通知”发送到“ test@test.co.uk””
但是电子邮件没有保存在任何地方,应该为runtime/mail
,也不会发送到任何地方。
我尝试使用以下命令在运行时设置useFileTransport
:
$mailer = Yii::$app->mailer;
$mailer->useFileTransport = true;
$mailer->composer...
但是没有任何变化,我们将不胜感激。
答案 0 :(得分:1)
查看文档yii\mail\BaseMailer::useFileTransport
(如果启用),则该选项将强制将邮件数据保存到本地文件中,而不是定期发送。这些文件将保存在yii\mail\BaseMailer::fileTransportPath
下,默认情况下为@runtime/mail
。
因此,请检查您的目录权限(如果可以),可以使用fileTransportPath
将其更改为您知道不会有权限问题的任何其他目录。
'mailer' => [
'class' => 'yii\swiftmailer\Mailer',
'viewPath' => '@common/mail',
// send all mails to a file by default. You have to set
// 'useFileTransport' to false and configure a transport
// for the mailer to send real emails.
'useFileTransport' => true,
'fileTransportPath'=>'your/path',
],
答案 1 :(得分:1)
密码接收器会覆盖您的邮件收发器设置([1] [2])来使用custom mailer,它不会发送或保存任何内容。这很有意义-您不想在测试期间发送一堆电子邮件。
您可以使用Codeception自定义断言或方法来测试已发送的电子邮件:
$I->seeEmailIsSent(3); // Test that three emails was sent
$messages = $I->grabSentEmails();
$I->assertEquals('admin@site,com', $messages[0]->getTo());