alecpl
2010-07-30 2537686d1dc06c7b0588bc4663342a052ebaca6e
program/include/rcube_smtp.php
@@ -5,7 +5,7 @@
 | program/include/rcube_smtp.php                                        |
 |                                                                       |
 | This file is part of the RoundCube Webmail client                     |
 | Copyright (C) 2005-2007, RoundCube Dev. - Switzerland                 |
 | Copyright (C) 2005-2010, RoundCube Dev. - Switzerland                 |
 | Licensed under the GNU GPL                                            |
 |                                                                       |
 | PURPOSE:                                                              |
@@ -22,7 +22,15 @@
// define headers delimiter
define('SMTP_MIME_CRLF', "\r\n");
class rcube_smtp {
/**
 * Class to provide SMTP functionality using PEAR Net_SMTP
 *
 * @package    Mail
 * @author     Thomas Bruederli <roundcube@gmail.com>
 * @author     Aleksander Machniak <alec@alec.pl>
 */
class rcube_smtp
{
  private $conn = null;
  private $response;
@@ -65,7 +73,7 @@
      'smtp_timeout'   => $RCMAIL->config->get('smtp_timeout'),
    ));
    $smtp_host = str_replace('%h', $_SESSION['imap_host'], $CONFIG['smtp_server']);
    $smtp_host = rcube_parse_host($CONFIG['smtp_server']);
    // when called from Installer it's possible to have empty $smtp_host here
    if (!$smtp_host) $smtp_host = 'localhost';
    $smtp_port = is_numeric($CONFIG['smtp_port']) ? $CONFIG['smtp_port'] : 25;
@@ -81,6 +89,12 @@
    // re-write smtp host
    if (isset($smtp_host_url['host']) && isset($smtp_host_url['scheme']))
      $smtp_host = sprintf('%s://%s', $smtp_host_url['scheme'], $smtp_host_url['host']);
    // remove TLS prefix and set flag for use in Net_SMTP::auth()
    if (preg_match('#^tls://#i', $smtp_host)) {
      $smtp_host = preg_replace('#^tls://#i', '', $smtp_host);
      $use_tls = true;
    }
    if (!empty($CONFIG['smtp_helo_host']))
      $helo_host = $CONFIG['smtp_helo_host'];
@@ -107,17 +121,18 @@
    $smtp_user = str_replace('%u', $_SESSION['username'], $CONFIG['smtp_user']);
    $smtp_pass = str_replace('%p', $RCMAIL->decrypt($_SESSION['password']), $CONFIG['smtp_pass']);
    $smtp_auth_type = empty($CONFIG['smtp_auth_type']) ? NULL : $CONFIG['smtp_auth_type'];
    // attempt to authenticate to the SMTP server
    if ($smtp_user && $smtp_pass)
    {
      $result = $this->conn->auth($smtp_user, $smtp_pass, $smtp_auth_type);
      $result = $this->conn->auth($smtp_user, $smtp_pass, $smtp_auth_type, $use_tls);
      if (PEAR::isError($result))
      {
        $this->error = array('label' => 'smtpautherror', 'vars' => array('code' => $this->conn->_code));
        $this->response[] .= 'Authentication failure: ' . $result->getMessage() . ' (Code: ' . $result->getCode() . ')';
        $this->reset();
   $this->disconnect();
        $this->disconnect();
        return false;
      }
    }
@@ -181,7 +196,9 @@
    // set From: address
    if (PEAR::isError($this->conn->mailFrom($from)))
    {
      $this->error = array('label' => 'smtpfromerror', 'vars' => array('from' => $from, 'code' => $this->conn->_code));
      $err = $this->conn->getResponse();
      $this->error = array('label' => 'smtpfromerror', 'vars' => array(
        'from' => $from, 'code' => $this->conn->_code, 'msg' => $err[1]));
      $this->response[] .= "Failed to set sender '$from'";
      $this->reset();
      return false;
@@ -200,7 +217,9 @@
    foreach ($recipients as $recipient)
    {
      if (PEAR::isError($this->conn->rcptTo($recipient))) {
        $this->error = array('label' => 'smtptoerror', 'vars' => array('to' => $recipient, 'code' => $this->conn->_code));
        $err = $this->conn->getResponse();
        $this->error = array('label' => 'smtptoerror', 'vars' => array(
          'to' => $recipient, 'code' => $this->conn->_code, 'msg' => $err[1]));
        $this->response[] .= "Failed to add recipient '$recipient'";
        $this->reset();
        return false;
@@ -226,7 +245,13 @@
    // Send the message's headers and the body as SMTP data.
    if (PEAR::isError($result = $this->conn->data($data, $text_headers)))
    {
      $this->error = array('label' => 'smtperror', 'vars' => array('msg' => $result->getMessage()));
      $err = $this->conn->getResponse();
      if (!in_array($err[0], array(354, 250, 221)))
        $msg = sprintf('[%d] %s', $err[0], $err[1]);
      else
        $msg = $result->getMessage();
      $this->error = array('label' => 'smtperror', 'vars' => array('msg' => $msg));
      $this->response[] .= "Failed to send data";
      $this->reset();
      return false;
@@ -379,14 +404,14 @@
    
    $addresses = array();
    $recipients = rcube_explode_quoted_string(',', $recipients);
    reset($recipients);
    while (list($k, $recipient) = each($recipients))
    {
      $a = explode(" ", $recipient);
      while (list($k2, $word) = each($a))
      {
        if ((strpos($word, "@") > 0) && (strpos($word, "\"")===false))
        if (strpos($word, "@") > 0 && $word[strlen($word)-1] != '"')
        {
          $word = preg_replace('/^<|>$/', '', trim($word));
          if (in_array($word, $addresses)===false)
@@ -398,5 +423,3 @@
  }
}
?>