transport(); $mailer = new Mailer($transport, new Logger('test'), 'platz@ep-reisen.de'); $report = $mailer->send( ['a@ep-reisen.de', new Address('b@ep-reisen.de', 'B')], 'Betreff', 'email/some', ['key' => 'value'], ); self::assertSame(2, $report->sent); self::assertSame(0, $report->failed); self::assertCount(2, $transport->sent); foreach ($transport->sent as $i => $email) { self::assertCount(1, $email->getTo()); self::assertSame(['a@ep-reisen.de', 'b@ep-reisen.de'][$i], $email->getTo()[0]->getAddress()); self::assertSame('platz@ep-reisen.de', $email->getFrom()[0]->getAddress()); self::assertSame('E&P Platz', $email->getFrom()[0]->getName()); self::assertSame('Betreff', $email->getSubject()); self::assertSame('email/some.html.twig', $email->getHtmlTemplate()); self::assertSame('email/some.txt.twig', $email->getTextTemplate()); self::assertSame(['key' => 'value'], $email->getContext()); } } public function testAFailedRecipientIsLoggedAndTheOthersStillGetTheirs(): void { $transport = $this->transport(failFor: 'kaputt@ep-reisen.de'); $log = new TestHandler(); $mailer = new Mailer($transport, new Logger('test', [$log]), 'platz@ep-reisen.de'); $report = $mailer->send(['a@ep-reisen.de', 'kaputt@ep-reisen.de', 'b@ep-reisen.de'], 'Betreff', 'email/some'); self::assertSame(2, $report->sent); self::assertSame(1, $report->failed); self::assertCount(2, $transport->sent); self::assertTrue($log->hasErrorThatContains('Email could not be sent.')); self::assertSame('kaputt@ep-reisen.de', $log->getRecords()[0]->context['recipient']); } public function testNoRecipientsSendsNothing(): void { $transport = $this->transport(); $mailer = new Mailer($transport, new Logger('test'), 'platz@ep-reisen.de'); $report = $mailer->send([], 'Betreff', 'email/some'); self::assertSame(0, $report->sent); self::assertSame([], $transport->sent); } /** * @return MailerInterface&object{sent: list} */ private function transport(?string $failFor = null): MailerInterface { return new class($failFor) implements MailerInterface { /** @var list */ public array $sent = []; public function __construct(private readonly ?string $failFor) { } public function send(RawMessage $message, ?Envelope $envelope = null): void { \assert($message instanceof TemplatedEmail); if ($message->getTo()[0]->getAddress() === $this->failFor) { throw new TransportException('550 mailbox unavailable'); } $this->sent[] = $message; } }; } }