diff --git a/src/Symfony/Component/Mailer/EventListener/EnvelopeListener.php b/src/Symfony/Component/Mailer/EventListener/EnvelopeListener.php
index cbb3922a19a46..570a9e39551f5 100644
--- a/src/Symfony/Component/Mailer/EventListener/EnvelopeListener.php
+++ b/src/Symfony/Component/Mailer/EventListener/EnvelopeListener.php
@@ -14,6 +14,7 @@
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Symfony\Component\Mailer\Event\MessageEvent;
use Symfony\Component\Mime\Address;
+use Symfony\Component\Mime\Message;
/**
* Manipulates the Envelope of a Message.
@@ -43,6 +44,13 @@ public function onMessage(MessageEvent $event): void
{
if ($this->sender) {
$event->getEnvelope()->setSender($this->sender);
+
+ $message = $event->getMessage();
+ if ($message instanceof Message) {
+ if (!$message->getHeaders()->has('Sender') && !$message->getHeaders()->has('From')) {
+ $message->getHeaders()->addMailboxHeader('Sender', $this->sender->getAddress());
+ }
+ }
}
if ($this->recipients) {
diff --git a/src/Symfony/Component/Mailer/Transport/AbstractTransport.php b/src/Symfony/Component/Mailer/Transport/AbstractTransport.php
index 1bc3fa12a5616..33f75fb3faa4f 100644
--- a/src/Symfony/Component/Mailer/Transport/AbstractTransport.php
+++ b/src/Symfony/Component/Mailer/Transport/AbstractTransport.php
@@ -63,10 +63,6 @@ public function send(RawMessage $message, Envelope $envelope = null): ?SentMessa
$envelope = $event->getEnvelope();
}
- if (!$envelope->getRecipients()) {
- return null;
- }
-
$message = new SentMessage($message, $envelope);
$this->doSend($message);
diff --git a/src/Symfony/Component/Mime/Message.php b/src/Symfony/Component/Mime/Message.php
index 5b4e67f1dbc5b..94a49764e4912 100644
--- a/src/Symfony/Component/Mime/Message.php
+++ b/src/Symfony/Component/Mime/Message.php
@@ -74,7 +74,10 @@ public function getPreparedHeaders(): Headers
$headers = clone $this->headers;
if (!$headers->has('From')) {
- throw new LogicException('An email must have a "From" header.');
+ if (!$headers->has('Sender')) {
+ throw new LogicException('An email must have a "From" or a "Sender" header.');
+ }
+ $headers->addMailboxListHeader('From', [$headers->get('Sender')->getAddress()]);
}
$headers->addTextHeader('MIME-Version', '1.0');
@@ -119,8 +122,12 @@ public function toIterable(): iterable
public function ensureValidity()
{
- if (!$this->headers->has('From')) {
- throw new LogicException('An email must have a "From" header.');
+ if (!$this->headers->has('To')) {
+ throw new LogicException('An email must have a "To" header.');
+ }
+
+ if (!$this->headers->has('From') && !$this->headers->has('Sender')) {
+ throw new LogicException('An email must have a "From" or a "Sender" header.');
}
parent::ensureValidity();
@@ -133,7 +140,7 @@ public function generateMessageId(): string
} elseif ($this->headers->has('From')) {
$sender = $this->headers->get('From')->getAddresses()[0];
} else {
- throw new LogicException('An email must have a "From" or a "Sender" header to compute a Messsage ID.');
+ throw new LogicException('An email must have a "From" or a "Sender" header.');
}
return bin2hex(random_bytes(16)).strstr($sender->getAddress(), '@');
diff --git a/src/Symfony/Component/Mime/Tests/Crypto/SMimeSignerTest.php b/src/Symfony/Component/Mime/Tests/Crypto/SMimeSignerTest.php
index 0a86c3c90e1e7..5522bc6f55cd7 100644
--- a/src/Symfony/Component/Mime/Tests/Crypto/SMimeSignerTest.php
+++ b/src/Symfony/Component/Mime/Tests/Crypto/SMimeSignerTest.php
@@ -99,6 +99,7 @@ public function testSignedMessageWithBcc()
{
$message = (new Email())
->date(new \DateTime('2019-04-07 10:36:30', new \DateTimeZone('Europe/Paris')))
+ ->to('fabien@symfony.com')
->addBcc('fabien@symfony.com', 's.stok@rollerscapes.net')
->subject('I am your sign of fear')
->from('noreply@example.com')
@@ -115,8 +116,9 @@ public function testSignedMessageWithAttachments()
$message = new Email((new Headers())
->addDateHeader('Date', new \DateTime('2019-04-07 10:36:30', new \DateTimeZone('Europe/Paris')))
->addMailboxListHeader('From', ['fabien@symfony.com'])
+ ->addMailboxListHeader('To', ['fabien@symfony.com'])
);
- $message->html($content = 'html content
');
+ $message->html('html content
');
$message->text('text content');
$message->attach(fopen(__DIR__.'/../Fixtures/mimetypes/test', 'r'));
$message->attach(fopen(__DIR__.'/../Fixtures/mimetypes/test.gif', 'r'), 'test.gif');
diff --git a/src/Symfony/Component/Mime/Tests/EmailTest.php b/src/Symfony/Component/Mime/Tests/EmailTest.php
index bfd30053af09e..230df0791e15b 100644
--- a/src/Symfony/Component/Mime/Tests/EmailTest.php
+++ b/src/Symfony/Component/Mime/Tests/EmailTest.php
@@ -251,62 +251,62 @@ public function testGenerateBody()
$att = new DataPart($file = fopen(__DIR__.'/Fixtures/mimetypes/test', 'r'));
$img = new DataPart($image = fopen(__DIR__.'/Fixtures/mimetypes/test.gif', 'r'), 'test.gif');
- $e = (new Email())->from('me@example.com');
+ $e = (new Email())->from('me@example.com')->to('you@example.com');
$e->text('text content');
$this->assertEquals($text, $e->getBody());
$this->assertEquals('text content', $e->getTextBody());
- $e = (new Email())->from('me@example.com');
+ $e = (new Email())->from('me@example.com')->to('you@example.com');
$e->html('html content');
$this->assertEquals($html, $e->getBody());
$this->assertEquals('html content', $e->getHtmlBody());
- $e = (new Email())->from('me@example.com');
+ $e = (new Email())->from('me@example.com')->to('you@example.com');
$e->html('html content');
$e->text('text content');
$this->assertEquals(new AlternativePart($text, $html), $e->getBody());
- $e = (new Email())->from('me@example.com');
+ $e = (new Email())->from('me@example.com')->to('you@example.com');
$e->html('html content', 'iso-8859-1');
$e->text('text content', 'iso-8859-1');
$this->assertEquals('iso-8859-1', $e->getTextCharset());
$this->assertEquals('iso-8859-1', $e->getHtmlCharset());
$this->assertEquals(new AlternativePart(new TextPart('text content', 'iso-8859-1'), new TextPart('html content', 'iso-8859-1', 'html')), $e->getBody());
- $e = (new Email())->from('me@example.com');
+ $e = (new Email())->from('me@example.com')->to('you@example.com');
$e->attach($file);
$e->text('text content');
$this->assertEquals(new MixedPart($text, $att), $e->getBody());
- $e = (new Email())->from('me@example.com');
+ $e = (new Email())->from('me@example.com')->to('you@example.com');
$e->attach($file);
$e->html('html content');
$this->assertEquals(new MixedPart($html, $att), $e->getBody());
- $e = (new Email())->from('me@example.com');
+ $e = (new Email())->from('me@example.com')->to('you@example.com');
$e->attach($file);
$this->assertEquals(new MixedPart($att), $e->getBody());
- $e = (new Email())->from('me@example.com');
+ $e = (new Email())->from('me@example.com')->to('you@example.com');
$e->html('html content');
$e->text('text content');
$e->attach($file);
$this->assertEquals(new MixedPart(new AlternativePart($text, $html), $att), $e->getBody());
- $e = (new Email())->from('me@example.com');
+ $e = (new Email())->from('me@example.com')->to('you@example.com');
$e->html('html content');
$e->text('text content');
$e->attach($file);
$e->attach($image, 'test.gif');
$this->assertEquals(new MixedPart(new AlternativePart($text, $html), $att, $img), $e->getBody());
- $e = (new Email())->from('me@example.com');
+ $e = (new Email())->from('me@example.com')->to('you@example.com');
$e->text('text content');
$e->attach($file);
$e->attach($image, 'test.gif');
$this->assertEquals(new MixedPart($text, $att, $img), $e->getBody());
- $e = (new Email())->from('me@example.com');
+ $e = (new Email())->from('me@example.com')->to('you@example.com');
$e->html($content = 'html content
');
$e->text('text content');
$e->attach($file);
@@ -314,7 +314,7 @@ public function testGenerateBody()
$fullhtml = new TextPart($content, 'utf-8', 'html');
$this->assertEquals(new MixedPart(new AlternativePart($text, $fullhtml), $att, $img), $e->getBody());
- $e = (new Email())->from('me@example.com');
+ $e = (new Email())->from('me@example.com')->to('you@example.com');
$e->html($content = 'html content
');
$e->text('text content');
$e->attach($file);
@@ -334,7 +334,7 @@ public function testGenerateBody()
fwrite($r, $content);
rewind($r);
- $e = (new Email())->from('me@example.com');
+ $e = (new Email())->from('me@example.com')->to('you@example.com');
$e->html($r);
// embedding the same image twice results in one image only in the email
$e->embed($image, 'test.gif');
@@ -373,6 +373,7 @@ public function testSerialize()
$e = new Email();
$e->from('fabien@symfony.com');
+ $e->to('you@example.com');
$e->text($r);
$e->html($r);
$name = __DIR__.'/Fixtures/mimetypes/test';
diff --git a/src/Symfony/Component/Mime/Tests/MessageConverterTest.php b/src/Symfony/Component/Mime/Tests/MessageConverterTest.php
index 6a78086246377..a0e71a08a9416 100644
--- a/src/Symfony/Component/Mime/Tests/MessageConverterTest.php
+++ b/src/Symfony/Component/Mime/Tests/MessageConverterTest.php
@@ -21,7 +21,7 @@ class MessageConverterTest extends TestCase
public function testToEmail()
{
$file = file_get_contents(__DIR__.'/Fixtures/mimetypes/test.gif');
- $email = (new Email())->from('fabien@symfony.com');
+ $email = (new Email())->from('fabien@symfony.com')->to('you@example.com');
$this->assertSame($email, MessageConverter::toEmail($email));
$this->assertConversion((clone $email)->text('text content'));
diff --git a/src/Symfony/Component/Mime/Tests/Part/MessagePartTest.php b/src/Symfony/Component/Mime/Tests/Part/MessagePartTest.php
index 21a4eb03b1292..2713d5bc079c7 100644
--- a/src/Symfony/Component/Mime/Tests/Part/MessagePartTest.php
+++ b/src/Symfony/Component/Mime/Tests/Part/MessagePartTest.php
@@ -22,7 +22,7 @@ class MessagePartTest extends TestCase
{
public function testConstructor()
{
- $p = new MessagePart((new Email())->from('fabien@symfony.com')->text('content'));
+ $p = new MessagePart((new Email())->from('fabien@symfony.com')->to('you@example.com')->text('content'));
$this->assertStringContainsString('content', $p->getBody());
$this->assertStringContainsString('content', $p->bodyToString());
$this->assertStringContainsString('content', implode('', iterator_to_array($p->bodyToIterable())));