Add soft level errors distinction for PHPMail method

[MAILPOET-1154]
This commit is contained in:
Rostislav Wolny
2018-09-11 14:55:39 +02:00
parent 45433c9deb
commit fe69b56692
3 changed files with 45 additions and 3 deletions

View File

@ -8,8 +8,16 @@ use MailPoet\Mailer\SubscriberError;
class PHPMailMapper { class PHPMailMapper {
use ConnectionErrorMapperTrait; use ConnectionErrorMapperTrait;
function getErrorFromException(\Exception $e) { function getErrorFromException(\Exception $e, $subscriber, $extra_params) {
return new MailerError(MailerError::OPERATION_SEND, MailerError::LEVEL_HARD, $e->getMessage()); $level = MailerError::LEVEL_HARD;
if(strpos($e->getMessage(), 'Invalid address') === 0) {
$level = MailerError::LEVEL_SOFT;
}
$subscriber_errors = [];
if(empty($extra_params['test_email'])) {
$subscriber_errors[] = new SubscriberError($subscriber, null);
}
return new MailerError(MailerError::OPERATION_SEND, $level, $e->getMessage(), null, $subscriber_errors);
} }
function getErrorForSubscriber($subscriber, $extra_params) { function getErrorForSubscriber($subscriber, $extra_params) {

View File

@ -33,7 +33,7 @@ class PHPMail {
$mailer = $this->configureMailerWithMessage($newsletter, $subscriber, $extra_params); $mailer = $this->configureMailerWithMessage($newsletter, $subscriber, $extra_params);
$result = $mailer->send(); $result = $mailer->send();
} catch(\Exception $e) { } catch(\Exception $e) {
return Mailer::formatMailerErrorResult($this->error_mapper->getErrorFromException($e)); return Mailer::formatMailerErrorResult($this->error_mapper->getErrorFromException($e, $subscriber, $extra_params));
} }
if($result === true) { if($result === true) {
return Mailer::formatMailerSendSuccessResult(); return Mailer::formatMailerSendSuccessResult();

View File

@ -0,0 +1,34 @@
<?php
namespace MailPoet\Test\Mailer\Methods\ErrorMappers;
use MailPoet\Mailer\MailerError;
use MailPoet\Mailer\Methods\ErrorMappers\PHPMailMapper;
class PHPMailMapperTest extends \MailPoetTest {
/** @var PHPMailMapper*/
private $mapper;
function _before() {
$this->mapper = new PHPMailMapper();
}
function testGetProperErrorForSubscriber() {
$error = $this->mapper->getErrorForSubscriber('john@rambo.com', []);
expect($error->getLevel())->equals(MailerError::LEVEL_HARD);
expect($error->getMessage())->equals('PHPMail has returned an unknown error.');
expect($error->getSubscriberErrors()[0]->getEmail())->equals('john@rambo.com');
}
function testGetProperErrorFromException() {
$error = $this->mapper->getErrorFromException(new \Exception('Some message'), '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 testGetSoftErrorFromExceptionForInvalidEmail() {
$error = $this->mapper->getErrorFromException(new \Exception('Invalid address. (Add ...'), 'john@rambo.com', []);
expect($error->getLevel())->equals(MailerError::LEVEL_SOFT);
}
}