diff --git a/src/Illuminate/Mail/Events/MessageSent.php b/src/Illuminate/Mail/Events/MessageSent.php index c482e07383cc..493e7d4380a0 100644 --- a/src/Illuminate/Mail/Events/MessageSent.php +++ b/src/Illuminate/Mail/Events/MessageSent.php @@ -46,14 +46,10 @@ public function __serialize() { $hasAttachments = collect($this->message->getAttachments())->isNotEmpty(); - return $hasAttachments ? [ - 'sent' => base64_encode(serialize($this->sent)), - 'data' => base64_encode(serialize($this->data)), - 'hasAttachments' => true, - ] : [ + return [ 'sent' => $this->sent, - 'data' => $this->data, - 'hasAttachments' => false, + 'data' => $hasAttachments ? base64_encode(serialize($this->data)) : $this->data, + 'hasAttachments' => $hasAttachments, ]; } @@ -65,13 +61,11 @@ public function __serialize() */ public function __unserialize(array $data) { - if (isset($data['hasAttachments']) && $data['hasAttachments'] === true) { - $this->sent = unserialize(base64_decode($data['sent'])); - $this->data = unserialize(base64_decode($data['data'])); - } else { - $this->sent = $data['sent']; - $this->data = $data['data']; - } + $this->sent = $data['sent']; + + $this->data = (($data['hasAttachments'] ?? false) === true) + ? unserialize(base64_decode($data['data'])) + : $data['data']; } /** diff --git a/src/Illuminate/Mail/SentMessage.php b/src/Illuminate/Mail/SentMessage.php index cce42dbd009f..5a2a5f6b7096 100644 --- a/src/Illuminate/Mail/SentMessage.php +++ b/src/Illuminate/Mail/SentMessage.php @@ -51,4 +51,32 @@ public function __call($method, $parameters) { return $this->forwardCallTo($this->sentMessage, $method, $parameters); } + + /** + * Get the serializable representation of the object. + * + * @return array + */ + public function __serialize() + { + $hasAttachments = collect($this->sentMessage->getOriginalMessage()->getAttachments())->isNotEmpty(); + + return [ + 'hasAttachments' => $hasAttachments, + 'sentMessage' => $hasAttachments ? base64_encode(serialize($this->sentMessage)) : $this->sentMessage, + ]; + } + + /** + * Marshal the object from its serialized data. + * + * @param array $data + * @return void + */ + public function __unserialize(array $data) + { + $hasAttachments = ($data['hasAttachments'] ?? false) === true; + + $this->sentMessage = $hasAttachments ? unserialize(base64_decode($data['sentMessage'])) : $data['sentMessage']; + } } diff --git a/tests/Integration/Mail/Fixtures/blank_document.pdf b/tests/Integration/Mail/Fixtures/blank_document.pdf new file mode 100644 index 000000000000..88f49e24ccb2 Binary files /dev/null and b/tests/Integration/Mail/Fixtures/blank_document.pdf differ diff --git a/tests/Integration/Mail/SentMessageMailTest.php b/tests/Integration/Mail/SentMessageMailTest.php new file mode 100644 index 000000000000..18c7f728eb67 --- /dev/null +++ b/tests/Integration/Mail/SentMessageMailTest.php @@ -0,0 +1,78 @@ +increments('id'); + }); + } + + public function testDispatchesNotificationSent() + { + $notificationWasSent = false; + + $user = SentMessageUser::create(); + + Event::listen( + NotificationSent::class, + function(NotificationSent $notification) use (&$notificationWasSent, $user) { + $notificationWasSent = true; + /** + * Confirm that NotificationSent can be serialized/unserialized as + * will happen if the listener implements ShouldQueue. + */ + /** @var NotificationSent $afterSerialization */ + $afterSerialization = unserialize(serialize($notification)); + + $this->assertTrue($user->is($afterSerialization->notifiable)); + + $this->assertEqualsCanonicalizing($notification->notification, $afterSerialization->notification); + }); + + $user->notify(new SentMessageMailNotification()); + + $this->assertTrue($notificationWasSent); + } +} + +class SentMessageUser extends Model +{ + use Notifiable; + + public $timestamps = false; +} + + +class SentMessageMailNotification extends Notification +{ + public function via(): array + { + return ['mail']; + } + + public function toMail(object $notifiable): MailMessage + { + return (new MailMessage) + ->line('Example notification with attachment.') + ->attach(__DIR__ . '/Fixtures/blank_document.pdf', [ + 'as' => 'blank_document.pdf', + 'mime' => 'application/pdf', + ]); + } +}