Add method for sending confirmation email with duplicates check
[MAILPOET-2876]
This commit is contained in:
committed by
Veljko V
parent
2697bbc9fe
commit
c6bb38cc69
@ -32,6 +32,9 @@ class ConfirmationEmailMailer {
|
|||||||
/** @var SubscriptionUrlFactory */
|
/** @var SubscriptionUrlFactory */
|
||||||
private $subscriptionUrlFactory;
|
private $subscriptionUrlFactory;
|
||||||
|
|
||||||
|
/** @var array Cache for confirmation emails sent within a request */
|
||||||
|
private $sentEmails = [];
|
||||||
|
|
||||||
public function __construct(Mailer $mailer, WPFunctions $wp, SettingsController $settings, SubscriptionUrlFactory $subscriptionUrlFactory) {
|
public function __construct(Mailer $mailer, WPFunctions $wp, SettingsController $settings, SubscriptionUrlFactory $subscriptionUrlFactory) {
|
||||||
$this->mailer = $mailer;
|
$this->mailer = $mailer;
|
||||||
$this->wp = $wp;
|
$this->wp = $wp;
|
||||||
@ -40,6 +43,18 @@ class ConfirmationEmailMailer {
|
|||||||
$this->subscriptionUrlFactory = $subscriptionUrlFactory;
|
$this->subscriptionUrlFactory = $subscriptionUrlFactory;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Use this method if you want to make sure the confirmation email
|
||||||
|
* is not sent multiple times within a single request
|
||||||
|
* e.g. if sending confirmation emails from hooks
|
||||||
|
*/
|
||||||
|
public function sendConfirmationEmailOnce(Subscriber $subscriber): bool {
|
||||||
|
if (isset($this->sentEmails[$subscriber->id])) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
return $this->sendConfirmationEmail($subscriber);
|
||||||
|
}
|
||||||
|
|
||||||
public function sendConfirmationEmail(Subscriber $subscriber) {
|
public function sendConfirmationEmail(Subscriber $subscriber) {
|
||||||
$signupConfirmation = $this->settings->get('signup_confirmation');
|
$signupConfirmation = $this->settings->get('signup_confirmation');
|
||||||
if ((bool)$signupConfirmation['enabled'] === false) {
|
if ((bool)$signupConfirmation['enabled'] === false) {
|
||||||
@ -99,10 +114,12 @@ class ConfirmationEmailMailer {
|
|||||||
$subscriber->setError(__('Something went wrong with your subscription. Please contact the website owner.', 'mailpoet'));
|
$subscriber->setError(__('Something went wrong with your subscription. Please contact the website owner.', 'mailpoet'));
|
||||||
return false;
|
return false;
|
||||||
};
|
};
|
||||||
|
|
||||||
if (!$this->wp->isUserLoggedIn()) {
|
if (!$this->wp->isUserLoggedIn()) {
|
||||||
$subscriber->countConfirmations++;
|
$subscriber->countConfirmations++;
|
||||||
$subscriber->save();
|
$subscriber->save();
|
||||||
}
|
}
|
||||||
|
$this->sentEmails[$subscriber->id] = true;
|
||||||
return true;
|
return true;
|
||||||
} catch (\Exception $e) {
|
} catch (\Exception $e) {
|
||||||
$subscriber->setError(__('Something went wrong with your subscription. Please contact the website owner.', 'mailpoet'));
|
$subscriber->setError(__('Something went wrong with your subscription. Please contact the website owner.', 'mailpoet'));
|
||||||
|
@ -18,6 +18,12 @@ class ConfirmationEmailMailerTest extends \MailPoetTest {
|
|||||||
$subcriptionUrlFacroryMock = $this->createMock(SubscriptionUrlFactory::class);
|
$subcriptionUrlFacroryMock = $this->createMock(SubscriptionUrlFactory::class);
|
||||||
$subcriptionUrlFacroryMock->method('getConfirmationUrl')->willReturn('http://example.com');
|
$subcriptionUrlFacroryMock->method('getConfirmationUrl')->willReturn('http://example.com');
|
||||||
|
|
||||||
|
$settings = $this->diContainer->get(SettingsController::class);
|
||||||
|
$settings->set(
|
||||||
|
'signup_confirmation.body',
|
||||||
|
$settings->get('signup_confirmation.body') . "\nLists: [lists_to_confirm]"
|
||||||
|
);
|
||||||
|
|
||||||
$subscriber = Subscriber::create();
|
$subscriber = Subscriber::create();
|
||||||
$subscriber->hydrate([
|
$subscriber->hydrate([
|
||||||
'first_name' => 'John',
|
'first_name' => 'John',
|
||||||
@ -26,6 +32,7 @@ class ConfirmationEmailMailerTest extends \MailPoetTest {
|
|||||||
'status' => 'unconfirmed',
|
'status' => 'unconfirmed',
|
||||||
'source' => 'api',
|
'source' => 'api',
|
||||||
]);
|
]);
|
||||||
|
$subscriber->save();
|
||||||
|
|
||||||
$mailer = Stub::makeEmpty(Mailer::class, [
|
$mailer = Stub::makeEmpty(Mailer::class, [
|
||||||
'send' =>
|
'send' =>
|
||||||
@ -37,6 +44,7 @@ class ConfirmationEmailMailerTest extends \MailPoetTest {
|
|||||||
'subscriber_status' => 'unconfirmed',
|
'subscriber_status' => 'unconfirmed',
|
||||||
'subscriber_source' => 'api',
|
'subscriber_source' => 'api',
|
||||||
]);
|
]);
|
||||||
|
return ['response' => true];
|
||||||
}),
|
}),
|
||||||
], $this);
|
], $this);
|
||||||
|
|
||||||
@ -58,7 +66,15 @@ class ConfirmationEmailMailerTest extends \MailPoetTest {
|
|||||||
[$segment->id]
|
[$segment->id]
|
||||||
);
|
);
|
||||||
|
|
||||||
$sender->sendConfirmationEmail($subscriber);
|
$result = $sender->sendConfirmationEmail($subscriber);
|
||||||
|
expect($result)->true();
|
||||||
|
codecept_debug($subscriber);
|
||||||
|
expect($subscriber->countConfirmations)->equals(1);
|
||||||
|
|
||||||
|
$sender->sendConfirmationEmailOnce($subscriber);
|
||||||
|
$subscriberFromDb = Subscriber::findOne($subscriber->id);
|
||||||
|
expect($subscriberFromDb->countConfirmations)->equals(1);
|
||||||
|
expect($subscriber->countConfirmations)->equals(1);
|
||||||
}
|
}
|
||||||
|
|
||||||
public function testItSetsErrorsWhenConfirmationEmailCannotBeSent() {
|
public function testItSetsErrorsWhenConfirmationEmailCannotBeSent() {
|
||||||
|
Reference in New Issue
Block a user