From 2914e4e785ed00f1c8c0c1c7898b2637bf9c7aa3 Mon Sep 17 00:00:00 2001 From: Oleksandr Shmyheliuk Date: Mon, 28 Oct 2019 11:26:14 -0500 Subject: [PATCH] MAGECLOUD-4442: Deliver fix for mail interfaces --- patches.json | 3 + ...bility_of_new_mail_interfaces__2.3.3.patch | 381 ++++++++++++++++++ 2 files changed, 384 insertions(+) create mode 100644 patches/MAGECLOUD-4442__fix_backward_compatibility_of_new_mail_interfaces__2.3.3.patch diff --git a/patches.json b/patches.json index 0a5ec42..1b015f9 100644 --- a/patches.json +++ b/patches.json @@ -180,6 +180,9 @@ "Re-work consumers to terminate as soon as there is nothing left to process": { "2.2.0 - 2.3.1": "MAGECLOUD-4071__terminate_consumers_if_the_queue_is_empty__2.2.0.patch", "2.3.2 - 2.3.3": "MAGECLOUD-4071__terminate_consumers_if_the_queue_is_empty__2.3.2.patch" + }, + "Backward Compatibility of new Mail Interfaces": { + "2.3.3": "MAGECLOUD-4442__fix_backward_compatibility_of_new_mail_interfaces__2.3.3.patch" } }, "monolog/monolog": { diff --git a/patches/MAGECLOUD-4442__fix_backward_compatibility_of_new_mail_interfaces__2.3.3.patch b/patches/MAGECLOUD-4442__fix_backward_compatibility_of_new_mail_interfaces__2.3.3.patch new file mode 100644 index 0000000..ea6787e --- /dev/null +++ b/patches/MAGECLOUD-4442__fix_backward_compatibility_of_new_mail_interfaces__2.3.3.patch @@ -0,0 +1,381 @@ +diff --git a/vendor/magento/module-email/Model/Transport.php b/vendor/magento/module-email/Model/Transport.php +index cbce1682cb5..79ceb56a883 100644 +--- a/vendor/magento/module-email/Model/Transport.php ++++ b/vendor/magento/module-email/Model/Transport.php +@@ -9,7 +9,6 @@ namespace Magento\Email\Model; + + use Magento\Framework\App\Config\ScopeConfigInterface; + use Magento\Framework\Exception\MailException; +-use Magento\Framework\Mail\EmailMessageInterface; + use Magento\Framework\Mail\MessageInterface; + use Magento\Framework\Mail\TransportInterface; + use Magento\Framework\Phrase; +@@ -62,12 +61,12 @@ class Transport implements TransportInterface + private $message; + + /** +- * @param EmailMessageInterface $message Email message object ++ * @param MessageInterface $message Email message object + * @param ScopeConfigInterface $scopeConfig Core store config + * @param null|string|array|\Traversable $parameters Config options for sendmail parameters + */ + public function __construct( +- EmailMessageInterface $message, ++ MessageInterface $message, + ScopeConfigInterface $scopeConfig, + $parameters = null + ) { +diff --git a/dev/tests/integration/testsuite/Magento/Customer/Controller/AccountTest.php b/dev/tests/integration/testsuite/Magento/Customer/Controller/AccountTest.php +index 32f12dada57..4210312c55a 100644 +--- a/dev/tests/integration/testsuite/Magento/Customer/Controller/AccountTest.php ++++ b/dev/tests/integration/testsuite/Magento/Customer/Controller/AccountTest.php +@@ -769,7 +769,7 @@ class AccountTest extends \Magento\TestFramework\TestCase\AbstractController + $message = $this->transportBuilderMock->getSentMessage(); + $rawMessage = $message->getRawMessage(); + +- $this->assertContains('To: John Smith <' . $email . '>', $rawMessage); ++ $this->assertContains('To: =?utf-8?Q?John=20Smith?= <' . $email . '>', $rawMessage); + + $content = $message->getBody()->getParts()[0]->getRawContent(); + $confirmationUrl = $this->getConfirmationUrlFromMessageContent($content); +diff --git a/dev/tests/integration/testsuite/Magento/Framework/Mail/EmailMessageTest.php b/dev/tests/integration/testsuite/Magento/Framework/Mail/EmailMessageTest.php +index 10a54b4e1b8..186c3e2796c 100644 +--- a/dev/tests/integration/testsuite/Magento/Framework/Mail/EmailMessageTest.php ++++ b/dev/tests/integration/testsuite/Magento/Framework/Mail/EmailMessageTest.php +@@ -14,6 +14,7 @@ use PHPUnit\Framework\TestCase; + + /** + * Class EmailMessageTest ++ * @SuppressWarnings(PHPMD.CouplingBetweenObjects) + */ + class EmailMessageTest extends TestCase + { +@@ -164,23 +165,42 @@ class EmailMessageTest extends TestCase + 'cc' => $cc, + 'replyTo' => $replyTo, + 'bcc' => $bcc, +- 'sender' => $sender ++ 'sender' => $sender, + ]; + $message = $this->messageFactory->create($data); + + $this->assertContains($content, $message->toString()); + $this->assertContains('Content-Type: ' . $type, $message->toString()); +- $senderString = 'Sender: ' . $sender->getName() . ' <' . $sender->getEmail() . '>'; ++ $senderString = 'Sender: =?utf-8?Q?' ++ . str_replace(' ', '=20', $sender->getName()) ++ . '?= <' ++ . $sender->getEmail() ++ . '>'; + $this->assertContains($senderString, $message->toString()); + $this->assertContains('From: ' . $from[0]->getEmail(), $message->toString()); +- $replyToString = 'Reply-To: ' . $replyTo[0]->getName() . ' <' . $replyTo[0]->getEmail() . '>'; ++ $replyToString = 'Reply-To: =?utf-8?Q?' ++ . str_replace(' ', '=20', $replyTo[0]->getName()) ++ . '?= <' ++ . $replyTo[0]->getEmail() ++ . '>'; + $this->assertContains($replyToString, $message->toString()); +- $toString = 'To: ' . $to[0]->getName() . ' <' . $to[0]->getEmail() . '>'; ++ $toString = 'To: =?utf-8?Q?' ++ . str_replace(' ', '=20', $to[0]->getName()) ++ . '?= <' ++ . $to[0]->getEmail() ++ . '>'; + $this->assertContains($toString, $message->toString()); +- $ccString = 'Cc: ' . $cc[0]->getName() . ' <' . $cc[0]->getEmail() . '>'; ++ $ccString = 'Cc: =?utf-8?Q?' ++ . str_replace(' ', '=20', $cc[0]->getName()) ++ . '?= <' ++ . $cc[0]->getEmail() ++ . '>'; + $this->assertContains($ccString, $message->toString()); + $this->assertContains('Bcc: ' . $bcc[0]->getEmail(), $message->toString()); +- $this->assertContains('Content-Description: ' . $this->description, $message->toString()); ++ $contentDescription = 'Content-Description: =?utf-8?Q?' ++ . str_replace(' ', '=20', $this->description) ++ . '?='; ++ $this->assertContains($contentDescription, $message->toString()); + $this->assertContains('Subject: ' . $this->subject, $message->toString()); + $this->assertContains($content, $message->toString()); + //tests address factory +@@ -235,6 +255,7 @@ class EmailMessageTest extends TestCase + 'body' => $mimeMessage, + 'subject' => $this->subject, + 'to' => [$addressTo], ++ 'encoding' => '', + ]; + $message = $this->messageFactory->create($data); + +diff --git a/vendor/magento/framework/Mail/EmailMessage.php b/vendor/magento/framework/Mail/EmailMessage.php +index aaef9750751..02c75977cd0 100644 +--- a/vendor/magento/framework/Mail/EmailMessage.php ++++ b/vendor/magento/framework/Mail/EmailMessage.php +@@ -10,19 +10,13 @@ namespace Magento\Framework\Mail; + use Magento\Framework\Mail\Exception\InvalidArgumentException; + use Zend\Mail\Address as ZendAddress; + use Zend\Mail\AddressList; +-use Zend\Mail\Message as ZendMessage; + use Zend\Mime\Message as ZendMimeMessage; + + /** +- * Class EmailMessage ++ * Email message + */ +-class EmailMessage implements EmailMessageInterface ++class EmailMessage extends Message implements EmailMessageInterface + { +- /** +- * @var ZendMessage +- */ +- private $message; +- + /** + * @var MimeMessageInterfaceFactory + */ +@@ -64,38 +58,35 @@ class EmailMessage implements EmailMessageInterface + ?array $replyTo = null, + ?Address $sender = null, + ?string $subject = '', +- ?string $encoding = '' ++ ?string $encoding = 'utf-8' + ) { +- $this->message = new ZendMessage(); ++ parent::__construct($encoding); + $mimeMessage = new ZendMimeMessage(); + $mimeMessage->setParts($body->getParts()); +- $this->message->setBody($mimeMessage); +- if ($encoding) { +- $this->message->setEncoding($encoding); +- } ++ $this->zendMessage->setBody($mimeMessage); + if ($subject) { +- $this->message->setSubject($subject); ++ $this->zendMessage->setSubject($subject); + } + if ($sender) { +- $this->message->setSender($sender->getEmail(), $sender->getName()); ++ $this->zendMessage->setSender($sender->getEmail(), $sender->getName()); + } + if (count($to) < 1) { + throw new InvalidArgumentException('Email message must have at list one addressee'); + } + if ($to) { +- $this->message->setTo($this->convertAddressArrayToAddressList($to)); ++ $this->zendMessage->setTo($this->convertAddressArrayToAddressList($to)); + } + if ($replyTo) { +- $this->message->setReplyTo($this->convertAddressArrayToAddressList($replyTo)); ++ $this->zendMessage->setReplyTo($this->convertAddressArrayToAddressList($replyTo)); + } + if ($from) { +- $this->message->setFrom($this->convertAddressArrayToAddressList($from)); ++ $this->zendMessage->setFrom($this->convertAddressArrayToAddressList($from)); + } + if ($cc) { +- $this->message->setCc($this->convertAddressArrayToAddressList($cc)); ++ $this->zendMessage->setCc($this->convertAddressArrayToAddressList($cc)); + } + if ($bcc) { +- $this->message->setBcc($this->convertAddressArrayToAddressList($bcc)); ++ $this->zendMessage->setBcc($this->convertAddressArrayToAddressList($bcc)); + } + $this->mimeMessageFactory = $mimeMessageFactory; + $this->addressFactory = $addressFactory; +@@ -106,7 +97,7 @@ class EmailMessage implements EmailMessageInterface + */ + public function getEncoding(): string + { +- return $this->message->getEncoding(); ++ return $this->zendMessage->getEncoding(); + } + + /** +@@ -114,7 +105,7 @@ class EmailMessage implements EmailMessageInterface + */ + public function getHeaders(): array + { +- return $this->message->getHeaders()->toArray(); ++ return $this->zendMessage->getHeaders()->toArray(); + } + + /** +@@ -122,7 +113,7 @@ class EmailMessage implements EmailMessageInterface + */ + public function getFrom(): ?array + { +- return $this->convertAddressListToAddressArray($this->message->getFrom()); ++ return $this->convertAddressListToAddressArray($this->zendMessage->getFrom()); + } + + /** +@@ -130,7 +121,7 @@ class EmailMessage implements EmailMessageInterface + */ + public function getTo(): array + { +- return $this->convertAddressListToAddressArray($this->message->getTo()); ++ return $this->convertAddressListToAddressArray($this->zendMessage->getTo()); + } + + /** +@@ -138,7 +129,7 @@ class EmailMessage implements EmailMessageInterface + */ + public function getCc(): ?array + { +- return $this->convertAddressListToAddressArray($this->message->getCc()); ++ return $this->convertAddressListToAddressArray($this->zendMessage->getCc()); + } + + /** +@@ -146,7 +137,7 @@ class EmailMessage implements EmailMessageInterface + */ + public function getBcc(): ?array + { +- return $this->convertAddressListToAddressArray($this->message->getBcc()); ++ return $this->convertAddressListToAddressArray($this->zendMessage->getBcc()); + } + + /** +@@ -154,7 +145,7 @@ class EmailMessage implements EmailMessageInterface + */ + public function getReplyTo(): ?array + { +- return $this->convertAddressListToAddressArray($this->message->getReplyTo()); ++ return $this->convertAddressListToAddressArray($this->zendMessage->getReplyTo()); + } + + /** +@@ -163,7 +154,7 @@ class EmailMessage implements EmailMessageInterface + public function getSender(): ?Address + { + /** @var ZendAddress $zendSender */ +- if (!$zendSender = $this->message->getSender()) { ++ if (!$zendSender = $this->zendMessage->getSender()) { + return null; + } + +@@ -178,18 +169,10 @@ class EmailMessage implements EmailMessageInterface + /** + * @inheritDoc + */ +- public function getSubject(): ?string +- { +- return $this->message->getSubject(); +- } +- +- /** +- * @inheritDoc +- */ +- public function getBody(): MimeMessageInterface ++ public function getMessageBody(): MimeMessageInterface + { + return $this->mimeMessageFactory->create( +- ['parts' => $this->message->getBody()->getParts()] ++ ['parts' => $this->zendMessage->getBody()->getParts()] + ); + } + +@@ -198,15 +181,7 @@ class EmailMessage implements EmailMessageInterface + */ + public function getBodyText(): string + { +- return $this->message->getBodyText(); +- } +- +- /** +- * @inheritdoc +- */ +- public function getRawMessage(): string +- { +- return $this->toString(); ++ return $this->zendMessage->getBodyText(); + } + + /** +@@ -214,7 +189,7 @@ class EmailMessage implements EmailMessageInterface + */ + public function toString(): string + { +- return $this->message->toString(); ++ return $this->zendMessage->toString(); + } + + /** +diff --git a/vendor/magento/framework/Mail/EmailMessageInterface.php b/vendor/magento/framework/Mail/EmailMessageInterface.php +index 95f83ff679c..93eaa4acde3 100644 +--- a/vendor/magento/framework/Mail/EmailMessageInterface.php ++++ b/vendor/magento/framework/Mail/EmailMessageInterface.php +@@ -9,7 +9,7 @@ namespace Magento\Framework\Mail; + /** + * Interface EmailMessageInterface + */ +-interface EmailMessageInterface ++interface EmailMessageInterface extends MailMessageInterface + { + /** + * Get the message encoding +@@ -72,14 +72,14 @@ interface EmailMessageInterface + * + * @return null|string + */ +- public function getSubject(): ?string; ++ public function getSubject(); + + /** + * Return the currently set message body + * + * @return MimeMessageInterface + */ +- public function getBody(): MimeMessageInterface; ++ public function getMessageBody(): MimeMessageInterface; + + /** + * Get the string-serialized message body text +diff --git a/vendor/magento/framework/Mail/MailMessageInterface.php b/vendor/magento/framework/Mail/MailMessageInterface.php +index da010be2702..5179e6057c4 100644 +--- a/vendor/magento/framework/Mail/MailMessageInterface.php ++++ b/vendor/magento/framework/Mail/MailMessageInterface.php +@@ -10,6 +10,8 @@ namespace Magento\Framework\Mail; + * + * @api + * @since 101.0.8 ++ * @deprecated ++ * @see \Magento\Framework\Mail\EmailMessageInterface + */ + interface MailMessageInterface extends MessageInterface + { +diff --git a/vendor/magento/framework/Mail/Message.php b/vendor/magento/framework/Mail/Message.php +index b15b75ca9ac..1f423e80108 100644 +--- a/vendor/magento/framework/Mail/Message.php ++++ b/vendor/magento/framework/Mail/Message.php +@@ -10,13 +10,16 @@ use Zend\Mime\Part; + + /** + * Class Message for email transportation ++ * ++ * @deprecated ++ * @see \Magento\Framework\Mail\EmailMessage + */ + class Message implements MailMessageInterface + { + /** + * @var \Zend\Mail\Message + */ +- private $zendMessage; ++ protected $zendMessage; + + /** + * Message type +diff --git a/vendor/magento/framework/Mail/Template/TransportBuilder.php b/vendor/magento/framework/Mail/Template/TransportBuilder.php +index 4a8d6572faa..2d28e2f560a 100644 +--- a/vendor/magento/framework/Mail/Template/TransportBuilder.php ++++ b/vendor/magento/framework/Mail/Template/TransportBuilder.php +@@ -87,7 +87,7 @@ class TransportBuilder + /** + * Message + * +- * @var EmailMessageInterface ++ * @var MessageInterface + */ + protected $message; +