You are here

phpmailer.class.inc in PHPMailer 6.3

Implements the base PHPMailer for Drupal class.

File

includes/phpmailer.class.inc
View source
<?php

/**
 * @file
 * Implements the base PHPMailer for Drupal class.
 */

/**
 * Base PHPMailer for Drupal implementation with support for SMTP keep-alive
 * and setting a custom Return-Path.
 */
class DrupalPHPMailer extends PHPMailer {

  /**
   * Stores the Return-Path, which may be different from Sender.
   */
  public $ReturnPath = '';

  /**
   * Verbose debug output level configured for Drupal.
   *
   * In order to be able to log error messages with actual error information and
   * see what actually went wrong for a particular message, PHPMailer::SMTPDebug
   * always needs to be enabled.
   *
   * DrupalPHPMailer::SmtpSend() overrides PHPMailer::SmtpSend() to capture the
   * debug output string and make it available for watchdog() calls.
   *
   * @see PHPMailer::SMTPDebug
   * @see SMTP::do_debug
   * @see DrupalPHPMailer::SmtpSend()
   * @see DrupalPHPMailer::drupalDebugOutput
   *
   * @var int
   */
  public $drupalDebug = 0;

  /**
   * Overrides PHPMailer::SMTPDebug to capture SMTP communication errors by default.
   */
  public $SMTPDebug = 2;

  /**
   * Stores the verbose debug output of the SMTP communication.
   *
   * @var string
   */
  public $drupalDebugOutput = '';

  /**
   * Constructor.
   */
  public function __construct() {

    // Throw exceptions instead of dying (since 5.0.0).
    if (method_exists(get_parent_class($this), '__construct')) {
      parent::__construct(TRUE);
    }
    $this
      ->IsSMTP();
    $this
      ->Reset();
    $this->Host = variable_get('smtp_host', '');
    if ($backup = variable_get('smtp_hostbackup', '')) {
      $this->Host .= ';' . $backup;
    }
    $this->Port = variable_get('smtp_port', '25');
    $this->SMTPSecure = variable_get('smtp_protocol', '');

    // Use SMTP authentication if both username and password are given.
    $this->Username = variable_get('smtp_username', '');
    $this->Password = variable_get('smtp_password', '');
    $this->SMTPAuth = (bool) ($this->Username != '' && $this->Password != '');
    $this->SMTPKeepAlive = variable_get('smtp_keepalive', 0);
    $this->drupalDebug = variable_get('smtp_debug', 0);
    if ($this->drupalDebug > $this->SMTPDebug) {
      $this->SMTPDebug = $this->drupalDebug;
    }

    // Adjust path to SMTP class.
    $this->PluginDir = './' . phpmailer_get_path() . '/';
  }

  /**
   * Send mail via SMTP.
   *
   * Wrapper around PHPMailer::SmtpSend() with exception handling.
   */
  public function SmtpSend($header, $body) {
    if ($this->SMTPDebug) {

      // Clear possibly previously captured debug output.
      $this->drupalDebugOutput = '';
      ob_start();
    }
    try {
      $result = parent::SmtpSend($header, $body);

      // Close connection when not using SMTP keep-alive.
      if (!$this->SMTPKeepAlive) {
        $this
          ->SmtpClose();
      }
    } catch (phpmailerException $exception) {
    }
    if ($this->SMTPDebug) {
      if ($this->drupalDebug && ($this->drupalDebugOutput = ob_get_contents())) {
        drupal_set_message($this->drupalDebugOutput);
      }
      ob_end_clean();
    }

    // Reinitialize properties.
    $this
      ->Reset();
    if (isset($exception)) {

      // Pass exception to caller.
      throw $exception;
    }
    return $result;
  }

  /**
   * (Re-)initialize properties after sending mail.
   */
  public function Reset() {
    $this
      ->ClearAllRecipients();
    $this
      ->ClearReplyTos();
    $this
      ->ClearAttachments();
    $this
      ->ClearCustomHeaders();
    $this->Priority = 3;
    $this->CharSet = variable_get('smtp_charset', 'utf-8');
    $this->ContentType = 'text/plain';
    $this->Encoding = '8bit';

    // Set default From name.
    $from_name = variable_get('smtp_fromname', '');
    if ($from_name == '') {

      // Fall back on the site name.
      $from_name = variable_get('site_name', 'Drupal');
    }
    $this->FromName = $from_name;
    $this->Sender = '';
    $this->MessageID = '';
    $this->ReturnPath = '';
  }

  /**
   * Overrides PHPMailer::__destruct().
   */
  public function __destruct() {

    // Disable debug output if SMTP keep-alive is enabled.
    // PHP is most likely shutting down altogether (this class is instantiated
    // as a static singleton). Since logging facilities (e.g., database
    // connection) quite potentially have been shut down already, simply turn
    // off SMTP debugging. Without this override, debug output would be printed
    // on the screen and CLI output.
    if ($this->SMTPKeepAlive && isset($this->smtp->do_debug)) {
      $this->smtp->do_debug = 0;
    }
    parent::__destruct();
  }

  /**
   * Provide more user-friendly error messages.
   *
   * Note: messages should not end with a dot.
   */
  public function SetLanguage($langcode = 'en', $lang_path = 'language/') {

    // Retrieve English defaults to ensure all message keys are set.
    parent::SetLanguage('en');

    // Overload with Drupal translations.
    $this->language = array(
      'authenticate' => t('SMTP error: Could not authenticate.'),
      'connect_host' => t('SMTP error: Could not connect to host.'),
      'data_not_accepted' => t('SMTP error: Data not accepted.'),
      'smtp_connect_failed' => t('SMTP error: Could not connect to SMTP host.'),
      'smtp_error' => t('SMTP server error: '),
      // Messages used during email generation.
      'empty_message' => t('Message body empty'),
      'encoding' => t('Unknown encoding: '),
      'variable_set' => t('Cannot set or reset variable: '),
      'file_access' => t('File error: Could not access file: '),
      'file_open' => t('File error: Could not open file: '),
      // Non-administrative messages.
      'from_failed' => t('The following From address failed: '),
      'invalid_address' => t('Invalid address'),
      'provide_address' => t('You must provide at least one recipient e-mail address.'),
      'recipients_failed' => t('The following recipients failed: '),
    ) + $this->language;
    return TRUE;
  }

  /**
   * Public wrapper around PHPMailer::RFCDate().
   */
  public static function RFCDate() {
    $tz = date('Z');
    $tzs = $tz < 0 ? '-' : '+';
    $tz = abs($tz);
    $tz = (int) ($tz / 3600) * 100 + $tz % 3600 / 60;
    $result = sprintf("%s %s%04d", date('D, j M Y H:i:s'), $tzs, $tz);
    return $result;
  }

}

Classes

Namesort descending Description
DrupalPHPMailer Base PHPMailer for Drupal implementation with support for SMTP keep-alive and setting a custom Return-Path.