diff --git a/lib/Cron/Workers/SendingQueue/SendingQueue.php b/lib/Cron/Workers/SendingQueue/SendingQueue.php index 6106774f8f..6082a946d0 100644 --- a/lib/Cron/Workers/SendingQueue/SendingQueue.php +++ b/lib/Cron/Workers/SendingQueue/SendingQueue.php @@ -93,6 +93,7 @@ class SendingQueue { $prepared_newsletters = array(); $prepared_subscribers = array(); $prepared_subscribers_ids = array(); + $unsubscribe_urls = array(); $statistics = array(); foreach($subscribers as $subscriber) { // render shortcodes and replace subscriber data in tracked links @@ -110,6 +111,8 @@ class SendingQueue { $subscriber ); $prepared_subscribers_ids[] = $subscriber->id; + // save personalized unsubsribe link + $unsubscribe_urls[] = Links::getUnsubscribeUrl($queue, $subscriber->id); // keep track of values for statistics purposes $statistics[] = array( 'newsletter_id' => $newsletter->id, @@ -123,11 +126,12 @@ class SendingQueue { $prepared_newsletters[0], $prepared_subscribers[0], $statistics, - array('unsubscribe_url' => Links::getUnsubscribeUrl($queue, $prepared_subscribers_ids[0])) + array('unsubscribe_url' => $unsubscribe_urls[0]) ); $prepared_newsletters = array(); $prepared_subscribers = array(); $prepared_subscribers_ids = array(); + $unsubscribe_urls = array(); $statistics = array(); } } @@ -137,7 +141,8 @@ class SendingQueue { $prepared_subscribers_ids, $prepared_newsletters, $prepared_subscribers, - $statistics + $statistics, + array('unsubscribe_url' => $unsubscribe_urls) ); } return $queue; diff --git a/lib/Mailer/Methods/MailPoet.php b/lib/Mailer/Methods/MailPoet.php index 7a5bae4369..e044d1236f 100644 --- a/lib/Mailer/Methods/MailPoet.php +++ b/lib/Mailer/Methods/MailPoet.php @@ -27,7 +27,7 @@ class MailPoet { return Mailer::formatMailerSendErrorResult($response); } - $message_body = $this->getBody($newsletter, $subscriber); + $message_body = $this->getBody($newsletter, $subscriber, $extra_params); $result = $this->api->sendMessages($message_body); switch($result['status']) { @@ -57,9 +57,9 @@ class MailPoet { ); } - function getBody($newsletter, $subscriber) { + function getBody($newsletter, $subscriber, $extra_params = array()) { $_this = $this; - $composeBody = function($newsletter, $subscriber) use($_this) { + $composeBody = function($newsletter, $subscriber, $unsubscribe_url) use($_this) { $body = array( 'to' => (array( 'address' => $subscriber['email'], @@ -81,6 +81,9 @@ class MailPoet { if(!empty($newsletter['body']['text'])) { $body['text'] = $newsletter['body']['text']; } + if($unsubscribe_url) { + $body['list_unsubscribe'] = $unsubscribe_url; + } return $body; }; if(is_array($newsletter) && is_array($subscriber)) { @@ -88,11 +91,16 @@ class MailPoet { for($record = 0; $record < count($newsletter); $record++) { $body[] = $composeBody( $newsletter[$record], - $this->processSubscriber($subscriber[$record]) + $this->processSubscriber($subscriber[$record]), + (!empty($extra_params['unsubscribe_url'][$record])) ? $extra_params['unsubscribe_url'][$record] : false ); } } else { - $body[] = $composeBody($newsletter, $this->processSubscriber($subscriber)); + $body[] = $composeBody( + $newsletter, + $this->processSubscriber($subscriber), + (!empty($extra_params['unsubscribe_url'])) ? $extra_params['unsubscribe_url'] : false + ); } return $body; } diff --git a/tests/unit/Mailer/Methods/MailPoetAPITest.php b/tests/unit/Mailer/Methods/MailPoetAPITest.php index 2ca00d06ce..45edd9c18f 100644 --- a/tests/unit/Mailer/Methods/MailPoetAPITest.php +++ b/tests/unit/Mailer/Methods/MailPoetAPITest.php @@ -1,9 +1,8 @@ equals($this->newsletter['body']['text']); } + function testItCanAddExtraParametersToSingleMessage() { + $extra_params = array('unsubscribe_url' => 'http://example.com'); + $body = $this->mailer->getBody($this->newsletter, $this->subscriber, $extra_params); + expect($body[0]['list_unsubscribe'])->equals($extra_params['unsubscribe_url']); + } + + function testItCanAddExtraParametersToMultipleMessages() { + $extra_params = array('unsubscribe_url' => 'http://example.com'); + $newsletters = array_fill(0, 10, $this->newsletter); + $subscribers = array_fill(0, 10, $this->subscriber); + $body = $this->mailer->getBody($newsletters, $subscribers, $extra_params); + expect($body[0]['list_unsubscribe'])->equals($extra_params['unsubscribe_url'][0]); + expect($body[9]['list_unsubscribe'])->equals($extra_params['unsubscribe_url'][9]); + } + + function testItCanAddUnsubscribeUrlToMultipleMessages() { + $newsletters = array_fill(0, 10, $this->newsletter); + $subscribers = array_fill(0, 10, $this->subscriber); + $extra_params = array('unsubscribe_url' => array_fill(0, 10, 'http://example.com')); + + $body = $this->mailer->getBody($newsletters, $subscribers, $extra_params); + expect(count($body))->equals(10); + expect($body[0]['list_unsubscribe'])->equals($extra_params['unsubscribe_url'][0]); + expect($body[9]['list_unsubscribe'])->equals($extra_params['unsubscribe_url'][9]); + } + function testItCanProcessSubscriber() { expect($this->mailer->processSubscriber('test@test.com')) ->equals(