From 5cbdff598e4ca960835fbc5ceaeba80fcc6bd46c Mon Sep 17 00:00:00 2001
From: thomascube <thomas@roundcube.net>
Date: Fri, 20 Jan 2006 12:37:23 -0500
Subject: [PATCH] Fixed bug #1406026
---
program/steps/mail/sendmail.inc | 84 ++++++++++++++++++++++++++++++-----------
1 files changed, 61 insertions(+), 23 deletions(-)
diff --git a/program/steps/mail/sendmail.inc b/program/steps/mail/sendmail.inc
index fbb31b3..ab0c6ed 100644
--- a/program/steps/mail/sendmail.inc
+++ b/program/steps/mail/sendmail.inc
@@ -28,7 +28,7 @@
if (!isset($_SESSION['compose']['id']))
{
- $_action = 'list';
+ rcmail_overwrite_action('list');
return;
}
@@ -46,7 +46,7 @@
FROM ".get_table_name('identities')."
WHERE identity_id=?
AND user_id=?
- AND del<>'1'",
+ AND del<>1",
$id,$_SESSION['user_id']);
if ($DB->num_rows($sql_result))
@@ -65,10 +65,26 @@
/****** check submission and compose message ********/
-$mailto_regexp = '/,\s*$/';
+if (empty($_POST['_to']) && empty($_POST['_subject']) && $_POST['_message'])
+ {
+ show_message("sendingfailed", 'error');
+ rcmail_overwrite_action('compose');
+ return;
+ }
-// trip ending ', ' from
-$mailto = preg_replace($mailto_regexp, '', $_POST['_to']);
+
+// set default charset
+if (empty($CHARSET))
+ $CHARSET = 'ISO-8859-1';
+
+$input_charset = $CHARSET;
+$message_charset = isset($_POST['_charset']) ? $_POST['_charset'] : $input_charset;
+
+$mailto_regexp = array('/[,;]\s*[\r\n]+/', '/[\r\n]+/', '/[,;]\s*$/m');
+$mailto_replace = array(', ', ', ', '');
+
+// repalce new lines and strip ending ', '
+$mailto = preg_replace($mailto_regexp, $mailto_replace, stripslashes($_POST['_to']));
// decode address strings
$to_address_arr = $IMAP->decode_address_list($mailto);
@@ -86,20 +102,20 @@
// compose headers array
$headers = array('Date' => date('D, j M Y G:i:s O'),
'From' => $identity_arr['string'],
- 'To' => $mailto);
+ 'To' => rcube_charset_convert($mailto, $input_charset, $message_charset));
// additional recipients
if ($_POST['_cc'])
- $headers['Cc'] = preg_replace($mailto_regexp, '', $_POST['_cc']);
+ $headers['Cc'] = rcube_charset_convert(preg_replace($mailto_regexp, $mailto_replace, stripslashes($_POST['_cc'])), $input_charset, $message_charset);
if ($_POST['_bcc'])
- $headers['Bcc'] = preg_replace($mailto_regexp, '', $_POST['_bcc']);
+ $headers['Bcc'] = rcube_charset_convert(preg_replace($mailto_regexp, $mailto_replace, stripslashes($_POST['_bcc'])), $input_charset, $message_charset);
if (strlen($identity_arr['bcc']))
$headers['Bcc'] = ($headers['Bcc'] ? $headers['Bcc'].', ' : '') . $identity_arr['bcc'];
// add subject
-$headers['Subject'] = trim(stripslashes($_POST['_subject']));
+$headers['Subject'] = rcube_charset_convert(trim(stripslashes($_POST['_subject'])), $input_charset, $message_charset);
if (strlen($identity_arr['organization']))
$headers['Organization'] = $identity_arr['organization'];
@@ -127,11 +143,29 @@
if ($CONFIG['useragent'])
$headers['User-Agent'] = $CONFIG['useragent'];
+// fetch message body
+$message_body = rcube_charset_convert(stripslashes($_POST['_message']), $input_charset, $message_charset);
+
+// append generic footer to all messages
+if (!empty($CONFIG['generic_message_footer']))
+ {
+ $file = realpath($CONFIG['generic_message_footer']);
+ if($fp = fopen($file, 'r'))
+ {
+ $content = fread($fp, filesize($file));
+ fclose($fp);
+ $message_body .= "\r\n" . rcube_charset_convert($content, 'UTF-8', $message_charset);
+ }
+ }
+
+
+// use the configured delimiter for headers
+$header_delm = $rcmail_config['mail_header_delimiter'] ? $rcmail_config['mail_header_delimiter'] : "\r\n";
// create PEAR::Mail_mime instance
-$MAIL_MIME = new Mail_mime();
-$MAIL_MIME->setTXTBody(stripslashes($_POST['_message']), FALSE, TRUE);
-//$MAIL_MIME->setTXTBody(wordwrap(stripslashes($_POST['_message'])), FALSE, TRUE);
+$MAIL_MIME = new Mail_mime($header_delm);
+$MAIL_MIME->setTXTBody($message_body, FALSE, TRUE);
+//$MAIL_MIME->setTXTBody(wordwrap($message_body), FALSE, TRUE);
// add stored attachments, if any
@@ -145,13 +179,14 @@
foreach ($_FILES['_attachments']['tmp_name'] as $i => $filepath)
$MAIL_MIME->addAttachment($filepath, $files['type'][$i], $files['name'][$i], TRUE);
+
// encoding settings for mail composing
$message_param = array('text_encoding' => '7bit',
'html_encoding' => 'quoted-printable',
'head_encoding' => 'quoted-printable',
- 'head_charset' => 'ISO-8859-1',
- 'html_charset' => 'ISO-8859-1',
- 'text_charset' => 'ISO-8859-1');
+ 'head_charset' => $message_charset,
+ 'html_charset' => $message_charset,
+ 'text_charset' => $message_charset);
// compose message body and get headers
$msg_body = $MAIL_MIME->get($message_param);
@@ -191,23 +226,25 @@
{
// unset some headers because they will be added by the mail() function
$headers_php = $headers;
+ $headers_enc = $MAIL_MIME->headers($headers);
unset($headers_php['To'], $headers_php['Subject']);
+ // reset stored headers and overwrite
+ $MAIL_MIME->_headers = array();
$header_str = $MAIL_MIME->txtHeaders($headers_php);
-
+
if(ini_get('safe_mode'))
- $sent = mail($mailto, $msg_subject, $msg_body, $header_str);
- else
- $sent = mail($mailto, $msg_subject, $msg_body, $header_str, "-f$from");
+ $sent = mail($headers_enc['To'], $headers_enc['Subject'], $msg_body, $header_str);
+ else
+ $sent = mail($headers_enc['To'], $headers_enc['Subject'], $msg_body, $header_str, "-f$from");
}
// return to compose page if sending failed
if (!$sent)
{
- $_action = 'compose';
- $OUTPUT->add_script(sprintf("\n%s.set_env('action', '%s');", $JS_OBJECT_NAME, $_action));
show_message("sendingfailed", 'error');
+ rcmail_overwrite_action('compose');
return;
}
@@ -245,13 +282,14 @@
// log mail sending
if ($CONFIG['smtp_log'])
{
- $log_entry = sprintf("[%s] User: %d; Message for %s; Subject: %s\n",
+ $log_entry = sprintf("[%s] User: %d on %s; Message for %s; Subject: %s\n",
date("d-M-Y H:i:s O", mktime()),
$_SESSION['user_id'],
+ $_SERVER['REMOTE_ADDR'],
$mailto,
$msg_subject);
- if ($fp = fopen($INSTALL_PATH.'logs/sendmail', 'a'))
+ if ($fp = @fopen($CONFIG['log_dir'].'/sendmail', 'a'))
{
fwrite($fp, $log_entry);
fclose($fp);
--
Gitblit v1.9.1