From 62aedcb610c488b7e512dbde954e8ffaff72a385 Mon Sep 17 00:00:00 2001 From: Joost de Bruijn Date: Tue, 15 Feb 2022 11:44:22 +0100 Subject: [PATCH 1/5] fix: mails with tags and metadata could not be queued --- src/Illuminate/Mail/Mailable.php | 58 +++++++++++++++++-- .../Notifications/Channels/MailChannel.php | 12 ++++ .../Notifications/Messages/MailMessage.php | 27 ++++++--- 3 files changed, 82 insertions(+), 15 deletions(-) diff --git a/src/Illuminate/Mail/Mailable.php b/src/Illuminate/Mail/Mailable.php index 79c9cfa89538..c0e8496f0745 100644 --- a/src/Illuminate/Mail/Mailable.php +++ b/src/Illuminate/Mail/Mailable.php @@ -164,6 +164,20 @@ class Mailable implements MailableContract, Renderable */ protected $assertionableRenderStrings; + /** + * The metadata for the message. + * + * @var array + */ + protected $metadata = []; + + /** + * The tag for the message. + * + * @var string + */ + protected $tag; + /** * The callback that should be invoked while building the view data. * @@ -190,6 +204,8 @@ public function send($mailer) $this->buildFrom($message) ->buildRecipients($message) ->buildSubject($message) + ->buildTag($message) + ->buildMetadata($message) ->runCallbacks($message) ->buildAttachments($message); }); @@ -405,6 +421,38 @@ protected function buildSubject($message) return $this; } + /** + * Set the tag for the message. + * + * @param \Illuminate\Mail\Message $message + * @return $this + */ + protected function buildTag($message) + { + if ($this->tag) { + $message->getHeaders()->add(new TagHeader($this->tag)); + } + + return $this; + } + + /** + * Set the tag for the message. + * + * @param \Illuminate\Mail\Message $message + * @return $this + */ + protected function buildMetadata($message) + { + if ($this->metadata) { + foreach ($this->metadata as $key => $value) { + $message->getHeaders()->add(new MetadataHeader($key, $value)); + } + } + + return $this; + } + /** * Add all of the attachments to the message. * @@ -884,9 +932,8 @@ public function attachData($data, $name, array $options = []) */ public function tag($value) { - return $this->withSymfonyMessage(function (Email $message) use ($value) { - $message->getHeaders()->add(new TagHeader($value)); - }); + $this->tag = $value; + return $this; } /** @@ -898,9 +945,8 @@ public function tag($value) */ public function metadata($key, $value) { - return $this->withSymfonyMessage(function (Email $message) use ($key, $value) { - $message->getHeaders()->add(new MetadataHeader($key, $value)); - }); + $this->metadata[$key] = $value; + return $this; } /** diff --git a/src/Illuminate/Notifications/Channels/MailChannel.php b/src/Illuminate/Notifications/Channels/MailChannel.php index 77885b87a88e..68f46639411e 100644 --- a/src/Illuminate/Notifications/Channels/MailChannel.php +++ b/src/Illuminate/Notifications/Channels/MailChannel.php @@ -9,6 +9,8 @@ use Illuminate\Notifications\Notification; use Illuminate\Support\Arr; use Illuminate\Support\Str; +use Symfony\Component\Mailer\Header\MetadataHeader; +use Symfony\Component\Mailer\Header\TagHeader; class MailChannel { @@ -144,6 +146,16 @@ protected function buildMessage($mailMessage, $notifiable, $notification, $messa $mailMessage->setPriority($message->priority); } + if ($message->tag) { + $mailMessage->getHeaders()->add(new TagHeader($this->tag)); + } + + if ($message->metadata) { + foreach ($message->metadata as $key => $value) { + $mailMessage->getHeaders()->add(new MetadataHeader($key, $value)); + } + } + $this->runCallbacks($mailMessage, $message); } diff --git a/src/Illuminate/Notifications/Messages/MailMessage.php b/src/Illuminate/Notifications/Messages/MailMessage.php index da4a6a678627..51e23893a7be 100644 --- a/src/Illuminate/Notifications/Messages/MailMessage.php +++ b/src/Illuminate/Notifications/Messages/MailMessage.php @@ -7,9 +7,6 @@ use Illuminate\Contracts\Support\Renderable; use Illuminate\Mail\Markdown; use Illuminate\Support\Traits\Conditionable; -use Symfony\Component\Mailer\Header\MetadataHeader; -use Symfony\Component\Mailer\Header\TagHeader; -use Symfony\Component\Mime\Email; class MailMessage extends SimpleMessage implements Renderable { @@ -99,6 +96,20 @@ class MailMessage extends SimpleMessage implements Renderable */ public $callbacks = []; + /** + * The metadata for the message. + * + * @var array + */ + public $metadata = []; + + /** + * The tag for the message. + * + * @var string + */ + public $tag; + /** * Set the view for the mail message. * @@ -264,9 +275,8 @@ public function attachData($data, $name, array $options = []) */ public function tag($value) { - return $this->withSymfonyMessage(function (Email $message) use ($value) { - $message->getHeaders()->add(new TagHeader($value)); - }); + $this->tag = $value; + return $this; } /** @@ -278,9 +288,8 @@ public function tag($value) */ public function metadata($key, $value) { - return $this->withSymfonyMessage(function (Email $message) use ($key, $value) { - $message->getHeaders()->add(new MetadataHeader($key, $value)); - }); + $this->metadata[$key] = $value; + return $this; } /** From bf32f80e4d0267b2bc4d5289416fbf7ca6e889fd Mon Sep 17 00:00:00 2001 From: Joost de Bruijn Date: Tue, 15 Feb 2022 12:47:37 +0100 Subject: [PATCH 2/5] test: add test cases for tags en metadata for mail --- tests/Mail/MailMailableTest.php | 40 +++++++++++++++++++ .../NotificationMailMessageTest.php | 20 ++++++++++ 2 files changed, 60 insertions(+) diff --git a/tests/Mail/MailMailableTest.php b/tests/Mail/MailMailableTest.php index 746e2c0893a3..38f4235bee6f 100644 --- a/tests/Mail/MailMailableTest.php +++ b/tests/Mail/MailMailableTest.php @@ -445,6 +445,46 @@ public function testMailablePriorityGetsSent() $this->assertSame('hello@laravel.com', $sentMessage->getEnvelope()->getRecipients()[0]->getAddress()); $this->assertStringContainsString('X-Priority: 1 (Highest)', $sentMessage->toString()); } + + public function testMailableMetadataGetsSent() + { + $view = m::mock(Factory::class); + + $mailer = new Mailer('array', $view, new ArrayTransport); + + $mailable = new WelcomeMailableStub; + $mailable->to('hello@laravel.com'); + $mailable->from('taylor@laravel.com'); + $mailable->html('test content'); + + $mailable->metadata('origin', 'test-suite'); + $mailable->metadata('user_id', 1); + + $sentMessage = $mailer->send($mailable); + + $this->assertSame('hello@laravel.com', $sentMessage->getEnvelope()->getRecipients()[0]->getAddress()); + $this->assertStringContainsString('X-Metadata-origin: test-suite', $sentMessage->toString()); + $this->assertStringContainsString('X-Metadata-user_id: 1', $sentMessage->toString()); + } + + public function testMailableTagGetsSent() + { + $view = m::mock(Factory::class); + + $mailer = new Mailer('array', $view, new ArrayTransport); + + $mailable = new WelcomeMailableStub; + $mailable->to('hello@laravel.com'); + $mailable->from('taylor@laravel.com'); + $mailable->html('test content'); + + $mailable->tag('test'); + + $sentMessage = $mailer->send($mailable); + + $this->assertSame('hello@laravel.com', $sentMessage->getEnvelope()->getRecipients()[0]->getAddress()); + $this->assertStringContainsString('X-Tag: test', $sentMessage->toString()); + } } class WelcomeMailableStub extends Mailable diff --git a/tests/Notifications/NotificationMailMessageTest.php b/tests/Notifications/NotificationMailMessageTest.php index 94db5b6d284c..ace028496b8c 100644 --- a/tests/Notifications/NotificationMailMessageTest.php +++ b/tests/Notifications/NotificationMailMessageTest.php @@ -121,6 +121,26 @@ public function testReplyToIsSetCorrectly() $this->assertSame([['test@example.com', null], ['test@example.com', 'Test']], $message->replyTo); } + public function testMetadataIsSetCorrectly() + { + $message = new MailMessage; + $message->metadata('origin', 'test-suite'); + $message->metadata('user_id', 1); + + $this->assertArrayHasKey('origin', $message->metadata); + $this->assertSame('test-suite', $message->metadata['origin']); + $this->assertArrayHasKey('user_id', $message->metadata); + $this->assertSame(1, $message->metadata['user_id']); + } + + public function testTagIsSetCorrectly() + { + $message = new MailMessage; + $message->tag('test'); + + $this->assertSame('test', $message->tag); + } + public function testCallbackIsSetCorrectly() { $callback = function () { From e760553e300c975bc6b68919830a578f0fa0d3e3 Mon Sep 17 00:00:00 2001 From: Joost de Bruijn Date: Tue, 15 Feb 2022 13:41:16 +0100 Subject: [PATCH 3/5] fix: mail could have multiple tags --- src/Illuminate/Mail/Mailable.php | 20 ++++++++++--------- .../Notifications/Channels/MailChannel.php | 6 ++++-- .../Notifications/Messages/MailMessage.php | 8 ++++---- tests/Mail/MailMailableTest.php | 2 ++ .../NotificationMailMessageTest.php | 2 +- 5 files changed, 22 insertions(+), 16 deletions(-) diff --git a/src/Illuminate/Mail/Mailable.php b/src/Illuminate/Mail/Mailable.php index c0e8496f0745..51460409cbe8 100644 --- a/src/Illuminate/Mail/Mailable.php +++ b/src/Illuminate/Mail/Mailable.php @@ -172,11 +172,11 @@ class Mailable implements MailableContract, Renderable protected $metadata = []; /** - * The tag for the message. + * The tags for the message. * - * @var string + * @var array */ - protected $tag; + protected $tags = []; /** * The callback that should be invoked while building the view data. @@ -204,7 +204,7 @@ public function send($mailer) $this->buildFrom($message) ->buildRecipients($message) ->buildSubject($message) - ->buildTag($message) + ->buildTags($message) ->buildMetadata($message) ->runCallbacks($message) ->buildAttachments($message); @@ -422,15 +422,17 @@ protected function buildSubject($message) } /** - * Set the tag for the message. + * Set the tags for the message. * * @param \Illuminate\Mail\Message $message * @return $this */ - protected function buildTag($message) + protected function buildTags($message) { - if ($this->tag) { - $message->getHeaders()->add(new TagHeader($this->tag)); + if ($this->tags) { + foreach ($this->tags as $tag) { + $message->getHeaders()->add(new TagHeader($tag)); + } } return $this; @@ -932,7 +934,7 @@ public function attachData($data, $name, array $options = []) */ public function tag($value) { - $this->tag = $value; + array_push($this->tags, $value); return $this; } diff --git a/src/Illuminate/Notifications/Channels/MailChannel.php b/src/Illuminate/Notifications/Channels/MailChannel.php index 68f46639411e..594320d5b791 100644 --- a/src/Illuminate/Notifications/Channels/MailChannel.php +++ b/src/Illuminate/Notifications/Channels/MailChannel.php @@ -146,8 +146,10 @@ protected function buildMessage($mailMessage, $notifiable, $notification, $messa $mailMessage->setPriority($message->priority); } - if ($message->tag) { - $mailMessage->getHeaders()->add(new TagHeader($this->tag)); + if ($message->tags) { + foreach ($message->tags as $tag) { + $mailMessage->getHeaders()->add(new TagHeader($tag)); + } } if ($message->metadata) { diff --git a/src/Illuminate/Notifications/Messages/MailMessage.php b/src/Illuminate/Notifications/Messages/MailMessage.php index 51e23893a7be..cc3ee975a9fb 100644 --- a/src/Illuminate/Notifications/Messages/MailMessage.php +++ b/src/Illuminate/Notifications/Messages/MailMessage.php @@ -104,11 +104,11 @@ class MailMessage extends SimpleMessage implements Renderable public $metadata = []; /** - * The tag for the message. + * The tags for the message. * - * @var string + * @var array */ - public $tag; + public $tags = []; /** * Set the view for the mail message. @@ -275,7 +275,7 @@ public function attachData($data, $name, array $options = []) */ public function tag($value) { - $this->tag = $value; + array_push($this->tags, $value); return $this; } diff --git a/tests/Mail/MailMailableTest.php b/tests/Mail/MailMailableTest.php index 38f4235bee6f..9ed3e1d83553 100644 --- a/tests/Mail/MailMailableTest.php +++ b/tests/Mail/MailMailableTest.php @@ -479,11 +479,13 @@ public function testMailableTagGetsSent() $mailable->html('test content'); $mailable->tag('test'); + $mailable->tag('foo'); $sentMessage = $mailer->send($mailable); $this->assertSame('hello@laravel.com', $sentMessage->getEnvelope()->getRecipients()[0]->getAddress()); $this->assertStringContainsString('X-Tag: test', $sentMessage->toString()); + $this->assertStringContainsString('X-Tag: foo', $sentMessage->toString()); } } diff --git a/tests/Notifications/NotificationMailMessageTest.php b/tests/Notifications/NotificationMailMessageTest.php index ace028496b8c..74631eb9f8b7 100644 --- a/tests/Notifications/NotificationMailMessageTest.php +++ b/tests/Notifications/NotificationMailMessageTest.php @@ -138,7 +138,7 @@ public function testTagIsSetCorrectly() $message = new MailMessage; $message->tag('test'); - $this->assertSame('test', $message->tag); + $this->assertContains('test', $message->tags); } public function testCallbackIsSetCorrectly() From 75061a0f4e8a1acb97bcb980f0a0eca0fad8707c Mon Sep 17 00:00:00 2001 From: Joost de Bruijn Date: Tue, 15 Feb 2022 13:47:26 +0100 Subject: [PATCH 4/5] style: fix issues from style linter --- src/Illuminate/Mail/Mailable.php | 2 ++ src/Illuminate/Notifications/Messages/MailMessage.php | 2 ++ 2 files changed, 4 insertions(+) diff --git a/src/Illuminate/Mail/Mailable.php b/src/Illuminate/Mail/Mailable.php index 51460409cbe8..31d07e248bd0 100644 --- a/src/Illuminate/Mail/Mailable.php +++ b/src/Illuminate/Mail/Mailable.php @@ -935,6 +935,7 @@ public function attachData($data, $name, array $options = []) public function tag($value) { array_push($this->tags, $value); + return $this; } @@ -948,6 +949,7 @@ public function tag($value) public function metadata($key, $value) { $this->metadata[$key] = $value; + return $this; } diff --git a/src/Illuminate/Notifications/Messages/MailMessage.php b/src/Illuminate/Notifications/Messages/MailMessage.php index cc3ee975a9fb..493719218000 100644 --- a/src/Illuminate/Notifications/Messages/MailMessage.php +++ b/src/Illuminate/Notifications/Messages/MailMessage.php @@ -276,6 +276,7 @@ public function attachData($data, $name, array $options = []) public function tag($value) { array_push($this->tags, $value); + return $this; } @@ -289,6 +290,7 @@ public function tag($value) public function metadata($key, $value) { $this->metadata[$key] = $value; + return $this; } From dc023261a1c1c1cf4f52205290c1ee71a433ea79 Mon Sep 17 00:00:00 2001 From: Taylor Otwell Date: Tue, 15 Feb 2022 08:59:41 -0600 Subject: [PATCH 5/5] formatting --- src/Illuminate/Mail/Mailable.php | 96 +++++++++---------- .../Notifications/Messages/MailMessage.php | 20 ++-- 2 files changed, 58 insertions(+), 58 deletions(-) diff --git a/src/Illuminate/Mail/Mailable.php b/src/Illuminate/Mail/Mailable.php index 31d07e248bd0..2cfdab44ef23 100644 --- a/src/Illuminate/Mail/Mailable.php +++ b/src/Illuminate/Mail/Mailable.php @@ -136,6 +136,20 @@ class Mailable implements MailableContract, Renderable */ public $diskAttachments = []; + /** + * The tags for the message. + * + * @var array + */ + protected $tags = []; + + /** + * The metadata for the message. + * + * @var array + */ + protected $metadata = []; + /** * The callbacks for the message. * @@ -164,20 +178,6 @@ class Mailable implements MailableContract, Renderable */ protected $assertionableRenderStrings; - /** - * The metadata for the message. - * - * @var array - */ - protected $metadata = []; - - /** - * The tags for the message. - * - * @var array - */ - protected $tags = []; - /** * The callback that should be invoked while building the view data. * @@ -421,40 +421,6 @@ protected function buildSubject($message) return $this; } - /** - * Set the tags for the message. - * - * @param \Illuminate\Mail\Message $message - * @return $this - */ - protected function buildTags($message) - { - if ($this->tags) { - foreach ($this->tags as $tag) { - $message->getHeaders()->add(new TagHeader($tag)); - } - } - - return $this; - } - - /** - * Set the tag for the message. - * - * @param \Illuminate\Mail\Message $message - * @return $this - */ - protected function buildMetadata($message) - { - if ($this->metadata) { - foreach ($this->metadata as $key => $value) { - $message->getHeaders()->add(new MetadataHeader($key, $value)); - } - } - - return $this; - } - /** * Add all of the attachments to the message. * @@ -499,6 +465,40 @@ protected function buildDiskAttachments($message) } } + /** + * Add all defined tags to the message. + * + * @param \Illuminate\Mail\Message $message + * @return $this + */ + protected function buildTags($message) + { + if ($this->tags) { + foreach ($this->tags as $tag) { + $message->getHeaders()->add(new TagHeader($tag)); + } + } + + return $this; + } + + /** + * Add all defined metadata to the message. + * + * @param \Illuminate\Mail\Message $message + * @return $this + */ + protected function buildMetadata($message) + { + if ($this->metadata) { + foreach ($this->metadata as $key => $value) { + $message->getHeaders()->add(new MetadataHeader($key, $value)); + } + } + + return $this; + } + /** * Run the callbacks for the message. * diff --git a/src/Illuminate/Notifications/Messages/MailMessage.php b/src/Illuminate/Notifications/Messages/MailMessage.php index 493719218000..be77c5dbc059 100644 --- a/src/Illuminate/Notifications/Messages/MailMessage.php +++ b/src/Illuminate/Notifications/Messages/MailMessage.php @@ -83,32 +83,32 @@ class MailMessage extends SimpleMessage implements Renderable public $rawAttachments = []; /** - * Priority level of the message. + * The tags for the message. * - * @var int + * @var array */ - public $priority; + public $tags = []; /** - * The callbacks for the message. + * The metadata for the message. * * @var array */ - public $callbacks = []; + public $metadata = []; /** - * The metadata for the message. + * Priority level of the message. * - * @var array + * @var int */ - public $metadata = []; + public $priority; /** - * The tags for the message. + * The callbacks for the message. * * @var array */ - public $tags = []; + public $callbacks = []; /** * Set the view for the mail message.