diff --git a/assets/js/src/newsletters/listings/mixins.jsx b/assets/js/src/newsletters/listings/mixins.jsx index 80e357f905..b5213ceff3 100644 --- a/assets/js/src/newsletters/listings/mixins.jsx +++ b/assets/js/src/newsletters/listings/mixins.jsx @@ -391,7 +391,11 @@ const StatisticsMixin = { const MailerMixin = { checkMailerStatus: function checkMailerStatus(state) { - if (state.meta.mta_log.error && state.meta.mta_log.status === 'paused') { + if ( + state.meta.mta_log.error + && state.meta.mta_log.status === 'paused' + && state.meta.mta_log.error.operation !== 'authorization' + ) { const errorType = MailerMixin.getMailerErrorType(state); MailPoet.Notice[errorType]( '', diff --git a/lib/Config/Menu.php b/lib/Config/Menu.php index 400073100a..ae5c434184 100644 --- a/lib/Config/Menu.php +++ b/lib/Config/Menu.php @@ -73,6 +73,7 @@ class Menu { $this->subscribers_over_limit = $subscribers_feature->check(); $this->checkMailPoetAPIKey(); $this->checkPremiumKey(); + $this->checkFromEmailAuthorization(); add_action( 'admin_menu', @@ -836,6 +837,13 @@ class Menu { $this->premium_key_valid = $checker->isPremiumKeyValid($show_notices); } + function checkFromEmailAuthorization(ServicesChecker $checker = null) { + if (self::isOnMailPoetAdminPage()) { + $checker = $checker ?: new ServicesChecker(); + $checker->isFromEmailAuthorized(true); + } + } + function getLimitPerPage($model = null) { if ($model === null) { return Listing\Handler::DEFAULT_LIMIT_PER_PAGE; diff --git a/lib/Config/ServicesChecker.php b/lib/Config/ServicesChecker.php index 8923f068b6..592bb318d5 100644 --- a/lib/Config/ServicesChecker.php +++ b/lib/Config/ServicesChecker.php @@ -1,6 +1,7 @@ settings->get('mta_log.error', []); + + if ($mta_log_error && $mta_log_error['operation'] === MailerError::OPERATION_AUTHORIZATION) { + if ($display_error_notice) { + WPNotice::displayError($mta_log_error['error_message'], 'js-error-unauthorized-email', '', false, false); + } + return false; + } + + return true; + } } diff --git a/lib/Mailer/MailerError.php b/lib/Mailer/MailerError.php index e646b7c201..f3aa5c08d4 100644 --- a/lib/Mailer/MailerError.php +++ b/lib/Mailer/MailerError.php @@ -4,6 +4,7 @@ namespace MailPoet\Mailer; class MailerError { const OPERATION_CONNECT = 'connect'; const OPERATION_SEND = 'send'; + const OPERATION_AUTHORIZATION = 'authorization'; const LEVEL_HARD = 'hard'; const LEVEL_SOFT = 'soft'; diff --git a/lib/Mailer/Methods/ErrorMappers/MailPoetMapper.php b/lib/Mailer/Methods/ErrorMappers/MailPoetMapper.php index ecb2fc372d..21d3f6b793 100644 --- a/lib/Mailer/Methods/ErrorMappers/MailPoetMapper.php +++ b/lib/Mailer/Methods/ErrorMappers/MailPoetMapper.php @@ -22,8 +22,9 @@ class MailPoetMapper { ); } - function getErrorForResult(array $result, $subscribers) { + function getErrorForResult(array $result, $subscribers, $sender = null) { $level = MailerError::LEVEL_HARD; + $operation = MailerError::OPERATION_SEND; $retry_interval = null; $subscribers_errors = []; $result_code = !empty($result['code']) ? $result['code'] : null; @@ -51,18 +52,35 @@ class MailPoetMapper { $retry_interval = self::TEMPORARY_UNAVAILABLE_RETRY_INTERVAL; break; case API::RESPONSE_CODE_CAN_NOT_SEND: - $message = Helpers::replaceLinkTags( - __('You currently are not permitted to send any emails with MailPoet Sending Service, which may have happened due to poor deliverability. Please [link]contact our support team[/link] to resolve the issue.', 'mailpoet'), - 'https://www.mailpoet.com/support/', - array('target' => '_blank') - ); + if ($result['message'] === MailerError::MESSAGE_EMAIL_NOT_AUTHORIZED) { + $operation = MailerError::OPERATION_AUTHORIZATION; + $message = sprintf(__('
The MailPoet Sending Service did not send your latest email because the address %s is not yet authorized.
', 'mailpoet'), $sender ? $sender['from_email'] : __('Unknown address')); + $message .= ''; + $message .= Helpers::replaceLinkTags( + __('[link]Authorize your email in your account now.[/link]', 'mailpoet'), + 'https://account.mailpoet.com/account/authorization', + array( + 'class' => 'button button-primary', + 'target' => '_blank', + ) + ); + $message .= ' '; + $message .= '
'; + $message .= ""; + } else { + $message = Helpers::replaceLinkTags( + __('You currently are not permitted to send any emails with MailPoet Sending Service, which may have happened due to poor deliverability. Please [link]contact our support team[/link] to resolve the issue.', 'mailpoet'), + 'https://www.mailpoet.com/support/', + array('target' => '_blank') + ); + } break; case API::RESPONSE_CODE_KEY_INVALID: case API::RESPONSE_CODE_PAYLOAD_TOO_BIG: default: $message = $result['message']; } - return new MailerError(MailerError::OPERATION_SEND, $level, $message, $retry_interval, $subscribers_errors); + return new MailerError($operation, $level, $message, $retry_interval, $subscribers_errors); } private function getSubscribersErrors($result_parsed, $subscribers) { diff --git a/lib/Mailer/Methods/MailPoet.php b/lib/Mailer/Methods/MailPoet.php index b0238c72d6..517f98f669 100644 --- a/lib/Mailer/Methods/MailPoet.php +++ b/lib/Mailer/Methods/MailPoet.php @@ -51,7 +51,7 @@ class MailPoet { if (!empty($result['code']) && $result['code'] === API::RESPONSE_CODE_KEY_INVALID) { Bridge::invalidateKey(); } - return $this->error_mapper->getErrorForResult($result, $subscriber); + return $this->error_mapper->getErrorForResult($result, $subscriber, $this->sender); } function processSubscriber($subscriber) { diff --git a/lib/WP/Notice.php b/lib/WP/Notice.php index 760791dd45..76de272b01 100644 --- a/lib/WP/Notice.php +++ b/lib/WP/Notice.php @@ -12,6 +12,7 @@ class Notice { private $message; private $classes; private $data_notice_name; + private $render_in_paragraph; function __construct($type, $message, $classes = '', $data_notice_name = '', $render_in_paragraph = true) { $this->type = $type; diff --git a/tests/integration/Mailer/Methods/ErrorMappers/MailPoetMapperTest.php b/tests/integration/Mailer/Methods/ErrorMappers/MailPoetMapperTest.php index f70c99e83f..a3f49b1324 100644 --- a/tests/integration/Mailer/Methods/ErrorMappers/MailPoetMapperTest.php +++ b/tests/integration/Mailer/Methods/ErrorMappers/MailPoetMapperTest.php @@ -68,7 +68,7 @@ class MailPoetMapperTest extends \MailPoetTest { $error = $this->mapper->getErrorForResult($api_result, $this->subscribers); expect($error)->isInstanceOf(MailerError::class); - expect($error->getOperation())->equals(MailerError::OPERATION_SEND); + expect($error->getOperation())->equals(MailerError::OPERATION_AUTHORIZATION); expect($error->getLevel())->equals(MailerError::LEVEL_HARD); expect($error->getMessage())->contains('The MailPoet Sending Service did not send your latest email because the address'); }