diff --git a/lib/Mailer/Methods/ErrorMappers/PHPMailMapper.php b/lib/Mailer/Methods/ErrorMappers/PHPMailMapper.php index c0b5c07f40..d5932a4438 100644 --- a/lib/Mailer/Methods/ErrorMappers/PHPMailMapper.php +++ b/lib/Mailer/Methods/ErrorMappers/PHPMailMapper.php @@ -8,8 +8,16 @@ use MailPoet\Mailer\SubscriberError; class PHPMailMapper { use ConnectionErrorMapperTrait; - function getErrorFromException(\Exception $e) { - return new MailerError(MailerError::OPERATION_SEND, MailerError::LEVEL_HARD, $e->getMessage()); + function getErrorFromException(\Exception $e, $subscriber, $extra_params) { + $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) { diff --git a/lib/Mailer/Methods/PHPMail.php b/lib/Mailer/Methods/PHPMail.php index c02df9f1d1..1307b7dd77 100644 --- a/lib/Mailer/Methods/PHPMail.php +++ b/lib/Mailer/Methods/PHPMail.php @@ -33,7 +33,7 @@ class PHPMail { $mailer = $this->configureMailerWithMessage($newsletter, $subscriber, $extra_params); $result = $mailer->send(); } 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) { return Mailer::formatMailerSendSuccessResult(); diff --git a/tests/unit/Mailer/Methods/ErrorMappers/PHPMailMapperTest.php b/tests/unit/Mailer/Methods/ErrorMappers/PHPMailMapperTest.php new file mode 100644 index 0000000000..f5a955570a --- /dev/null +++ b/tests/unit/Mailer/Methods/ErrorMappers/PHPMailMapperTest.php @@ -0,0 +1,34 @@ +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); + } +}