CRM-16373 - Config - Move static $_mailer to Civi\Core\Container
authorTim Otten <totten@civicrm.org>
Tue, 18 Aug 2015 03:50:40 +0000 (20:50 -0700)
committerTim Otten <totten@civicrm.org>
Wed, 19 Aug 2015 04:04:52 +0000 (21:04 -0700)
CRM/Core/Config.php
CRM/Mailing/BAO/MailingJob.php
CRM/Mailing/Event/BAO/Forward.php
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
Civi/Core/Container.php
tests/phpunit/CiviTest/CiviUnitTestCase.php

index 55a60f5e0151af41d7b70cd2b974b95b956cc67b..c47361175ac0f8500e314904a6f9a38208184222 100644 (file)
@@ -133,13 +133,6 @@ class CRM_Core_Config extends CRM_Core_Config_Variables {
    */
   private static $_log = NULL;
 
-  /**
-   * The handle on the mail handler that we are using
-   *
-   * @var object
-   */
-  public static $_mail = NULL;
-
   /**
    * We only need one instance of this object. So we use the singleton
    * pattern and cache the instance in this variable
@@ -403,8 +396,6 @@ class CRM_Core_Config extends CRM_Core_Config_Variables {
 
   /**
    * Initialize the DataObject framework.
-   *
-   * @return void
    */
   private function _initDAO() {
     CRM_Core_DAO::init($this->dsn);
@@ -420,8 +411,6 @@ class CRM_Core_Config extends CRM_Core_Config_Variables {
   /**
    * Returns the singleton logger for the application.
    *
-   * @param
-   *
    * @return object
    */
   static public function &getLog() {
@@ -535,100 +524,11 @@ class CRM_Core_Config extends CRM_Core_Config_Variables {
   /**
    * Retrieve a mailer to send any mail from the application.
    *
-   * @param bool $persist
-   *   Open a persistent smtp connection, should speed up mailings.
-   * @return object
+   * @return Mail
+   * @deprecated
    */
-  public static function &getMailer($persist = FALSE) {
-    if (!isset(self::$_mail)) {
-      $mailingInfo = CRM_Core_BAO_Setting::getItem(CRM_Core_BAO_Setting::MAILING_PREFERENCES_NAME,
-        'mailing_backend'
-      );
-
-      if ($mailingInfo['outBound_option'] == CRM_Mailing_Config::OUTBOUND_OPTION_REDIRECT_TO_DB ||
-        (defined('CIVICRM_MAILER_SPOOL') && CIVICRM_MAILER_SPOOL)
-      ) {
-        self::$_mail = self::_createMailer('CRM_Mailing_BAO_Spool', array());
-      }
-      elseif ($mailingInfo['outBound_option'] == CRM_Mailing_Config::OUTBOUND_OPTION_SMTP) {
-        if ($mailingInfo['smtpServer'] == '' || !$mailingInfo['smtpServer']) {
-          CRM_Core_Error::debug_log_message(ts('There is no valid smtp server setting. Click <a href=\'%1\'>Administer >> System Setting >> Outbound Email</a> to set the SMTP Server.', array(1 => CRM_Utils_System::url('civicrm/admin/setting/smtp', 'reset=1'))));
-          CRM_Core_Error::fatal(ts('There is no valid smtp server setting. Click <a href=\'%1\'>Administer >> System Setting >> Outbound Email</a> to set the SMTP Server.', array(1 => CRM_Utils_System::url('civicrm/admin/setting/smtp', 'reset=1'))));
-        }
-
-        $params['host'] = $mailingInfo['smtpServer'] ? $mailingInfo['smtpServer'] : 'localhost';
-        $params['port'] = $mailingInfo['smtpPort'] ? $mailingInfo['smtpPort'] : 25;
-
-        if ($mailingInfo['smtpAuth']) {
-          $params['username'] = $mailingInfo['smtpUsername'];
-          $params['password'] = CRM_Utils_Crypt::decrypt($mailingInfo['smtpPassword']);
-          $params['auth'] = TRUE;
-        }
-        else {
-          $params['auth'] = FALSE;
-        }
-
-        // set the localhost value, CRM-3153
-        $params['localhost'] = CRM_Utils_Array::value('SERVER_NAME', $_SERVER, 'localhost');
-
-        // also set the timeout value, lets set it to 30 seconds
-        // CRM-7510
-        $params['timeout'] = 30;
-
-        // CRM-9349
-        $params['persist'] = $persist;
-
-        self::$_mail = self::_createMailer('smtp', $params);
-      }
-      elseif ($mailingInfo['outBound_option'] == CRM_Mailing_Config::OUTBOUND_OPTION_SENDMAIL) {
-        if ($mailingInfo['sendmail_path'] == '' ||
-          !$mailingInfo['sendmail_path']
-        ) {
-          CRM_Core_Error::debug_log_message(ts('There is no valid sendmail path setting. Click <a href=\'%1\'>Administer >> System Setting >> Outbound Email</a> to set the sendmail server.', array(1 => CRM_Utils_System::url('civicrm/admin/setting/smtp', 'reset=1'))));
-          CRM_Core_Error::fatal(ts('There is no valid sendmail path setting. Click <a href=\'%1\'>Administer >> System Setting >> Outbound Email</a> to set the sendmail server.', array(1 => CRM_Utils_System::url('civicrm/admin/setting/smtp', 'reset=1'))));
-        }
-        $params['sendmail_path'] = $mailingInfo['sendmail_path'];
-        $params['sendmail_args'] = $mailingInfo['sendmail_args'];
-
-        self::$_mail = self::_createMailer('sendmail', $params);
-      }
-      elseif ($mailingInfo['outBound_option'] == CRM_Mailing_Config::OUTBOUND_OPTION_MAIL) {
-        self::$_mail = self::_createMailer('mail', array());
-      }
-      elseif ($mailingInfo['outBound_option'] == CRM_Mailing_Config::OUTBOUND_OPTION_MOCK) {
-        self::$_mail = self::_createMailer('mock', array());
-      }
-      elseif ($mailingInfo['outBound_option'] == CRM_Mailing_Config::OUTBOUND_OPTION_DISABLED) {
-        CRM_Core_Error::debug_log_message(ts('Outbound mail has been disabled. Click <a href=\'%1\'>Administer >> System Setting >> Outbound Email</a> to set the OutBound Email.', array(1 => CRM_Utils_System::url('civicrm/admin/setting/smtp', 'reset=1'))));
-        CRM_Core_Session::setStatus(ts('Outbound mail has been disabled. Click <a href=\'%1\'>Administer >> System Setting >> Outbound Email</a> to set the OutBound Email.', array(1 => CRM_Utils_System::url('civicrm/admin/setting/smtp', 'reset=1'))));
-      }
-      else {
-        CRM_Core_Error::debug_log_message(ts('There is no valid SMTP server Setting Or SendMail path setting. Click <a href=\'%1\'>Administer >> System Setting >> Outbound Email</a> to set the OutBound Email.', array(1 => CRM_Utils_System::url('civicrm/admin/setting/smtp', 'reset=1'))));
-        CRM_Core_Session::setStatus(ts('There is no valid SMTP server Setting Or sendMail path setting. Click <a href=\'%1\'>Administer >> System Setting >> Outbound Email</a> to set the OutBound Email.', array(1 => CRM_Utils_System::url('civicrm/admin/setting/smtp', 'reset=1'))));
-        CRM_Core_Error::debug_var('mailing_info', $mailingInfo);
-      }
-    }
-    return self::$_mail;
-  }
-
-  /**
-   * Create a new instance of a PEAR Mail driver.
-   *
-   * @param string $driver
-   *   'CRM_Mailing_BAO_Spool' or a name suitable for Mail::factory().
-   * @param array $params
-   * @return object
-   *   More specifically, a class which implements the "send()" function
-   */
-  public static function _createMailer($driver, $params) {
-    if ($driver == 'CRM_Mailing_BAO_Spool') {
-      $mailer = new CRM_Mailing_BAO_Spool($params);
-    }
-    else {
-      $mailer = Mail::factory($driver, $params);
-    }
-    CRM_Utils_Hook::alterMail($mailer, $driver, $params);
-    return $mailer;
+  public static function getMailer() {
+    return Civi\Core\Container::singleton()->get('pear_mail');
   }
 
   /**
index 9bbe670b8380bbb95751fe50a6687d1c148d5a61..66f4b59b4437a9ed3afd479521c339e34e398268 100644 (file)
@@ -184,9 +184,8 @@ class CRM_Mailing_BAO_MailingJob extends CRM_Mailing_DAO_MailingJob {
       }
 
       // Get the mailer
-      // make it a persistent connection, CRM-9349
       if ($mode === NULL) {
-        $mailer = $config->getMailer(TRUE);
+        $mailer = \Civi\Core\Container::singleton()->get('pear_mail');
       }
       elseif ($mode == 'sms') {
         $mailer = CRM_SMS_Provider::singleton(array('mailing_id' => $job->mailing_id));
index 2f99b11157494ddb7196dff224ae4a69b1ce4187..ec6487f1d67d08aaea676d4b95a5246b31c5c093 100644 (file)
@@ -172,7 +172,7 @@ class CRM_Mailing_Event_BAO_Forward extends CRM_Mailing_Event_DAO_Forward {
     $mailing_obj->find(TRUE);
 
     $config = CRM_Core_Config::singleton();
-    $mailer = $config->getMailer();
+    $mailer = \Civi\Core\Container::singleton()->get('pear_mail');
 
     $recipient = NULL;
     $attachments = NULL;
index 22215bbb9f7fc89cfb8636917f42daf39114e293..eae50e1c9839a5b3198be329a508f06cd0034546 100644 (file)
@@ -201,7 +201,7 @@ class CRM_Mailing_Event_BAO_Reply extends CRM_Mailing_Event_DAO_Reply {
 
     CRM_Mailing_BAO_Mailing::addMessageIdHeader($h, 'r', $eq->job_id, $queue_id, $eq->hash);
     $config = CRM_Core_Config::singleton();
-    $mailer = $config->getMailer();
+    $mailer = \Civi\Core\Container::singleton()->get('pear_mail');
 
     if (is_object($mailer)) {
       $errorScope = CRM_Core_TemporaryErrorScope::ignoreException();
@@ -293,7 +293,7 @@ class CRM_Mailing_Event_BAO_Reply extends CRM_Mailing_Event_DAO_Reply {
     $h = $message->headers($headers);
     CRM_Mailing_BAO_Mailing::addMessageIdHeader($h, 'a', $eq->job_id, queue_id, $eq->hash);
 
-    $mailer = $config->getMailer();
+    $mailer = \Civi\Core\Container::singleton()->get('pear_mail');
     if (is_object($mailer)) {
       $errorScope = CRM_Core_TemporaryErrorScope::ignoreException();
       $mailer->send($to, $h, $b);
index 6ab757d522d163d4011c0d2351d31a9f78c54ccf..ef3711e4489db4933826266aaae940c2e8f48543 100644 (file)
@@ -287,7 +287,7 @@ class CRM_Mailing_Event_BAO_Resubscribe {
     $b = CRM_Utils_Mail::setMimeParams($message);
     $h = $message->headers($headers);
 
-    $mailer = $config->getMailer();
+    $mailer = \Civi\Core\Container::singleton()->get('pear_mail');
 
     if (is_object($mailer)) {
       $errorScope = CRM_Core_TemporaryErrorScope::ignoreException();
index c3d4b04853abcf53c30135bbefcc7fe2db709091..7d0acc4487b49cca163d16a07d8dd615c5aa590a 100644 (file)
@@ -291,7 +291,7 @@ SELECT     civicrm_email.id as email_id
       $this->id,
       $this->hash
     );
-    $mailer = $config->getMailer();
+    $mailer = \Civi\Core\Container::singleton()->get('pear_mail');
 
     if (is_object($mailer)) {
       $errorScope = CRM_Core_TemporaryErrorScope::ignoreException();
index 03ae2bb90355b147b5ab5d506c0bfca0dde3ef46..4c105aae5077c38bf0cbbd9d8edbe61632d6e0d0 100755 (executable)
@@ -406,7 +406,7 @@ WHERE  email = %2
     $b = CRM_Utils_Mail::setMimeParams($message);
     $h = $message->headers($headers);
 
-    $mailer = $config->getMailer();
+    $mailer = \Civi\Core\Container::singleton()->get('pear_mail');
 
     if (is_object($mailer)) {
       $errorScope = CRM_Core_TemporaryErrorScope::ignoreException();
index d2c1b8e88d084692cb0c5238ff073753b5b3952c..37d304e3ed7c1271d1fb943a6ce740d50b9bcafb 100644 (file)
  */
 class CRM_Utils_Mail {
 
+  /**
+   * Create a new mailer to send any mail from the application.
+   *
+   * Note: The mailer is opened in persistent mode.
+   *
+   * Note: You probably don't want to call this directly. Get a reference
+   * to the mailer through the container.
+   *
+   * @return Mail
+   */
+  public static function createMailer() {
+    $mailingInfo = CRM_Core_BAO_Setting::getItem(CRM_Core_BAO_Setting::MAILING_PREFERENCES_NAME,
+      'mailing_backend'
+    );
+
+    if ($mailingInfo['outBound_option'] == CRM_Mailing_Config::OUTBOUND_OPTION_REDIRECT_TO_DB ||
+      (defined('CIVICRM_MAILER_SPOOL') && CIVICRM_MAILER_SPOOL)
+    ) {
+      $mailer = self::_createMailer('CRM_Mailing_BAO_Spool', array());
+    }
+    elseif ($mailingInfo['outBound_option'] == CRM_Mailing_Config::OUTBOUND_OPTION_SMTP) {
+      if ($mailingInfo['smtpServer'] == '' || !$mailingInfo['smtpServer']) {
+        CRM_Core_Error::debug_log_message(ts('There is no valid smtp server setting. Click <a href=\'%1\'>Administer >> System Setting >> Outbound Email</a> to set the SMTP Server.', array(1 => CRM_Utils_System::url('civicrm/admin/setting/smtp', 'reset=1'))));
+        CRM_Core_Error::fatal(ts('There is no valid smtp server setting. Click <a href=\'%1\'>Administer >> System Setting >> Outbound Email</a> to set the SMTP Server.', array(1 => CRM_Utils_System::url('civicrm/admin/setting/smtp', 'reset=1'))));
+      }
+
+      $params['host'] = $mailingInfo['smtpServer'] ? $mailingInfo['smtpServer'] : 'localhost';
+      $params['port'] = $mailingInfo['smtpPort'] ? $mailingInfo['smtpPort'] : 25;
+
+      if ($mailingInfo['smtpAuth']) {
+        $params['username'] = $mailingInfo['smtpUsername'];
+        $params['password'] = CRM_Utils_Crypt::decrypt($mailingInfo['smtpPassword']);
+        $params['auth'] = TRUE;
+      }
+      else {
+        $params['auth'] = FALSE;
+      }
+
+      // set the localhost value, CRM-3153
+      $params['localhost'] = CRM_Utils_Array::value('SERVER_NAME', $_SERVER, 'localhost');
+
+      // also set the timeout value, lets set it to 30 seconds
+      // CRM-7510
+      $params['timeout'] = 30;
+
+      // CRM-9349
+      $params['persist'] = TRUE;
+
+      $mailer = self::_createMailer('smtp', $params);
+    }
+    elseif ($mailingInfo['outBound_option'] == CRM_Mailing_Config::OUTBOUND_OPTION_SENDMAIL) {
+      if ($mailingInfo['sendmail_path'] == '' ||
+        !$mailingInfo['sendmail_path']
+      ) {
+        CRM_Core_Error::debug_log_message(ts('There is no valid sendmail path setting. Click <a href=\'%1\'>Administer >> System Setting >> Outbound Email</a> to set the sendmail server.', array(1 => CRM_Utils_System::url('civicrm/admin/setting/smtp', 'reset=1'))));
+        CRM_Core_Error::fatal(ts('There is no valid sendmail path setting. Click <a href=\'%1\'>Administer >> System Setting >> Outbound Email</a> to set the sendmail server.', array(1 => CRM_Utils_System::url('civicrm/admin/setting/smtp', 'reset=1'))));
+      }
+      $params['sendmail_path'] = $mailingInfo['sendmail_path'];
+      $params['sendmail_args'] = $mailingInfo['sendmail_args'];
+
+      $mailer = self::_createMailer('sendmail', $params);
+    }
+    elseif ($mailingInfo['outBound_option'] == CRM_Mailing_Config::OUTBOUND_OPTION_MAIL) {
+      $mailer = self::_createMailer('mail', array());
+    }
+    elseif ($mailingInfo['outBound_option'] == CRM_Mailing_Config::OUTBOUND_OPTION_MOCK) {
+      $mailer = self::_createMailer('mock', array());
+    }
+    elseif ($mailingInfo['outBound_option'] == CRM_Mailing_Config::OUTBOUND_OPTION_DISABLED) {
+      CRM_Core_Error::debug_log_message(ts('Outbound mail has been disabled. Click <a href=\'%1\'>Administer >> System Setting >> Outbound Email</a> to set the OutBound Email.', array(1 => CRM_Utils_System::url('civicrm/admin/setting/smtp', 'reset=1'))));
+      CRM_Core_Session::setStatus(ts('Outbound mail has been disabled. Click <a href=\'%1\'>Administer >> System Setting >> Outbound Email</a> to set the OutBound Email.', array(1 => CRM_Utils_System::url('civicrm/admin/setting/smtp', 'reset=1'))));
+    }
+    else {
+      CRM_Core_Error::debug_log_message(ts('There is no valid SMTP server Setting Or SendMail path setting. Click <a href=\'%1\'>Administer >> System Setting >> Outbound Email</a> to set the OutBound Email.', array(1 => CRM_Utils_System::url('civicrm/admin/setting/smtp', 'reset=1'))));
+      CRM_Core_Session::setStatus(ts('There is no valid SMTP server Setting Or sendMail path setting. Click <a href=\'%1\'>Administer >> System Setting >> Outbound Email</a> to set the OutBound Email.', array(1 => CRM_Utils_System::url('civicrm/admin/setting/smtp', 'reset=1'))));
+      CRM_Core_Error::debug_var('mailing_info', $mailingInfo);
+    }
+    return $mailer;
+  }
+
+  /**
+   * Create a new instance of a PEAR Mail driver.
+   *
+   * @param string $driver
+   *   'CRM_Mailing_BAO_Spool' or a name suitable for Mail::factory().
+   * @param array $params
+   * @return object
+   *   More specifically, a class which implements the "send()" function
+   */
+  public static function _createMailer($driver, $params) {
+    if ($driver == 'CRM_Mailing_BAO_Spool') {
+      $mailer = new CRM_Mailing_BAO_Spool($params);
+    }
+    else {
+      $mailer = Mail::factory($driver, $params);
+    }
+    CRM_Utils_Hook::alterMail($mailer, $driver, $params);
+    return $mailer;
+  }
+
   /**
    * Wrapper function to send mail in CiviCRM. Hooks are called from this function. The input parameter
    * is an associateive array which holds the values of field needed to send an email. These are:
@@ -160,7 +260,7 @@ class CRM_Utils_Mail {
 
     $to = array($params['toEmail']);
     $result = NULL;
-    $mailer =& CRM_Core_Config::getMailer();
+    $mailer = \Civi\Core\Container::singleton()->get('pear_mail');
 
     // Mail_smtp and Mail_sendmail mailers require Bcc anc Cc emails
     // be included in both $to and $headers['Cc', 'Bcc']
index 627f1a18c90d1c7c25e1c0e83cfeb8204f2c1a2d..526ee9463f4eb7e39d4e0c69deb9b45f21dcee5d 100644 (file)
@@ -103,6 +103,9 @@ class Container {
     ))
       ->setFactoryClass('CRM_Cxn_BAO_Cxn')->setFactoryMethod('createRegistrationClient');
 
+    $container->setDefinition('pear_mail', new Definition('Mail'))
+      ->setFactoryClass('CRM_Utils_Mail')->setFactoryMethod('createMailer');
+
     // Expose legacy singletons as services in the container.
     $singletons = array(
       'resources' => 'CRM_Core_Resources',
index 860a66d2acf5c8aa7c36d2249ac02ad03fdf0e9e..5694673e56836df7eea68a14ca6b2f37327afce2 100755 (executable)
@@ -397,8 +397,8 @@ class CiviUnitTestCase extends PHPUnit_Extensions_Database_TestCase {
     // FIXME: look at it closer in second stage
 
     // initialize the object once db is loaded
-    CRM_Core_Config::$_mail = NULL;
     $config = CRM_Core_Config::singleton();
+    Civi\Core\Container::singleton(TRUE);
 
     // when running unit tests, use mockup user framework
     $config->setUserFramework('UnitTests');