Add soft level errors distinction for Amazon SES service
[MAILPOET-1154]
This commit is contained in:
@ -70,7 +70,7 @@ class AmazonSES {
|
|||||||
$this->request($newsletter, $subscriber, $extra_params)
|
$this->request($newsletter, $subscriber, $extra_params)
|
||||||
);
|
);
|
||||||
} catch(\Exception $e) {
|
} catch(\Exception $e) {
|
||||||
$error = $this->error_mapper->getErrorFromException($e);
|
$error = $this->error_mapper->getErrorFromException($e, $subscriber);
|
||||||
return Mailer::formatMailerErrorResult($error);
|
return Mailer::formatMailerErrorResult($error);
|
||||||
}
|
}
|
||||||
if(is_wp_error($result)) {
|
if(is_wp_error($result)) {
|
||||||
|
@ -8,19 +8,33 @@ use MailPoet\Mailer\SubscriberError;
|
|||||||
class AmazonSESMapper {
|
class AmazonSESMapper {
|
||||||
use ConnectionErrorMapperTrait;
|
use ConnectionErrorMapperTrait;
|
||||||
|
|
||||||
function getErrorFromException(\Exception $e) {
|
function getErrorFromException(\Exception $e, $subscriber) {
|
||||||
return new MailerError(MailerError::OPERATION_SEND, MailerError::LEVEL_HARD, $e->getMessage());
|
$level = MailerError::LEVEL_HARD;
|
||||||
|
if($e instanceof \Swift_RfcComplianceException) {
|
||||||
|
$level = MailerError::LEVEL_SOFT;
|
||||||
|
}
|
||||||
|
$subscriber_errors = [new SubscriberError($subscriber, null)];
|
||||||
|
return new MailerError(MailerError::OPERATION_SEND, $level, $e->getMessage(), null, $subscriber_errors);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @see https://docs.aws.amazon.com/ses/latest/DeveloperGuide/api-error-codes.html
|
||||||
|
* @return MailerError
|
||||||
|
*/
|
||||||
function getErrorFromResponse($response, $subscriber, $extra_params) {
|
function getErrorFromResponse($response, $subscriber, $extra_params) {
|
||||||
$response = ($response) ?
|
$message = ($response) ?
|
||||||
$response->Error->Message->__toString() :
|
$response->Error->Message->__toString() :
|
||||||
sprintf(__('%s has returned an unknown error.', 'mailpoet'), Mailer::METHOD_AMAZONSES);
|
sprintf(__('%s has returned an unknown error.', 'mailpoet'), Mailer::METHOD_AMAZONSES);
|
||||||
|
|
||||||
|
$level = MailerError::LEVEL_HARD;
|
||||||
|
if($response && $response->Error->Code->__toString() === 'MessageRejected') {
|
||||||
|
$level = MailerError::LEVEL_SOFT;
|
||||||
|
}
|
||||||
|
|
||||||
$subscriber_errors = [];
|
$subscriber_errors = [];
|
||||||
if(empty($extra_params['test_email'])) {
|
if(empty($extra_params['test_email'])) {
|
||||||
$subscriber_errors[] = new SubscriberError($subscriber, null);
|
$subscriber_errors[] = new SubscriberError($subscriber, null);
|
||||||
}
|
}
|
||||||
return new MailerError(MailerError::OPERATION_SEND, MailerError::LEVEL_HARD, $response, null, $subscriber_errors);
|
return new MailerError(MailerError::OPERATION_SEND, $level, $message, null, $subscriber_errors);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -0,0 +1,56 @@
|
|||||||
|
<?php
|
||||||
|
namespace MailPoet\Test\Mailer\Methods\ErrorMappers;
|
||||||
|
|
||||||
|
use MailPoet\Mailer\MailerError;
|
||||||
|
use MailPoet\Mailer\Methods\ErrorMappers\AmazonSESMapper;
|
||||||
|
use SimpleXMLElement;
|
||||||
|
|
||||||
|
class AmazonSESMapperTest extends \MailPoetTest {
|
||||||
|
|
||||||
|
/** @var AmazonSESMapper*/
|
||||||
|
private $mapper;
|
||||||
|
|
||||||
|
/** @var array */
|
||||||
|
private $response_data = [];
|
||||||
|
|
||||||
|
function _before() {
|
||||||
|
$this->mapper = new AmazonSESMapper();
|
||||||
|
$this->response_data = [
|
||||||
|
'Error' => [
|
||||||
|
'Type' => 'Sender',
|
||||||
|
'Code' => 'ConfigurationSetDoesNotExist',
|
||||||
|
'Message' => 'Some message',
|
||||||
|
],
|
||||||
|
'RequestId' => '01ca93ec-b5a3-11e8-bff8-49dd5ddf8019',
|
||||||
|
];
|
||||||
|
}
|
||||||
|
|
||||||
|
function testGetProperError() {
|
||||||
|
$response = $this->buildXmlResponseFromArray($this->response_data, new SimpleXMLElement('<response/>'));
|
||||||
|
$error = $this->mapper->getErrorFromResponse($response, 'john@rambo.com', []);
|
||||||
|
expect($error->getLevel())->equals(MailerError::LEVEL_HARD);
|
||||||
|
expect($error->getMessage())->equals('Some message');
|
||||||
|
expect($error->getSubscriberErrors()[0]->getEmail())->equals('john@rambo.com');
|
||||||
|
}
|
||||||
|
|
||||||
|
function testGetSoftErrorForRejectedMessage() {
|
||||||
|
$this->response_data['Error']['Code'] = 'MessageRejected';
|
||||||
|
$response = $this->buildXmlResponseFromArray($this->response_data, new SimpleXMLElement('<response/>'));
|
||||||
|
$error = $this->mapper->getErrorFromResponse($response, 'john@rambo.com', []);
|
||||||
|
expect($error->getLevel())->equals(MailerError::LEVEL_SOFT);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return SimpleXMLElement
|
||||||
|
*/
|
||||||
|
private function buildXmlResponseFromArray($response_data, SimpleXMLElement $xml) {
|
||||||
|
foreach($response_data as $tag => $value) {
|
||||||
|
if(is_array($value)) {
|
||||||
|
$this->buildXmlResponseFromArray($value, $xml->addChild($tag));
|
||||||
|
} else {
|
||||||
|
$xml->addChild($tag, $value);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return $xml;
|
||||||
|
}
|
||||||
|
}
|
Reference in New Issue
Block a user