diff --git a/src/Mailer.php b/src/Mailer.php index 2890fc7..ad6da86 100644 --- a/src/Mailer.php +++ b/src/Mailer.php @@ -29,10 +29,25 @@ class Mailer extends CApplicationComponent */ public $dsn; + /** + * @var array the default headers to be applied for each sending email. + * For example: + * + * ``` + * [ + * 'From' => 'My App', + * 'Bcc' => 'test-bcc@example.com', + * 'X-Custom-Header' => 'foobar', + * ] + * ``` + */ + public $defaultHeaders = []; + /** * @var \Symfony\Component\Mailer\Mailer Swift mailer instance. */ private $_symfonyMailer; + /** * @var \Symfony\Component\Mailer\Transport\TransportInterface|\Closure|string|null transport instance or its class name or factory PHP callback. */ @@ -40,6 +55,13 @@ class Mailer extends CApplicationComponent public function send(RawMessage $message, ?Envelope $envelope = null): void { + foreach ($this->defaultHeaders as $name => $value) { + if (in_array(strtolower($name), ['from', 'to', 'cc', 'bcc', 'reply-to'])) { + $value = (array) $value; + } + $message->getHeaders()->addHeader($name, $value); + } + $this->getSymfonyMailer()->send($message, $envelope); } diff --git a/tests/MailerTest.php b/tests/MailerTest.php index f7a3725..0419e1f 100644 --- a/tests/MailerTest.php +++ b/tests/MailerTest.php @@ -5,6 +5,7 @@ use Symfony\Component\Mailer\Mailer as SymfonyMailer; use Symfony\Component\Mailer\Transport\Smtp\SmtpTransport; use Symfony\Component\Mailer\Transport\NullTransport; +use Symfony\Component\Mime\Email; use Yii; use yii1tech\mailer\Mailer; use yii1tech\mailer\transport\ArrayTransport; @@ -73,4 +74,32 @@ public function testSetupSymfonyMailer(): void $mailer->setSymfonyMailer($symfonyMailer); $this->assertSame($symfonyMailer, $mailer->getSymfonyMailer()); } + + public function testDefaultHeaders(): void + { + $transport = new ArrayTransport(); + + /** @var Mailer $mailer */ + $mailer = Yii::createComponent([ + 'class' => Mailer::class, + 'transport' => $transport, + 'defaultHeaders' => [ + 'From' => 'My App', + 'Bcc' => 'test-bcc@example.com', + ], + ]); + + $email = new Email(); + $email->addTo('test@example.com'); + $email->subject('Test subject'); + $email->text('Test body'); + + $mailer->send($email); + + $sentMessage = $transport->getLastSentMessage(); + + $this->assertSame('noreply@example.com', $sentMessage->getFrom()[0]->getAddress()); + $this->assertSame('My App', $sentMessage->getFrom()[0]->getName()); + $this->assertSame('test-bcc@example.com', $sentMessage->getBcc()[0]->getAddress()); + } } \ No newline at end of file