Skip to content

Commit da6478c

Browse files
committed
Merge branch 'MC-38337' of https://github.com/magento-tango/magento2ce into TANGO-PR-10-21-2020-24
2 parents 2618198 + 37d0868 commit da6478c

File tree

2 files changed

+103
-3
lines changed

2 files changed

+103
-3
lines changed

dev/tests/integration/testsuite/Magento/Framework/Mail/TransportBuilderTest.php

Lines changed: 80 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -116,4 +116,84 @@ public function emailDataProvider(): array
116116
]
117117
];
118118
}
119+
120+
/**
121+
* Test if invalid email in the queue will not fail the entire queue from being sent
122+
*
123+
* @magentoDataFixture Magento/Email/Model/_files/email_template.php
124+
* @magentoDbIsolation enabled
125+
*
126+
* @param string|array $emails
127+
* @dataProvider invalidEmailDataProvider
128+
* @throws LocalizedException
129+
*/
130+
public function testAddToInvalidEmailInTheQueue($emails)
131+
{
132+
$template = $this->template->load('email_exception_fixture', 'template_code');
133+
$templateId = $template->getId();
134+
135+
switch ($template->getType()) {
136+
case TemplateTypesInterface::TYPE_TEXT:
137+
$templateType = MimeInterface::TYPE_TEXT;
138+
break;
139+
140+
case TemplateTypesInterface::TYPE_HTML:
141+
$templateType = MimeInterface::TYPE_HTML;
142+
break;
143+
144+
default:
145+
$templateType = '';
146+
$this->fail('Unsupported Mime Type');
147+
}
148+
149+
$this->builder->setTemplateModel(BackendTemplate::class);
150+
151+
$vars = ['reason' => 'Reason', 'customer' => 'Customer'];
152+
$options = ['area' => 'frontend', 'store' => 1];
153+
$this->builder->setTemplateIdentifier($templateId)->setTemplateVars($vars)->setTemplateOptions($options);
154+
155+
$allEmails = $emails[0];
156+
$validOnlyEmails = $emails[1];
157+
158+
foreach ($allEmails as $email) {
159+
$this->builder->addTo($email);
160+
}
161+
162+
/** @var EmailMessage $emailMessage */
163+
$emailMessage = $this->builder->getTransport()->getMessage();
164+
$this->assertStringContainsStringIgnoringCase($templateType, $emailMessage->getHeaders()['Content-Type']);
165+
166+
$resultEmails = [];
167+
/** @var Address $toAddress */
168+
foreach ($emailMessage->getTo() as $address) {
169+
$resultEmails[] = $address->getEmail();
170+
}
171+
172+
$this->assertEquals($validOnlyEmails, $resultEmails);
173+
}
174+
175+
/**
176+
* @return array
177+
*/
178+
public function invalidEmailDataProvider(): array
179+
{
180+
return [
181+
[
182+
[
183+
[
184+
'billy.everything@someserver.com',
185+
'billy.everythingsomeserver.com',
186+
'billy.everything2@someserver.com',
187+
'billy.everythin2gsomeserver.com',
188+
'billy.everything3@someserver.com'
189+
],
190+
[
191+
'billy.everything@someserver.com',
192+
'billy.everything2@someserver.com',
193+
'billy.everything3@someserver.com'
194+
]
195+
]
196+
]
197+
];
198+
}
119199
}

lib/internal/Magento/Framework/Mail/EmailMessage.php

Lines changed: 23 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,13 +7,18 @@
77

88
namespace Magento\Framework\Mail;
99

10+
use Laminas\Mail\Exception\InvalidArgumentException as LaminasInvalidArgumentException;
11+
use Magento\Framework\App\ObjectManager;
1012
use Magento\Framework\Mail\Exception\InvalidArgumentException;
1113
use Laminas\Mail\Address as LaminasAddress;
1214
use Laminas\Mail\AddressList;
1315
use Laminas\Mime\Message as LaminasMimeMessage;
16+
use Psr\Log\LoggerInterface;
1417

1518
/**
1619
* Magento Framework Email message
20+
*
21+
* @SuppressWarnings(PHPMD.CouplingBetweenObjects)
1722
*/
1823
class EmailMessage extends Message implements EmailMessageInterface
1924
{
@@ -27,6 +32,11 @@ class EmailMessage extends Message implements EmailMessageInterface
2732
*/
2833
private $addressFactory;
2934

35+
/**
36+
* @var LoggerInterface|null
37+
*/
38+
private $logger;
39+
3040
/**
3141
* @param MimeMessageInterface $body
3242
* @param array $to
@@ -39,8 +49,8 @@ class EmailMessage extends Message implements EmailMessageInterface
3949
* @param Address|null $sender
4050
* @param string|null $subject
4151
* @param string|null $encoding
52+
* @param LoggerInterface|null $logger
4253
* @throws InvalidArgumentException
43-
*
4454
* @SuppressWarnings(PHPMD.ExcessiveParameterList)
4555
* @SuppressWarnings(PHPMD.NPathComplexity)
4656
* @SuppressWarnings(PHPMD.CyclomaticComplexity)
@@ -56,10 +66,12 @@ public function __construct(
5666
?array $replyTo = null,
5767
?Address $sender = null,
5868
?string $subject = '',
59-
?string $encoding = 'utf-8'
69+
?string $encoding = 'utf-8',
70+
?LoggerInterface $logger = null
6071
) {
6172
parent::__construct($encoding);
6273
$mimeMessage = new LaminasMimeMessage();
74+
$this->logger = $logger ?: ObjectManager::getInstance()->get(LoggerInterface::class);
6375
$mimeMessage->setParts($body->getParts());
6476
$this->zendMessage->setBody($mimeMessage);
6577
if ($subject) {
@@ -222,7 +234,15 @@ private function convertAddressArrayToAddressList(array $arrayList): AddressList
222234
{
223235
$laminasAddressList = new AddressList();
224236
foreach ($arrayList as $address) {
225-
$laminasAddressList->add($address->getEmail(), $address->getName());
237+
try {
238+
$laminasAddressList->add($address->getEmail(), $address->getName());
239+
} catch (LaminasInvalidArgumentException $e) {
240+
$this->logger->warning(
241+
'Could not add an invalid email address to the mailing queue',
242+
['exception' => $e]
243+
);
244+
continue;
245+
}
226246
}
227247

228248
return $laminasAddressList;

0 commit comments

Comments
 (0)