如何获取使用 `array` 邮件驱动程序发送的消息?

Fin*_*sse 4 php laravel laravel-5

从 5.7 版开始,Laravel 建议array在测试期间使用Mail 驱动程序:

不幸的是,文档没有说明这个驱动程序。根据源代码,驱动程序将所有消息存储在内存中,而不实际发送它们。如何在单元测试期间获取存储的“发送”消息(以检查它们)?

are*_*eed 9

编辑:对于 Laravel 9+,请使用:

$emails = app()->make('mailer')->getSymfonyTransport()->messages();
dd($emails);
Run Code Online (Sandbox Code Playgroud)

确保您的邮件驱动程序已设置array在您的.envphpunit.xml文件中。

使用 Laravel 7+ 或者如果出现错误,Target class [swift.transport] does not exist请使用此方法获取使用阵列驱动程序发送的电子邮件列表:

$emails = app()->make('mailer')->getSwiftMailer()->getTransport()->messages();

$count = $emails->count();
$subject = $emails->first()->getSubject();
$to = $emails->first()->getTo();
$body = $emails->first()->getBody();
Run Code Online (Sandbox Code Playgroud)


Fin*_*sse 7

打电话app()->make('swift.transport')->driver()->messages()。返回值是Swift_Mime_SimpleMessage对象的集合。

一个完整的 PHPUnit 测试示例:

public function testEmail()
{
    Mail::to('user@example.com')->send(new MyMail);

    $emails = app()->make('swift.transport')->driver()->messages();
    $this->assertCount(1, $emails);
    $this->assertEquals(['user@example.com'], array_keys($emails[0]->getTo()));
}
Run Code Online (Sandbox Code Playgroud)

  • 这不适用于 Laravel 8。 `目标类 [swift.transport] 不存在。` 您应该使用 `app()->make('mailer')->getSwiftMailer()->getTransport()->messages( )` 代替。 (2认同)