Beispiel #1
0
 /**
  * Function to be executed in script shutdown
  * Registered with register_shutdown_function()
  */
 public function shutdown()
 {
     if (is_object($this->imap)) {
         $this->imap->close();
     }
     if (is_object($this->smtp)) {
         $this->smtp->disconnect();
     }
     foreach ($this->books as $book) {
         if (is_object($book)) {
             $book->close();
         }
     }
     // before closing the database connection, write session data
     if ($_SERVER['REMOTE_ADDR']) {
         session_write_close();
     }
     // write performance stats to logs/console
     if ($this->config->get('devel_mode')) {
         if (function_exists('memory_get_usage')) {
             $mem = show_bytes(memory_get_usage());
         }
         if (function_exists('memory_get_peak_usage')) {
             $mem .= '/' . show_bytes(memory_get_peak_usage());
         }
         $log = $this->task . ($this->action ? '/' . $this->action : '') . ($mem ? " [{$mem}]" : '');
         if (defined('RCMAIL_START')) {
             rcube_print_time(RCMAIL_START, $log);
         } else {
             console($log);
         }
     }
 }
Beispiel #2
0
 /**
  * Function to be executed in script shutdown
  * Registered with register_shutdown_function()
  */
 public function shutdown()
 {
     foreach ($this->shutdown_functions as $function) {
         call_user_func($function);
     }
     if (is_object($this->smtp)) {
         $this->smtp->disconnect();
     }
     foreach ($this->address_books as $book) {
         if (is_object($book) && is_a($book, 'rcube_addressbook')) {
             $book->close();
         }
     }
     foreach ($this->caches as $cache) {
         if (is_object($cache)) {
             $cache->close();
         }
     }
     if (is_object($this->storage)) {
         if ($this->expunge_cache) {
             $this->storage->expunge_cache();
         }
         $this->storage->close();
     }
     // before closing the database connection, write session data
     if ($_SERVER['REMOTE_ADDR'] && is_object($this->session)) {
         session_write_close();
     }
     // write performance stats to logs/console
     if ($this->config->get('devel_mode')) {
         if (function_exists('memory_get_usage')) {
             $mem = show_bytes(memory_get_usage());
         }
         if (function_exists('memory_get_peak_usage')) {
             $mem .= '/' . show_bytes(memory_get_peak_usage());
         }
         $log = $this->task . ($this->action ? '/' . $this->action : '') . ($mem ? " [{$mem}]" : '');
         if (defined('RCMAIL_START')) {
             rcube_print_time(RCMAIL_START, $log);
         } else {
             console($log);
         }
     }
 }
Beispiel #3
0
 /**
  * Function to be executed in script shutdown
  * Registered with register_shutdown_function()
  */
 public function shutdown()
 {
     foreach ($this->shutdown_functions as $function) {
         call_user_func($function);
     }
     if (is_object($this->smtp)) {
         $this->smtp->disconnect();
     }
     foreach ($this->caches as $cache) {
         if (is_object($cache)) {
             $cache->close();
         }
     }
     if (is_object($this->storage)) {
         if ($this->expunge_cache) {
             $this->storage->expunge_cache();
         }
         $this->storage->close();
     }
 }
Beispiel #4
0
 /**
  * Send the given message using the configured method.
  *
  * @param object $message    Reference to Mail_MIME object
  * @param string $from       Sender address string
  * @param array  $mailto     Array of recipient address strings
  * @param array  $error      SMTP error array (reference)
  * @param string $body_file  Location of file with saved message body (reference),
  *                           used when delay_file_io is enabled
  * @param array  $options    SMTP options (e.g. DSN request)
  *
  * @return boolean Send status.
  */
 public function deliver_message(&$message, $from, $mailto, &$error, &$body_file = null, $options = null)
 {
     $plugin = $this->plugins->exec_hook('message_before_send', array('message' => $message, 'from' => $from, 'mailto' => $mailto, 'options' => $options));
     if ($plugin['abort']) {
         if (!empty($plugin['error'])) {
             $error = $plugin['error'];
         }
         if (!empty($plugin['body_file'])) {
             $body_file = $plugin['body_file'];
         }
         return isset($plugin['result']) ? $plugin['result'] : false;
     }
     $from = $plugin['from'];
     $mailto = $plugin['mailto'];
     $options = $plugin['options'];
     $message = $plugin['message'];
     $headers = $message->headers();
     // send thru SMTP server using custom SMTP library
     if ($this->config->get('smtp_server')) {
         // generate list of recipients
         $a_recipients = (array) $mailto;
         if (strlen($headers['Cc'])) {
             $a_recipients[] = $headers['Cc'];
         }
         if (strlen($headers['Bcc'])) {
             $a_recipients[] = $headers['Bcc'];
         }
         // clean Bcc from header for recipients
         $send_headers = $headers;
         unset($send_headers['Bcc']);
         // here too, it because txtHeaders() below use $message->_headers not only $send_headers
         unset($message->_headers['Bcc']);
         $smtp_headers = $message->txtHeaders($send_headers, true);
         if ($message->getParam('delay_file_io')) {
             // use common temp dir
             $temp_dir = $this->config->get('temp_dir');
             $body_file = tempnam($temp_dir, 'rcmMsg');
             if (PEAR::isError($mime_result = $message->saveMessageBody($body_file))) {
                 self::raise_error(array('code' => 650, 'type' => 'php', 'file' => __FILE__, 'line' => __LINE__, 'message' => "Could not create message: " . $mime_result->getMessage()), TRUE, FALSE);
                 return false;
             }
             $msg_body = fopen($body_file, 'r');
         } else {
             $msg_body = $message->get();
         }
         // send message
         if (!is_object($this->smtp)) {
             $this->smtp_init(true);
         }
         $sent = $this->smtp->send_mail($from, $a_recipients, $smtp_headers, $msg_body, $options);
         $response = $this->smtp->get_response();
         $error = $this->smtp->get_error();
         // log error
         if (!$sent) {
             self::raise_error(array('code' => 800, 'type' => 'smtp', 'line' => __LINE__, 'file' => __FILE__, 'message' => join("\n", $response)), true, false);
         }
     } else {
         // unset some headers because they will be added by the mail() function
         $headers_enc = $message->headers($headers);
         $headers_php = $message->_headers;
         unset($headers_php['To'], $headers_php['Subject']);
         // reset stored headers and overwrite
         $message->_headers = array();
         $header_str = $message->txtHeaders($headers_php);
         // #1485779
         if (strtoupper(substr(PHP_OS, 0, 3)) === 'WIN') {
             if (preg_match_all('/<([^@]+@[^>]+)>/', $headers_enc['To'], $m)) {
                 $headers_enc['To'] = implode(', ', $m[1]);
             }
         }
         $msg_body = $message->get();
         if (PEAR::isError($msg_body)) {
             self::raise_error(array('code' => 650, 'type' => 'php', 'file' => __FILE__, 'line' => __LINE__, 'message' => "Could not create message: " . $msg_body->getMessage()), TRUE, FALSE);
         } else {
             $delim = $this->config->header_delimiter();
             $to = $headers_enc['To'];
             $subject = $headers_enc['Subject'];
             $header_str = rtrim($header_str);
             if ($delim != "\r\n") {
                 $header_str = str_replace("\r\n", $delim, $header_str);
                 $msg_body = str_replace("\r\n", $delim, $msg_body);
                 $to = str_replace("\r\n", $delim, $to);
                 $subject = str_replace("\r\n", $delim, $subject);
             }
             if (filter_var(ini_get('safe_mode'), FILTER_VALIDATE_BOOLEAN)) {
                 $sent = mail($to, $subject, $msg_body, $header_str);
             } else {
                 $sent = mail($to, $subject, $msg_body, $header_str, "-f{$from}");
             }
         }
     }
     if ($sent) {
         $this->plugins->exec_hook('message_sent', array('headers' => $headers, 'body' => $msg_body));
         // remove MDN headers after sending
         unset($headers['Return-Receipt-To'], $headers['Disposition-Notification-To']);
         if ($this->config->get('smtp_log')) {
             // get all recipient addresses
             if (is_array($mailto)) {
                 $mailto = implode(',', $mailto);
             }
             if ($headers['Cc']) {
                 $mailto .= ',' . $headers['Cc'];
             }
             if ($headers['Bcc']) {
                 $mailto .= ',' . $headers['Bcc'];
             }
             $mailto = rcube_mime::decode_address_list($mailto, null, false, null, true);
             self::write_log('sendmail', sprintf("User %s [%s]; Message for %s; %s", $this->user->get_username(), rcube_utils::remote_addr(), implode(', ', $mailto), !empty($response) ? join('; ', $response) : ''));
         }
     } else {
         // allow plugins to catch sending errors with the same parameters as in 'message_before_send'
         $this->plugins->exec_hook('message_send_error', $plugin + array('error' => $error));
     }
     if (is_resource($msg_body)) {
         fclose($msg_body);
     }
     $message->_headers = array();
     $message->headers($headers);
     return $sent;
 }
Beispiel #5
0
    $to = idn_to_ascii(trim($_POST['_to']));
    if (preg_match('/^' . $RCI->email_pattern . '$/i', $from) && preg_match('/^' . $RCI->email_pattern . '$/i', $to)) {
        $headers = array('From' => $from, 'To' => $to, 'Subject' => 'Test message from Roundcube');
        $body = 'This is a test to confirm that Roundcube can send email.';
        // send mail using configured SMTP server
        $CONFIG = $RCI->config;
        if (!empty($_POST['_smtp_user'])) {
            $CONFIG['smtp_user'] = $_POST['_smtp_user'];
        }
        if (!empty($_POST['_smtp_pass'])) {
            $CONFIG['smtp_pass'] = $_POST['_smtp_pass'];
        }
        $mail_object = new Mail_mime();
        $send_headers = $mail_object->headers($headers);
        $head = $mail_object->txtHeaders($send_headers);
        $SMTP = new rcube_smtp();
        $SMTP->connect(rcube_utils::parse_host($RCI->getprop('smtp_server')), $RCI->getprop('smtp_port'), $CONFIG['smtp_user'], $CONFIG['smtp_pass']);
        $status = $SMTP->send_mail($headers['From'], $headers['To'], $head, $body);
        $smtp_response = $SMTP->get_response();
        if ($status) {
            $RCI->pass('SMTP send');
        } else {
            $RCI->fail('SMTP send', join('; ', $smtp_response));
        }
    } else {
        $RCI->fail('SMTP send', 'Invalid sender or recipient');
    }
    echo '</p>';
}
?>
Beispiel #6
0
 /**
  * Send the given message using the configured method.
  *
  * @param object $message   Reference to Mail_MIME object
  * @param string $from      Sender address string
  * @param array  $mailto    Array of recipient address strings
  * @param array  $error     SMTP error array (reference)
  * @param string $body_file Location of file with saved message body (reference),
  *                          used when delay_file_io is enabled
  * @param array  $options   SMTP options (e.g. DSN request)
  * @param bool   $disconnect Close SMTP connection ASAP
  *
  * @return boolean Send status.
  */
 public function deliver_message(&$message, $from, $mailto, &$error, &$body_file = null, $options = null, $disconnect = false)
 {
     $plugin = $this->plugins->exec_hook('message_before_send', array('message' => $message, 'from' => $from, 'mailto' => $mailto, 'options' => $options));
     if ($plugin['abort']) {
         if (!empty($plugin['error'])) {
             $error = $plugin['error'];
         }
         if (!empty($plugin['body_file'])) {
             $body_file = $plugin['body_file'];
         }
         return isset($plugin['result']) ? $plugin['result'] : false;
     }
     $from = $plugin['from'];
     $mailto = $plugin['mailto'];
     $options = $plugin['options'];
     $message = $plugin['message'];
     $headers = $message->headers();
     // generate list of recipients
     $a_recipients = (array) $mailto;
     if (strlen($headers['Cc'])) {
         $a_recipients[] = $headers['Cc'];
     }
     if (strlen($headers['Bcc'])) {
         $a_recipients[] = $headers['Bcc'];
     }
     // remove Bcc header and get the whole head of the message as string
     $smtp_headers = $message->txtHeaders(array('Bcc' => null), true);
     if ($message->getParam('delay_file_io')) {
         // use common temp dir
         $temp_dir = $this->config->get('temp_dir');
         $body_file = tempnam($temp_dir, 'rcmMsg');
         $mime_result = $message->saveMessageBody($body_file);
         if (is_a($mime_result, 'PEAR_Error')) {
             self::raise_error(array('code' => 650, 'type' => 'php', 'file' => __FILE__, 'line' => __LINE__, 'message' => "Could not create message: " . $mime_result->getMessage()), true, false);
             return false;
         }
         $msg_body = fopen($body_file, 'r');
     } else {
         $msg_body = $message->get();
     }
     // initialize SMTP connection
     if (!is_object($this->smtp)) {
         $this->smtp_init(true);
     }
     // send message
     $sent = $this->smtp->send_mail($from, $a_recipients, $smtp_headers, $msg_body, $options);
     $response = $this->smtp->get_response();
     $error = $this->smtp->get_error();
     if (!$sent) {
         self::raise_error(array('code' => 800, 'type' => 'smtp', 'line' => __LINE__, 'file' => __FILE__, 'message' => join("\n", $response)), true, false);
         // allow plugins to catch sending errors with the same parameters as in 'message_before_send'
         $this->plugins->exec_hook('message_send_error', $plugin + array('error' => $error));
     } else {
         $this->plugins->exec_hook('message_sent', array('headers' => $headers, 'body' => $msg_body));
         // remove MDN headers after sending
         unset($headers['Return-Receipt-To'], $headers['Disposition-Notification-To']);
         if ($this->config->get('smtp_log')) {
             // get all recipient addresses
             $mailto = implode(',', $a_recipients);
             $mailto = rcube_mime::decode_address_list($mailto, null, false, null, true);
             self::write_log('sendmail', sprintf("User %s [%s]; Message for %s; %s", $this->user->get_username(), rcube_utils::remote_addr(), implode(', ', $mailto), !empty($response) ? join('; ', $response) : ''));
         }
     }
     if (is_resource($msg_body)) {
         fclose($msg_body);
     }
     if ($disconnect) {
         $this->smtp->disconnect();
     }
     $message->headers($headers, true);
     return $sent;
 }
Beispiel #7
0
 if (preg_match('/^' . $RCI->email_pattern . '$/i', $from) && preg_match('/^' . $RCI->email_pattern . '$/i', $to)) {
     $headers = array('From' => $from, 'To' => $to, 'Subject' => 'Test message from Roundcube');
     $body = 'This is a test to confirm that Roundcube can send email.';
     $smtp_response = array();
     // send mail using configured SMTP server
     if ($RCI->getprop('smtp_server')) {
         $CONFIG = $RCI->config;
         if (!empty($_POST['_smtp_user'])) {
             $CONFIG['smtp_user'] = $_POST['_smtp_user'];
         }
         if (!empty($_POST['_smtp_pass'])) {
             $CONFIG['smtp_pass'] = $_POST['_smtp_pass'];
         }
         $mail_object = new Mail_mime();
         $send_headers = $mail_object->headers($headers);
         $SMTP = new rcube_smtp();
         $SMTP->connect(rcube_parse_host($RCI->getprop('smtp_server')), $RCI->getprop('smtp_port'), $CONFIG['smtp_user'], $CONFIG['smtp_pass']);
         $status = $SMTP->send_mail($headers['From'], $headers['To'], $foo = $mail_object->txtHeaders($send_headers), $body);
         $smtp_response = $SMTP->get_response();
     } else {
         // use mail()
         $header_str = 'From: ' . $headers['From'];
         if (ini_get('safe_mode')) {
             $status = mail($headers['To'], $headers['Subject'], $body, $header_str);
         } else {
             $status = mail($headers['To'], $headers['Subject'], $body, $header_str, '-f' . $headers['From']);
         }
         if (!$status) {
             $smtp_response[] = 'Mail delivery with mail() failed. Check your error logs for details';
         }
     }
Beispiel #8
0
 if (preg_match('/^' . $RCI->email_pattern . '$/i', trim($_POST['_from'])) && preg_match('/^' . $RCI->email_pattern . '$/i', trim($_POST['_to']))) {
     $headers = array('From' => trim($_POST['_from']), 'To' => trim($_POST['_to']), 'Subject' => 'Test message from RoundCube');
     $body = 'This is a test to confirm that RoundCube can send email.';
     $smtp_response = array();
     // send mail using configured SMTP server
     if ($RCI->getprop('smtp_server')) {
         $CONFIG = $RCI->config;
         if (!empty($_POST['_smtp_user'])) {
             $CONFIG['smtp_user'] = $_POST['_smtp_user'];
         }
         if (!empty($_POST['_smtp_pass'])) {
             $CONFIG['smtp_pass'] = $_POST['_smtp_pass'];
         }
         $mail_object = new rcube_mail_mime();
         $send_headers = $mail_object->headers($headers);
         $SMTP = new rcube_smtp();
         $SMTP->connect();
         $status = $SMTP->send_mail($headers['From'], $headers['To'], $foo = $mail_object->txtHeaders($send_headers), $body);
         $smtp_response = $SMTP->get_response();
     } else {
         // use mail()
         $header_str = 'From: ' . $headers['From'];
         if (ini_get('safe_mode')) {
             $status = mail($headers['To'], $headers['Subject'], $body, $header_str);
         } else {
             $status = mail($headers['To'], $headers['Subject'], $body, $header_str, '-f' . $headers['From']);
         }
         if (!$status) {
             $smtp_response[] = 'Mail delivery with mail() failed. Check your error logs for details';
         }
     }