Skip to content

Commit 5639587

Browse files
Merge pull request #3 from magento/MAGECLOUD-4442
MAGECLOUD-4442: Deliver fix for mail interfaces
2 parents 173ee29 + 2914e4e commit 5639587

File tree

2 files changed

+384
-0
lines changed

2 files changed

+384
-0
lines changed

patches.json

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -180,6 +180,9 @@
180180
"Re-work consumers to terminate as soon as there is nothing left to process": {
181181
"2.2.0 - 2.3.1": "MAGECLOUD-4071__terminate_consumers_if_the_queue_is_empty__2.2.0.patch",
182182
"2.3.2 - 2.3.3": "MAGECLOUD-4071__terminate_consumers_if_the_queue_is_empty__2.3.2.patch"
183+
},
184+
"Backward Compatibility of new Mail Interfaces": {
185+
"2.3.3": "MAGECLOUD-4442__fix_backward_compatibility_of_new_mail_interfaces__2.3.3.patch"
183186
}
184187
},
185188
"monolog/monolog": {
Lines changed: 381 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,381 @@
1+
diff --git a/vendor/magento/module-email/Model/Transport.php b/vendor/magento/module-email/Model/Transport.php
2+
index cbce1682cb5..79ceb56a883 100644
3+
--- a/vendor/magento/module-email/Model/Transport.php
4+
+++ b/vendor/magento/module-email/Model/Transport.php
5+
@@ -9,7 +9,6 @@ namespace Magento\Email\Model;
6+
7+
use Magento\Framework\App\Config\ScopeConfigInterface;
8+
use Magento\Framework\Exception\MailException;
9+
-use Magento\Framework\Mail\EmailMessageInterface;
10+
use Magento\Framework\Mail\MessageInterface;
11+
use Magento\Framework\Mail\TransportInterface;
12+
use Magento\Framework\Phrase;
13+
@@ -62,12 +61,12 @@ class Transport implements TransportInterface
14+
private $message;
15+
16+
/**
17+
- * @param EmailMessageInterface $message Email message object
18+
+ * @param MessageInterface $message Email message object
19+
* @param ScopeConfigInterface $scopeConfig Core store config
20+
* @param null|string|array|\Traversable $parameters Config options for sendmail parameters
21+
*/
22+
public function __construct(
23+
- EmailMessageInterface $message,
24+
+ MessageInterface $message,
25+
ScopeConfigInterface $scopeConfig,
26+
$parameters = null
27+
) {
28+
diff --git a/dev/tests/integration/testsuite/Magento/Customer/Controller/AccountTest.php b/dev/tests/integration/testsuite/Magento/Customer/Controller/AccountTest.php
29+
index 32f12dada57..4210312c55a 100644
30+
--- a/dev/tests/integration/testsuite/Magento/Customer/Controller/AccountTest.php
31+
+++ b/dev/tests/integration/testsuite/Magento/Customer/Controller/AccountTest.php
32+
@@ -769,7 +769,7 @@ class AccountTest extends \Magento\TestFramework\TestCase\AbstractController
33+
$message = $this->transportBuilderMock->getSentMessage();
34+
$rawMessage = $message->getRawMessage();
35+
36+
- $this->assertContains('To: John Smith <' . $email . '>', $rawMessage);
37+
+ $this->assertContains('To: =?utf-8?Q?John=20Smith?= <' . $email . '>', $rawMessage);
38+
39+
$content = $message->getBody()->getParts()[0]->getRawContent();
40+
$confirmationUrl = $this->getConfirmationUrlFromMessageContent($content);
41+
diff --git a/dev/tests/integration/testsuite/Magento/Framework/Mail/EmailMessageTest.php b/dev/tests/integration/testsuite/Magento/Framework/Mail/EmailMessageTest.php
42+
index 10a54b4e1b8..186c3e2796c 100644
43+
--- a/dev/tests/integration/testsuite/Magento/Framework/Mail/EmailMessageTest.php
44+
+++ b/dev/tests/integration/testsuite/Magento/Framework/Mail/EmailMessageTest.php
45+
@@ -14,6 +14,7 @@ use PHPUnit\Framework\TestCase;
46+
47+
/**
48+
* Class EmailMessageTest
49+
+ * @SuppressWarnings(PHPMD.CouplingBetweenObjects)
50+
*/
51+
class EmailMessageTest extends TestCase
52+
{
53+
@@ -164,23 +165,42 @@ class EmailMessageTest extends TestCase
54+
'cc' => $cc,
55+
'replyTo' => $replyTo,
56+
'bcc' => $bcc,
57+
- 'sender' => $sender
58+
+ 'sender' => $sender,
59+
];
60+
$message = $this->messageFactory->create($data);
61+
62+
$this->assertContains($content, $message->toString());
63+
$this->assertContains('Content-Type: ' . $type, $message->toString());
64+
- $senderString = 'Sender: ' . $sender->getName() . ' <' . $sender->getEmail() . '>';
65+
+ $senderString = 'Sender: =?utf-8?Q?'
66+
+ . str_replace(' ', '=20', $sender->getName())
67+
+ . '?= <'
68+
+ . $sender->getEmail()
69+
+ . '>';
70+
$this->assertContains($senderString, $message->toString());
71+
$this->assertContains('From: ' . $from[0]->getEmail(), $message->toString());
72+
- $replyToString = 'Reply-To: ' . $replyTo[0]->getName() . ' <' . $replyTo[0]->getEmail() . '>';
73+
+ $replyToString = 'Reply-To: =?utf-8?Q?'
74+
+ . str_replace(' ', '=20', $replyTo[0]->getName())
75+
+ . '?= <'
76+
+ . $replyTo[0]->getEmail()
77+
+ . '>';
78+
$this->assertContains($replyToString, $message->toString());
79+
- $toString = 'To: ' . $to[0]->getName() . ' <' . $to[0]->getEmail() . '>';
80+
+ $toString = 'To: =?utf-8?Q?'
81+
+ . str_replace(' ', '=20', $to[0]->getName())
82+
+ . '?= <'
83+
+ . $to[0]->getEmail()
84+
+ . '>';
85+
$this->assertContains($toString, $message->toString());
86+
- $ccString = 'Cc: ' . $cc[0]->getName() . ' <' . $cc[0]->getEmail() . '>';
87+
+ $ccString = 'Cc: =?utf-8?Q?'
88+
+ . str_replace(' ', '=20', $cc[0]->getName())
89+
+ . '?= <'
90+
+ . $cc[0]->getEmail()
91+
+ . '>';
92+
$this->assertContains($ccString, $message->toString());
93+
$this->assertContains('Bcc: ' . $bcc[0]->getEmail(), $message->toString());
94+
- $this->assertContains('Content-Description: ' . $this->description, $message->toString());
95+
+ $contentDescription = 'Content-Description: =?utf-8?Q?'
96+
+ . str_replace(' ', '=20', $this->description)
97+
+ . '?=';
98+
+ $this->assertContains($contentDescription, $message->toString());
99+
$this->assertContains('Subject: ' . $this->subject, $message->toString());
100+
$this->assertContains($content, $message->toString());
101+
//tests address factory
102+
@@ -235,6 +255,7 @@ class EmailMessageTest extends TestCase
103+
'body' => $mimeMessage,
104+
'subject' => $this->subject,
105+
'to' => [$addressTo],
106+
+ 'encoding' => '',
107+
];
108+
$message = $this->messageFactory->create($data);
109+
110+
diff --git a/vendor/magento/framework/Mail/EmailMessage.php b/vendor/magento/framework/Mail/EmailMessage.php
111+
index aaef9750751..02c75977cd0 100644
112+
--- a/vendor/magento/framework/Mail/EmailMessage.php
113+
+++ b/vendor/magento/framework/Mail/EmailMessage.php
114+
@@ -10,19 +10,13 @@ namespace Magento\Framework\Mail;
115+
use Magento\Framework\Mail\Exception\InvalidArgumentException;
116+
use Zend\Mail\Address as ZendAddress;
117+
use Zend\Mail\AddressList;
118+
-use Zend\Mail\Message as ZendMessage;
119+
use Zend\Mime\Message as ZendMimeMessage;
120+
121+
/**
122+
- * Class EmailMessage
123+
+ * Email message
124+
*/
125+
-class EmailMessage implements EmailMessageInterface
126+
+class EmailMessage extends Message implements EmailMessageInterface
127+
{
128+
- /**
129+
- * @var ZendMessage
130+
- */
131+
- private $message;
132+
-
133+
/**
134+
* @var MimeMessageInterfaceFactory
135+
*/
136+
@@ -64,38 +58,35 @@ class EmailMessage implements EmailMessageInterface
137+
?array $replyTo = null,
138+
?Address $sender = null,
139+
?string $subject = '',
140+
- ?string $encoding = ''
141+
+ ?string $encoding = 'utf-8'
142+
) {
143+
- $this->message = new ZendMessage();
144+
+ parent::__construct($encoding);
145+
$mimeMessage = new ZendMimeMessage();
146+
$mimeMessage->setParts($body->getParts());
147+
- $this->message->setBody($mimeMessage);
148+
- if ($encoding) {
149+
- $this->message->setEncoding($encoding);
150+
- }
151+
+ $this->zendMessage->setBody($mimeMessage);
152+
if ($subject) {
153+
- $this->message->setSubject($subject);
154+
+ $this->zendMessage->setSubject($subject);
155+
}
156+
if ($sender) {
157+
- $this->message->setSender($sender->getEmail(), $sender->getName());
158+
+ $this->zendMessage->setSender($sender->getEmail(), $sender->getName());
159+
}
160+
if (count($to) < 1) {
161+
throw new InvalidArgumentException('Email message must have at list one addressee');
162+
}
163+
if ($to) {
164+
- $this->message->setTo($this->convertAddressArrayToAddressList($to));
165+
+ $this->zendMessage->setTo($this->convertAddressArrayToAddressList($to));
166+
}
167+
if ($replyTo) {
168+
- $this->message->setReplyTo($this->convertAddressArrayToAddressList($replyTo));
169+
+ $this->zendMessage->setReplyTo($this->convertAddressArrayToAddressList($replyTo));
170+
}
171+
if ($from) {
172+
- $this->message->setFrom($this->convertAddressArrayToAddressList($from));
173+
+ $this->zendMessage->setFrom($this->convertAddressArrayToAddressList($from));
174+
}
175+
if ($cc) {
176+
- $this->message->setCc($this->convertAddressArrayToAddressList($cc));
177+
+ $this->zendMessage->setCc($this->convertAddressArrayToAddressList($cc));
178+
}
179+
if ($bcc) {
180+
- $this->message->setBcc($this->convertAddressArrayToAddressList($bcc));
181+
+ $this->zendMessage->setBcc($this->convertAddressArrayToAddressList($bcc));
182+
}
183+
$this->mimeMessageFactory = $mimeMessageFactory;
184+
$this->addressFactory = $addressFactory;
185+
@@ -106,7 +97,7 @@ class EmailMessage implements EmailMessageInterface
186+
*/
187+
public function getEncoding(): string
188+
{
189+
- return $this->message->getEncoding();
190+
+ return $this->zendMessage->getEncoding();
191+
}
192+
193+
/**
194+
@@ -114,7 +105,7 @@ class EmailMessage implements EmailMessageInterface
195+
*/
196+
public function getHeaders(): array
197+
{
198+
- return $this->message->getHeaders()->toArray();
199+
+ return $this->zendMessage->getHeaders()->toArray();
200+
}
201+
202+
/**
203+
@@ -122,7 +113,7 @@ class EmailMessage implements EmailMessageInterface
204+
*/
205+
public function getFrom(): ?array
206+
{
207+
- return $this->convertAddressListToAddressArray($this->message->getFrom());
208+
+ return $this->convertAddressListToAddressArray($this->zendMessage->getFrom());
209+
}
210+
211+
/**
212+
@@ -130,7 +121,7 @@ class EmailMessage implements EmailMessageInterface
213+
*/
214+
public function getTo(): array
215+
{
216+
- return $this->convertAddressListToAddressArray($this->message->getTo());
217+
+ return $this->convertAddressListToAddressArray($this->zendMessage->getTo());
218+
}
219+
220+
/**
221+
@@ -138,7 +129,7 @@ class EmailMessage implements EmailMessageInterface
222+
*/
223+
public function getCc(): ?array
224+
{
225+
- return $this->convertAddressListToAddressArray($this->message->getCc());
226+
+ return $this->convertAddressListToAddressArray($this->zendMessage->getCc());
227+
}
228+
229+
/**
230+
@@ -146,7 +137,7 @@ class EmailMessage implements EmailMessageInterface
231+
*/
232+
public function getBcc(): ?array
233+
{
234+
- return $this->convertAddressListToAddressArray($this->message->getBcc());
235+
+ return $this->convertAddressListToAddressArray($this->zendMessage->getBcc());
236+
}
237+
238+
/**
239+
@@ -154,7 +145,7 @@ class EmailMessage implements EmailMessageInterface
240+
*/
241+
public function getReplyTo(): ?array
242+
{
243+
- return $this->convertAddressListToAddressArray($this->message->getReplyTo());
244+
+ return $this->convertAddressListToAddressArray($this->zendMessage->getReplyTo());
245+
}
246+
247+
/**
248+
@@ -163,7 +154,7 @@ class EmailMessage implements EmailMessageInterface
249+
public function getSender(): ?Address
250+
{
251+
/** @var ZendAddress $zendSender */
252+
- if (!$zendSender = $this->message->getSender()) {
253+
+ if (!$zendSender = $this->zendMessage->getSender()) {
254+
return null;
255+
}
256+
257+
@@ -178,18 +169,10 @@ class EmailMessage implements EmailMessageInterface
258+
/**
259+
* @inheritDoc
260+
*/
261+
- public function getSubject(): ?string
262+
- {
263+
- return $this->message->getSubject();
264+
- }
265+
-
266+
- /**
267+
- * @inheritDoc
268+
- */
269+
- public function getBody(): MimeMessageInterface
270+
+ public function getMessageBody(): MimeMessageInterface
271+
{
272+
return $this->mimeMessageFactory->create(
273+
- ['parts' => $this->message->getBody()->getParts()]
274+
+ ['parts' => $this->zendMessage->getBody()->getParts()]
275+
);
276+
}
277+
278+
@@ -198,15 +181,7 @@ class EmailMessage implements EmailMessageInterface
279+
*/
280+
public function getBodyText(): string
281+
{
282+
- return $this->message->getBodyText();
283+
- }
284+
-
285+
- /**
286+
- * @inheritdoc
287+
- */
288+
- public function getRawMessage(): string
289+
- {
290+
- return $this->toString();
291+
+ return $this->zendMessage->getBodyText();
292+
}
293+
294+
/**
295+
@@ -214,7 +189,7 @@ class EmailMessage implements EmailMessageInterface
296+
*/
297+
public function toString(): string
298+
{
299+
- return $this->message->toString();
300+
+ return $this->zendMessage->toString();
301+
}
302+
303+
/**
304+
diff --git a/vendor/magento/framework/Mail/EmailMessageInterface.php b/vendor/magento/framework/Mail/EmailMessageInterface.php
305+
index 95f83ff679c..93eaa4acde3 100644
306+
--- a/vendor/magento/framework/Mail/EmailMessageInterface.php
307+
+++ b/vendor/magento/framework/Mail/EmailMessageInterface.php
308+
@@ -9,7 +9,7 @@ namespace Magento\Framework\Mail;
309+
/**
310+
* Interface EmailMessageInterface
311+
*/
312+
-interface EmailMessageInterface
313+
+interface EmailMessageInterface extends MailMessageInterface
314+
{
315+
/**
316+
* Get the message encoding
317+
@@ -72,14 +72,14 @@ interface EmailMessageInterface
318+
*
319+
* @return null|string
320+
*/
321+
- public function getSubject(): ?string;
322+
+ public function getSubject();
323+
324+
/**
325+
* Return the currently set message body
326+
*
327+
* @return MimeMessageInterface
328+
*/
329+
- public function getBody(): MimeMessageInterface;
330+
+ public function getMessageBody(): MimeMessageInterface;
331+
332+
/**
333+
* Get the string-serialized message body text
334+
diff --git a/vendor/magento/framework/Mail/MailMessageInterface.php b/vendor/magento/framework/Mail/MailMessageInterface.php
335+
index da010be2702..5179e6057c4 100644
336+
--- a/vendor/magento/framework/Mail/MailMessageInterface.php
337+
+++ b/vendor/magento/framework/Mail/MailMessageInterface.php
338+
@@ -10,6 +10,8 @@ namespace Magento\Framework\Mail;
339+
*
340+
* @api
341+
* @since 101.0.8
342+
+ * @deprecated
343+
+ * @see \Magento\Framework\Mail\EmailMessageInterface
344+
*/
345+
interface MailMessageInterface extends MessageInterface
346+
{
347+
diff --git a/vendor/magento/framework/Mail/Message.php b/vendor/magento/framework/Mail/Message.php
348+
index b15b75ca9ac..1f423e80108 100644
349+
--- a/vendor/magento/framework/Mail/Message.php
350+
+++ b/vendor/magento/framework/Mail/Message.php
351+
@@ -10,13 +10,16 @@ use Zend\Mime\Part;
352+
353+
/**
354+
* Class Message for email transportation
355+
+ *
356+
+ * @deprecated
357+
+ * @see \Magento\Framework\Mail\EmailMessage
358+
*/
359+
class Message implements MailMessageInterface
360+
{
361+
/**
362+
* @var \Zend\Mail\Message
363+
*/
364+
- private $zendMessage;
365+
+ protected $zendMessage;
366+
367+
/**
368+
* Message type
369+
diff --git a/vendor/magento/framework/Mail/Template/TransportBuilder.php b/vendor/magento/framework/Mail/Template/TransportBuilder.php
370+
index 4a8d6572faa..2d28e2f560a 100644
371+
--- a/vendor/magento/framework/Mail/Template/TransportBuilder.php
372+
+++ b/vendor/magento/framework/Mail/Template/TransportBuilder.php
373+
@@ -87,7 +87,7 @@ class TransportBuilder
374+
/**
375+
* Message
376+
*
377+
- * @var EmailMessageInterface
378+
+ * @var MessageInterface
379+
*/
380+
protected $message;
381+

0 commit comments

Comments
 (0)