diff --git a/mailpoet/lib/Subscribers/SubscriberSubscribeController.php b/mailpoet/lib/Subscribers/SubscriberSubscribeController.php index 406c2856e2..e6e9f75707 100644 --- a/mailpoet/lib/Subscribers/SubscriberSubscribeController.php +++ b/mailpoet/lib/Subscribers/SubscriberSubscribeController.php @@ -151,7 +151,7 @@ class SubscriberSubscribeController { */ $this->wp->doAction('mailpoet_subscription_before_subscribe', $data, $segmentIds, $form); - [$subscriber] = $this->subscriberActions->subscribe($data, $segmentIds); + [$subscriber, $subscriptionMeta] = $this->subscriberActions->subscribe($data, $segmentIds); if (!empty($captchaSettings['type']) && $captchaSettings['type'] === CaptchaConstants::TYPE_BUILTIN) { // Captcha has been verified, invalidate the session vars @@ -166,6 +166,12 @@ class SubscriberSubscribeController { // add tags to subscriber if they are filled $this->addTagsToSubscriber($formSettings['tags'] ?? [], $subscriber); + // Confirmation email failed. We want to show the error message + if ($subscriptionMeta['confirmationEmailResult'] instanceof \Exception) { + $meta['error'] = $subscriptionMeta['confirmationEmailResult']->getMessage(); + return $meta; + } + if (!empty($formSettings['on_success'])) { if ($formSettings['on_success'] === 'page') { // redirect to a page on a success, pass the page url in the meta diff --git a/mailpoet/tests/integration/Subscribers/SubscriberSubscribeControllerTest.php b/mailpoet/tests/integration/Subscribers/SubscriberSubscribeControllerTest.php index 6bc90c28bd..0c9bfa325a 100644 --- a/mailpoet/tests/integration/Subscribers/SubscriberSubscribeControllerTest.php +++ b/mailpoet/tests/integration/Subscribers/SubscriberSubscribeControllerTest.php @@ -91,6 +91,28 @@ class SubscriberSubscribeControllerTest extends \MailPoetTest { expect($subscriber->getStatus())->equals(SubscriberEntity::STATUS_UNCONFIRMED); } + public function testItReturnsInfoAboutErrorWhenConfirmationEmailFails(): void { + $confirmationEmailMailerMock = $this->createMock(ConfirmationEmailMailer::class); + $confirmationEmailMailerMock->method('sendConfirmationEmailOnce') + ->willThrowException(new \Exception('Confirmation email error')); + $subscriberActions = $this->getServiceWithOverrides(SubscriberActions::class, ['confirmationEmailMailer' => $confirmationEmailMailerMock]); + $subscriberController = $this->getServiceWithOverrides(SubscriberSubscribeController::class, ['subscriberActions' => $subscriberActions]); + $segment = $this->segmentsRepository->createOrUpdate('Segment 1'); + $form = $this->createForm($segment); + + $data = [ + $this->obfuscatedEmail => 'subscriber' . rand(0, 10000) . '@example.com', + $this->obfuscatedSegments => [$segment->getId()], + 'form_id' => $form->getId(), + ]; + $result = $subscriberController->subscribe($data); + + $subscriber = $this->subscribersRepository->findOneBy(['email' => $data[$this->obfuscatedEmail]]); + $this->assertInstanceOf(SubscriberEntity::class, $subscriber); + expect($result)->hasKey('error'); + expect($result['error'])->equals('Confirmation email error'); + } + public function testItCanSubscribeSubscriberWithCustomField(): void { $this->settings->set('signup_confirmation.enabled', false); $segment = $this->segmentsRepository->createOrUpdate('Segment 1');