diff --git a/lib/Config/Migrator.php b/lib/Config/Migrator.php index 574f8b34ee..fcde9473b9 100644 --- a/lib/Config/Migrator.php +++ b/lib/Config/Migrator.php @@ -199,6 +199,7 @@ class Migrator { 'deleted_at TIMESTAMP NULL,', 'unconfirmed_data longtext,', 'source ENUM("form", "imported", "administrator", "api", "wordpress_user", "unknown") DEFAULT "unknown",', + 'count_confirmations int(11) unsigned NOT NULL DEFAULT 0,', 'PRIMARY KEY (id),', 'UNIQUE KEY email (email),', 'KEY wp_user_id (wp_user_id),', diff --git a/lib/Models/SubscriberSegment.php b/lib/Models/SubscriberSegment.php index 2584b0af69..62f97b350c 100644 --- a/lib/Models/SubscriberSegment.php +++ b/lib/Models/SubscriberSegment.php @@ -14,6 +14,10 @@ class SubscriberSegment extends Model { static function unsubscribeFromSegments($subscriber, $segment_ids = array()) { if($subscriber === false) return false; + // Reset confirmation emails count, so user can resubscribe + $subscriber->count_confirmations = 0; + $subscriber->save(); + $wp_segment = Segment::getWPSegment(); $wc_segment = Segment::getWooCommerceSegment(); diff --git a/lib/Subscribers/ConfirmationEmailMailer.php b/lib/Subscribers/ConfirmationEmailMailer.php index 669eae7c37..a20fe63b5b 100644 --- a/lib/Subscribers/ConfirmationEmailMailer.php +++ b/lib/Subscribers/ConfirmationEmailMailer.php @@ -10,6 +10,8 @@ use MailPoet\Util\Helpers; class ConfirmationEmailMailer { + const MAX_CONFIRMATION_EMAILS = 3; + /** @var Mailer */ private $mailer; @@ -29,6 +31,12 @@ class ConfirmationEmailMailer { return false; } + $subscriber->count_confirmations++; + $subscriber->save(); + if(!is_user_logged_in() && $subscriber->count_confirmations > self::MAX_CONFIRMATION_EMAILS) { + return false; + } + $segments = $subscriber->segments()->findMany(); $segment_names = array_map(function($segment) { return $segment->name; diff --git a/tests/integration/Models/SubscriberSegmentTest.php b/tests/integration/Models/SubscriberSegmentTest.php index 0d14a3f428..98253708dd 100644 --- a/tests/integration/Models/SubscriberSegmentTest.php +++ b/tests/integration/Models/SubscriberSegmentTest.php @@ -117,6 +117,7 @@ class SubscriberSegmentTest extends \MailPoetTest { expect($subscriber->subscriptions[2]['segment_id'])->equals($segment_3->id); // verify that subscriber is not subscribed only to the non-WP segment (#2) + $subscriber = $this->subscriber; SubscriberSegment::unsubscribeFromSegments($subscriber, array($segment_1->id, $segment_2->id, $segment_3->id)); $subscriber = Subscriber::findOne($subscriber->id)->withSubscriptions(); @@ -329,4 +330,4 @@ class SubscriberSegmentTest extends \MailPoetTest { Subscriber::deleteMany(); SubscriberSegment::deleteMany(); } -} \ No newline at end of file +}