| | |
| | | | | |
| | | | This file is part of the Roundcube Webmail client | |
| | | | Copyright (C) 2005-2010, The Roundcube Dev Team | |
| | | | Licensed under the GNU GPL | |
| | | | | |
| | | | Licensed under the GNU General Public License version 3 or | |
| | | | any later version with exceptions for skins & plugins. | |
| | | | See the README file for a full license statement. | |
| | | | | |
| | | | PURPOSE: | |
| | | | Provide SMTP functionality using socket connections | |
| | |
| | | +-----------------------------------------------------------------------+ |
| | | | Author: Thomas Bruederli <roundcube@gmail.com> | |
| | | +-----------------------------------------------------------------------+ |
| | | |
| | | $Id$ |
| | | |
| | | */ |
| | | |
| | | // define headers delimiter |
| | |
| | | /** |
| | | * Class to provide SMTP functionality using PEAR Net_SMTP |
| | | * |
| | | * @package Mail |
| | | * @package Framework |
| | | * @subpackage Mail |
| | | * @author Thomas Bruederli <roundcube@gmail.com> |
| | | * @author Aleksander Machniak <alec@alec.pl> |
| | | */ |
| | |
| | | */ |
| | | public function connect($host=null, $port=null, $user=null, $pass=null) |
| | | { |
| | | $RCMAIL = rcmail::get_instance(); |
| | | |
| | | $rcube = rcube::get_instance(); |
| | | |
| | | // disconnect/destroy $this->conn |
| | | $this->disconnect(); |
| | | |
| | | |
| | | // reset error/response var |
| | | $this->error = $this->response = null; |
| | | |
| | | |
| | | // let plugins alter smtp connection config |
| | | $CONFIG = $RCMAIL->plugins->exec_hook('smtp_connect', array( |
| | | 'smtp_server' => $host ? $host : $RCMAIL->config->get('smtp_server'), |
| | | 'smtp_port' => $port ? $port : $RCMAIL->config->get('smtp_port', 25), |
| | | 'smtp_user' => $user ? $user : $RCMAIL->config->get('smtp_user'), |
| | | 'smtp_pass' => $pass ? $pass : $RCMAIL->config->get('smtp_pass'), |
| | | 'smtp_auth_cid' => $RCMAIL->config->get('smtp_auth_cid'), |
| | | 'smtp_auth_pw' => $RCMAIL->config->get('smtp_auth_pw'), |
| | | 'smtp_auth_type' => $RCMAIL->config->get('smtp_auth_type'), |
| | | 'smtp_helo_host' => $RCMAIL->config->get('smtp_helo_host'), |
| | | 'smtp_timeout' => $RCMAIL->config->get('smtp_timeout'), |
| | | $CONFIG = $rcube->plugins->exec_hook('smtp_connect', array( |
| | | 'smtp_server' => $host ? $host : $rcube->config->get('smtp_server'), |
| | | 'smtp_port' => $port ? $port : $rcube->config->get('smtp_port', 25), |
| | | 'smtp_user' => $user ? $user : $rcube->config->get('smtp_user'), |
| | | 'smtp_pass' => $pass ? $pass : $rcube->config->get('smtp_pass'), |
| | | 'smtp_auth_cid' => $rcube->config->get('smtp_auth_cid'), |
| | | 'smtp_auth_pw' => $rcube->config->get('smtp_auth_pw'), |
| | | 'smtp_auth_type' => $rcube->config->get('smtp_auth_type'), |
| | | 'smtp_helo_host' => $rcube->config->get('smtp_helo_host'), |
| | | 'smtp_timeout' => $rcube->config->get('smtp_timeout'), |
| | | 'smtp_auth_callbacks' => array(), |
| | | )); |
| | | |
| | | $smtp_host = rcube_parse_host($CONFIG['smtp_server']); |
| | | $smtp_host = rcube_utils::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; |
| | |
| | | $helo_host = 'localhost'; |
| | | |
| | | // IDNA Support |
| | | $smtp_host = rcube_idn_to_ascii($smtp_host); |
| | | $smtp_host = rcube_utils::idn_to_ascii($smtp_host); |
| | | |
| | | $this->conn = new Net_SMTP($smtp_host, $smtp_port, $helo_host); |
| | | |
| | | if ($RCMAIL->config->get('smtp_debug')) |
| | | if ($rcube->config->get('smtp_debug')) |
| | | $this->conn->setDebug(true, array($this, 'debug_handler')); |
| | | |
| | | // register authentication methods |
| | | if (!empty($CONFIG['smtp_auth_callbacks']) && method_exists($this->conn, 'setAuthMethod')) { |
| | | foreach ($CONFIG['smtp_auth_callbacks'] as $callback) { |
| | | $this->conn->setAuthMethod($callback['name'], $callback['function'], |
| | | isset($callback['prepend']) ? $callback['prepend'] : true); |
| | | } |
| | | } |
| | | |
| | | // try to connect to server and exit on failure |
| | | $result = $this->conn->connect($smtp_timeout); |
| | |
| | | } |
| | | |
| | | $smtp_user = str_replace('%u', $_SESSION['username'], $CONFIG['smtp_user']); |
| | | $smtp_pass = str_replace('%p', $RCMAIL->decrypt($_SESSION['password']), $CONFIG['smtp_pass']); |
| | | $smtp_pass = str_replace('%p', $rcube->decrypt($_SESSION['password']), $CONFIG['smtp_pass']); |
| | | $smtp_auth_type = empty($CONFIG['smtp_auth_type']) ? NULL : $CONFIG['smtp_auth_type']; |
| | | |
| | | if (!empty($CONFIG['smtp_auth_cid'])) { |
| | |
| | | { |
| | | // IDNA Support |
| | | if (strpos($smtp_user, '@')) { |
| | | $smtp_user = rcube_idn_to_ascii($smtp_user); |
| | | $smtp_user = rcube_utils::idn_to_ascii($smtp_user); |
| | | } |
| | | |
| | | $result = $this->conn->auth($smtp_user, $smtp_pass, $smtp_auth_type, $use_tls, $smtp_authz); |
| | |
| | | */ |
| | | public function debug_handler(&$smtp, $message) |
| | | { |
| | | write_log('smtp', preg_replace('/\r\n$/', '', $message)); |
| | | rcube::write_log('smtp', preg_replace('/\r\n$/', '', $message)); |
| | | } |
| | | |
| | | |
| | |
| | | $from = $addresses[0]; |
| | | |
| | | // Reject envelope From: addresses with spaces. |
| | | if (strstr($from, ' ')) |
| | | if (strpos($from, ' ') !== false) |
| | | return false; |
| | | |
| | | $lines[] = $key . ': ' . $value; |
| | |
| | | $lines[] = $key . ': ' . $value; |
| | | } |
| | | } |
| | | |
| | | |
| | | return array($from, join(SMTP_MIME_CRLF, $lines) . SMTP_MIME_CRLF); |
| | | } |
| | | |
| | |
| | | $recipients = implode(', ', $recipients); |
| | | |
| | | $addresses = array(); |
| | | $recipients = rcube_explode_quoted_string(',', $recipients); |
| | | $recipients = rcube_utils::explode_quoted_string(',', $recipients); |
| | | |
| | | reset($recipients); |
| | | while (list($k, $recipient) = each($recipients)) |
| | | { |
| | | $a = rcube_explode_quoted_string(' ', $recipient); |
| | | $a = rcube_utils::explode_quoted_string(' ', $recipient); |
| | | while (list($k2, $word) = each($a)) |
| | | { |
| | | if (strpos($word, "@") > 0 && $word[strlen($word)-1] != '"') |