Validate if newsletter has an unsubscribe link

[MAILPOET-3857]
This commit is contained in:
Pavel Dohnal
2021-10-19 12:53:50 +02:00
committed by Veljko V
parent 3a67210743
commit 813d43f857
3 changed files with 38 additions and 1 deletions

View File

@ -40,7 +40,7 @@ function validateNewsletter(newsletter) {
return MailPoet.I18n.t('newsletterIsEmpty');
}
}
// todo only check this if MSS is active
if (body.indexOf('[link:subscription_unsubscribe_url]') < 0
&& body.indexOf('[link:subscription_unsubscribe]') < 0
) {

View File

@ -143,6 +143,25 @@ class SendingQueue extends APIEndpoint {
}
private function validateNewsletter(NewsletterEntity $newsletterEntity): ?string {
if (
$newsletterEntity->getBody()
&& is_array($newsletterEntity->getBody())
&& $newsletterEntity->getBody()['content']
) {
$body = json_encode($newsletterEntity->getBody()['content']);
if ($body === false) {
return __('Poet, please add prose to your masterpiece before you send it to your followers.');
}
// todo only check this if MSS is active
if ((strpos($body, '[link:subscription_unsubscribe_url]') === false)
&& (strpos($body, '[link:subscription_unsubscribe]') === false)
) {
return __('All emails must include an "Unsubscribe" link. Add a footer widget to your email to continue.');
}
} else {
return __('Poet, please add prose to your masterpiece before you send it to your followers.');
}
return null;
}

View File

@ -6,11 +6,13 @@ use Codeception\Util\Fixtures;
use Codeception\Util\Stub;
use MailPoet\API\JSON\Response as APIResponse;
use MailPoet\API\JSON\v1\SendingQueue as SendingQueueAPI;
use MailPoet\Entities\NewsletterEntity;
use MailPoet\Models\Newsletter;
use MailPoet\Models\NewsletterOption;
use MailPoet\Models\NewsletterOptionField;
use MailPoet\Models\ScheduledTask;
use MailPoet\Models\SendingQueue as SendingQueueModel;
use MailPoet\Newsletter\NewslettersRepository;
use MailPoet\Segments\SubscribersFinder;
use MailPoet\Settings\SettingsController;
use MailPoet\Settings\SettingsRepository;
@ -65,6 +67,7 @@ class SendingQueueTest extends \MailPoetTest {
Stub::make(SubscribersFeature::class, [
'check' => true,
]),
$this->diContainer->get(NewslettersRepository::class),
$this->diContainer->get(SubscribersFinder::class)
);
$res = $sendingQueue->add(['newsletter_id' => $this->newsletter->id]);
@ -112,6 +115,21 @@ class SendingQueueTest extends \MailPoetTest {
expect($rescheduledTask->scheduledAt)->equals('2018-11-11 11:00:00');
}
public function testItRejectsNewsletterWithoutUnsubscribeLink() {
$newsletter = new NewsletterEntity();
$newsletter->setSubject('subject');
$newsletter->setType(NewsletterEntity::TYPE_STANDARD);
$newsletter->setBody(['content' => ['type' => 'container', 'columnLayout' => false, 'orientation' => 'vertical']]);
$this->entityManager->persist($newsletter);
$this->entityManager->flush();
$sendingQueue = $this->diContainer->get(SendingQueueAPI::class);
$response = $sendingQueue->add(['newsletter_id' => $newsletter->getId()]);
$response = $response->getData();
expect($response['errors'][0])->array();
expect($response['errors'][0]['message'])->stringContainsString('Unsubscribe');
expect($response['errors'][0]['error'])->stringContainsString('bad_request');
}
private function _createOrUpdateNewsletterOptions($newsletterId, $newsletterType, $options) {
foreach ($options as $option => $value) {
$newsletterOptionField = NewsletterOptionField::where('name', $option)->findOne();