[REF] Use CRM_Utils_Mail::send for sending emails for confirming unsubscribe resubscr...
authorSeamus Lee <seamuslee001@gmail.com>
Tue, 26 May 2020 05:36:28 +0000 (15:36 +1000)
committerSeamus Lee <seamuslee001@gmail.com>
Fri, 19 Jun 2020 23:59:33 +0000 (09:59 +1000)
Fix sending issues found by matt and expand unit test to cover sending of subscription emails

CRM/Mailing/Event/BAO/Reply.php
CRM/Mailing/Event/BAO/Resubscribe.php
CRM/Mailing/Event/BAO/Subscribe.php
CRM/Mailing/Event/BAO/Unsubscribe.php
CRM/Utils/Mail.php
tests/phpunit/api/v3/MailingGroupTest.php

index 25fb8f4fff5739ce1404faace421c45f2aeaebbe..ed240b720f23ae333b46a82dc23900667d9a6568 100644 (file)
@@ -227,17 +227,15 @@ class CRM_Mailing_Event_BAO_Reply extends CRM_Mailing_Event_DAO_Reply {
     $component->id = $mailing->reply_id;
     $component->find(TRUE);
 
-    $message = new Mail_Mime("\n");
-
     $domain = CRM_Core_BAO_Domain::getDomain();
     list($domainEmailName, $_) = CRM_Core_BAO_Domain::getNameAndEmail();
 
-    $headers = [
-      'Subject' => $component->subject,
-      'To' => $to,
-      'From' => "\"$domainEmailName\" <" . CRM_Core_BAO_Domain::getNoReplyEmailAddress() . '>',
-      'Reply-To' => CRM_Core_BAO_Domain::getNoReplyEmailAddress(),
-      'Return-Path' => CRM_Core_BAO_Domain::getNoReplyEmailAddress(),
+    $params = [
+      'subject' => $component->subject,
+      'toEmail' => $to,
+      'from' => "\"$domainEmailName\" <" . CRM_Core_BAO_Domain::getNoReplyEmailAddress() . '>',
+      'replyTo' => CRM_Core_BAO_Domain::getNoReplyEmailAddress(),
+      'returnPath' => CRM_Core_BAO_Domain::getNoReplyEmailAddress(),
     ];
 
     // TODO: do we need reply tokens?
@@ -257,24 +255,19 @@ class CRM_Mailing_Event_BAO_Reply extends CRM_Mailing_Event_DAO_Reply {
     if ($eq->format == 'HTML' || $eq->format == 'Both') {
       $html = CRM_Utils_Token::replaceDomainTokens($html, $domain, TRUE, $tokens['html']);
       $html = CRM_Utils_Token::replaceMailingTokens($html, $mailing, NULL, $tokens['html']);
-      $message->setHTMLBody($html);
     }
     if (!$html || $eq->format == 'Text' || $eq->format == 'Both') {
       $text = CRM_Utils_Token::replaceDomainTokens($text, $domain, FALSE, $tokens['text']);
       $text = CRM_Utils_Token::replaceMailingTokens($text, $mailing, NULL, $tokens['text']);
-      $message->setTxtBody($text);
     }
+    $params['html'] = $html;
+    $params['text'] = $text;
 
-    $b = CRM_Utils_Mail::setMimeParams($message);
-    $h = $message->headers($headers);
-    CRM_Mailing_BAO_Mailing::addMessageIdHeader($h, 'a', $eq->job_id, queue_id, $eq->hash);
-
-    $mailer = \Civi::service('pear_mail');
-    if (is_object($mailer)) {
-      $errorScope = CRM_Core_TemporaryErrorScope::ignoreException();
-      $mailer->send($to, $h, $b);
-      unset($errorScope);
+    CRM_Mailing_BAO_Mailing::addMessageIdHeader($params, 'a', $eq->job_id, queue_id, $eq->hash);
+    if (CRM_Core_BAO_MailSettings::includeMessageId()) {
+      $params['messageId'] = $params['Message-ID'];
     }
+    CRM_Utils_Mail::send($params);
   }
 
   /**
index e13ee159b613f07c1a69094fcaa331d2c07b538f..3468c533b17bd9c55e70a1730a3158495af315aa 100644 (file)
@@ -229,8 +229,6 @@ class CRM_Mailing_Event_BAO_Resubscribe {
       }
     }
 
-    $message = new Mail_mime("\n");
-
     list($addresses, $urls) = CRM_Mailing_BAO_Mailing::getVerpAndUrls($job, $queue_id, $eq->hash, $eq->email);
     $bao = new CRM_Mailing_BAO_Mailing();
     $bao->body_text = $text;
@@ -241,34 +239,28 @@ class CRM_Mailing_Event_BAO_Resubscribe {
       $html = CRM_Utils_Token::replaceResubscribeTokens($html, $domain, $groups, TRUE, $eq->contact_id, $eq->hash);
       $html = CRM_Utils_Token::replaceActionTokens($html, $addresses, $urls, TRUE, $tokens['html']);
       $html = CRM_Utils_Token::replaceMailingTokens($html, $dao, NULL, $tokens['html']);
-      $message->setHTMLBody($html);
     }
     if (!$html || $eq->format == 'Text' || $eq->format == 'Both') {
       $text = CRM_Utils_Token::replaceDomainTokens($text, $domain, TRUE, $tokens['text']);
       $text = CRM_Utils_Token::replaceResubscribeTokens($text, $domain, $groups, FALSE, $eq->contact_id, $eq->hash);
       $text = CRM_Utils_Token::replaceActionTokens($text, $addresses, $urls, FALSE, $tokens['text']);
       $text = CRM_Utils_Token::replaceMailingTokens($text, $dao, NULL, $tokens['text']);
-      $message->setTxtBody($text);
     }
 
-    $headers = [
-      'Subject' => $component->subject,
-      'From' => "\"$domainEmailName\" <" . CRM_Core_BAO_Domain::getNoReplyEmailAddress() . '>',
-      'To' => $eq->email,
-      'Reply-To' => CRM_Core_BAO_Domain::getNoReplyEmailAddress(),
-      'Return-Path' => CRM_Core_BAO_Domain::getNoReplyEmailAddress(),
+    $params = [
+      'subject' => $component->subject,
+      'from' => "\"$domainEmailName\" <" . CRM_Core_BAO_Domain::getNoReplyEmailAddress() . '>',
+      'toEmail' => $eq->email,
+      'replyTo' => CRM_Core_BAO_Domain::getNoReplyEmailAddress(),
+      'returnPath' => CRM_Core_BAO_Domain::getNoReplyEmailAddress(),
+      'html' => $html,
+      'text' => $text,
     ];
-    CRM_Mailing_BAO_Mailing::addMessageIdHeader($headers, 'e', $job, $queue_id, $eq->hash);
-    $b = CRM_Utils_Mail::setMimeParams($message);
-    $h = $message->headers($headers);
-
-    $mailer = \Civi::service('pear_mail');
-
-    if (is_object($mailer)) {
-      $errorScope = CRM_Core_TemporaryErrorScope::ignoreException();
-      $mailer->send($eq->email, $h, $b);
-      unset($errorScope);
+    CRM_Mailing_BAO_Mailing::addMessageIdHeader($params, 'e', $job, $queue_id, $eq->hash);
+    if (CRM_Core_BAO_MailSettings::includeMessageId()) {
+      $params['messageId'] = $params['Message-ID'];
     }
+    CRM_Utils_Mail::send($params);
   }
 
 }
index 1dfad54a4a4206537704cdb63df456097627c774..71baa417fe75bd3763ec9ad373d697adb801a527 100644 (file)
@@ -205,12 +205,12 @@ SELECT     civicrm_email.id as email_id
 
     $component->find(TRUE);
 
-    $headers = [
-      'Subject' => $component->subject,
-      'From' => "\"{$domainEmailName}\" <{$domainEmailAddress}>",
-      'To' => $email,
-      'Reply-To' => $confirm,
-      'Return-Path' => CRM_Core_BAO_Domain::getNoReplyEmailAddress(),
+    $params = [
+      'subject' => $component->subject,
+      'from' => "\"{$domainEmailName}\" <{$domainEmailAddress}>",
+      'toEmail' => $email,
+      'replyTo' => $confirm,
+      'returnPath' => CRM_Core_BAO_Domain::getNoReplyEmailAddress(),
     ];
 
     $url = CRM_Utils_System::url('civicrm/mailing/confirm',
@@ -246,24 +246,17 @@ SELECT     civicrm_email.id as email_id
     // render the &amp; entities in text mode, so that the links work
     $text = str_replace('&amp;', '&', $text);
 
-    $message = new Mail_mime("\n");
-
-    $message->setHTMLBody($html);
-    $message->setTxtBody($text);
-    $b = CRM_Utils_Mail::setMimeParams($message);
-    $h = $message->headers($headers);
-    CRM_Mailing_BAO_Mailing::addMessageIdHeader($h, 's',
+    CRM_Mailing_BAO_Mailing::addMessageIdHeader($params, 's',
       $this->contact_id,
       $this->id,
       $this->hash
     );
-    $mailer = \Civi::service('pear_mail');
-
-    if (is_object($mailer)) {
-      $errorScope = CRM_Core_TemporaryErrorScope::ignoreException();
-      $mailer->send($email, $h, $b);
-      unset($errorScope);
+    $params['html'] = $html;
+    $params['text'] = $text;
+    if (CRM_Core_BAO_MailSettings::includeMessageId()) {
+      $params['messageId'] = $params['Message-ID'];
     }
+    CRM_Utils_Mail::send($params);
   }
 
   /**
index 920ae7d3bcfe3c43c2da490d73d009e24d18b5e8..ce92b388e2604c1d55c32b00ba693ea32682ce3e 100644 (file)
@@ -365,8 +365,6 @@ WHERE  email = %2
       }
     }
 
-    $message = new Mail_mime("\n");
-
     list($addresses, $urls) = CRM_Mailing_BAO_Mailing::getVerpAndUrls($job, $queue_id, $eq->hash, $eq->email);
     $bao = new CRM_Mailing_BAO_Mailing();
     $bao->body_text = $text;
@@ -377,37 +375,30 @@ WHERE  email = %2
       $html = CRM_Utils_Token::replaceUnsubscribeTokens($html, $domain, $groups, TRUE, $eq->contact_id, $eq->hash);
       $html = CRM_Utils_Token::replaceActionTokens($html, $addresses, $urls, TRUE, $tokens['html']);
       $html = CRM_Utils_Token::replaceMailingTokens($html, $dao, NULL, $tokens['html']);
-      $message->setHTMLBody($html);
     }
     if (!$html || $eq->format == 'Text' || $eq->format == 'Both') {
       $text = CRM_Utils_Token::replaceDomainTokens($text, $domain, FALSE, $tokens['text']);
       $text = CRM_Utils_Token::replaceUnsubscribeTokens($text, $domain, $groups, FALSE, $eq->contact_id, $eq->hash);
       $text = CRM_Utils_Token::replaceActionTokens($text, $addresses, $urls, FALSE, $tokens['text']);
       $text = CRM_Utils_Token::replaceMailingTokens($text, $dao, NULL, $tokens['text']);
-      $message->setTxtBody($text);
     }
 
     $emailDomain = CRM_Core_BAO_MailSettings::defaultDomain();
 
-    $headers = [
-      'Subject' => $component->subject,
-      'From' => "\"$domainEmailName\" <" . CRM_Core_BAO_Domain::getNoReplyEmailAddress() . '>',
-      'To' => $eq->email,
-      'Reply-To' => CRM_Core_BAO_Domain::getNoReplyEmailAddress(),
-      'Return-Path' => CRM_Core_BAO_Domain::getNoReplyEmailAddress(),
+    $params = [
+      'subject' => $component->subject,
+      'from' => "\"$domainEmailName\" <" . CRM_Core_BAO_Domain::getNoReplyEmailAddress() . '>',
+      'toEmail' => $eq->email,
+      'replyTo' => CRM_Core_BAO_Domain::getNoReplyEmailAddress(),
+      'returnPath' => CRM_Core_BAO_Domain::getNoReplyEmailAddress(),
+      'html' => $html,
+      'text' => $text,
     ];
-    CRM_Mailing_BAO_Mailing::addMessageIdHeader($headers, 'u', $job, $queue_id, $eq->hash);
-
-    $b = CRM_Utils_Mail::setMimeParams($message);
-    $h = $message->headers($headers);
-
-    $mailer = \Civi::service('pear_mail');
-
-    if (is_object($mailer)) {
-      $errorScope = CRM_Core_TemporaryErrorScope::ignoreException();
-      $mailer->send($eq->email, $h, $b);
-      unset($errorScope);
+    CRM_Mailing_BAO_Mailing::addMessageIdHeader($params, 'u', $job, $queue_id, $eq->hash);
+    if (CRM_Core_BAO_MailSettings::includeMessageId()) {
+      $params['messageId'] = $params['Message-ID'];
     }
+    CRM_Utils_Mail::send($params);
   }
 
   /**
index 2b6e5120a74ac92bb92c7df668bcd9768001b3ec..4312391efc0290014cd3a9840d4ad8ac420800e6 100644 (file)
@@ -152,6 +152,8 @@ class CRM_Utils_Mail {
    * text    : text of the message
    * html    : html version of the message
    * replyTo : reply-to header in the email
+   * returnpath : email address for bounces to be sent to
+   * messageId : Message ID for this email mesage
    * attachments: an associative array of
    *   fullPath : complete pathname to the file
    *   mime_type: mime type of the attachment
@@ -223,7 +225,7 @@ class CRM_Utils_Mail {
     }
     $headers['Date'] = date('r');
     if ($includeMessageId) {
-      $headers['Message-ID'] = '<' . uniqid('civicrm_', TRUE) . "@$emailDomain>";
+      $headers['Message-ID'] = $params['messageId'] ?? '<' . uniqid('civicrm_', TRUE) . "@$emailDomain>";
     }
     if (!empty($params['autoSubmitted'])) {
       $headers['Auto-Submitted'] = "Auto-Generated";
index ed769640ea9b40c64d938aedb64cc133c276f00d..e1b09ea9234a3221a45db6df2f6b67e2e0249512 100644 (file)
@@ -118,6 +118,18 @@ class api_v3_MailingGroupTest extends CiviUnitTestCase {
    * Test civicrm_mailing_group_event_subscribe and civicrm_mailing_event_confirm functions - success expected.
    */
   public function testMailerProcess() {
+    $this->callAPISuccess('MailSettings', 'create', [
+      'domain_id' => 1,
+      'name' => "my mail setting",
+      'domain' => 'setting.com',
+      'localpart' => 'civicrm+',
+      'server' => "localhost",
+      'username' => 'sue',
+      'password' => 'pass',
+      'is_default' => 1,
+    ]);
+    $mut = new CiviMailUtils($this, TRUE);
+    Civi::settings()->set('include_message_id', 1);
     $params = [
       'first_name' => 'Test',
       'last_name' => 'Test',
@@ -134,6 +146,13 @@ class api_v3_MailingGroupTest extends CiviUnitTestCase {
       'time_stamp' => '20101212121212',
     ];
     $result = $this->callAPISuccess('mailing_event_subscribe', 'create', $params);
+    // Check that subscription email has been sent.
+    $msgs = $mut->getAllMessages();
+    $this->assertCount(1, $msgs, 'Subscription email failed to send');
+    $mut->checkMailLog([
+      'Message-ID: <civicrm+s',
+      'To confirm this subscription, reply to this email or click',
+    ]);
 
     $this->assertEquals($result['values'][$result['id']]['contact_id'], $contactID);
 
@@ -147,6 +166,7 @@ class api_v3_MailingGroupTest extends CiviUnitTestCase {
 
     $this->callAPISuccess('mailing_event_confirm', 'create', $params);
     $this->contactDelete($contactID);
+    Civi::settings()->set('include_message_id', 0);
   }
 
 }