diff options
-rw-r--r-- | CHANGELOG | 1 | ||||
-rw-r--r-- | config/main.inc.php.dist | 4 | ||||
-rw-r--r-- | program/steps/mail/func.inc | 25 | ||||
-rw-r--r-- | program/steps/mail/sendmail.inc | 24 |
4 files changed, 40 insertions, 14 deletions
@@ -1,6 +1,7 @@ CHANGELOG RoundCube Webmail =========================== +- Fix use RFC-compliant line-delimiter when saving messages on IMAP (#1486712) - Add 'imap_timeout' option (#1486760) - Fix forwarding of messages with winmail attachments - Fix handling of uuencoded attachments in message body (#1485839) diff --git a/config/main.inc.php.dist b/config/main.inc.php.dist index b1da1595a..0b39d76f5 100644 --- a/config/main.inc.php.dist +++ b/config/main.inc.php.dist @@ -216,8 +216,8 @@ $rcmail_config['http_received_header'] = false; // when tracking down issues. $rcmail_config['http_received_header_encrypt'] = false; -// this string is used as a delimiter for message headers when sending -// leave empty for auto-detection +// This string is used as a delimiter for message headers when sending +// a message via mail() function. Leave empty for auto-detection $rcmail_config['mail_header_delimiter'] = NULL; // number of chars allowed for line when wrapping text. diff --git a/program/steps/mail/func.inc b/program/steps/mail/func.inc index 93eb97fd4..b07e3a6d9 100644 --- a/program/steps/mail/func.inc +++ b/program/steps/mail/func.inc @@ -1366,8 +1366,8 @@ function rcmail_deliver_message(&$message, $from, $mailto, &$smtp_error, &$body_ 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(); @@ -1376,10 +1376,23 @@ function rcmail_deliver_message(&$message, $from, $mailto, &$smtp_error, &$body_ 'file' => __FILE__, 'line' => __LINE__, 'message' => "Could not create message: ".$msg_body->getMessage()), TRUE, FALSE); - else if (ini_get('safe_mode')) - $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"); + else { + $delim = $RCMAIL->config->header_delimiter(); + $to = $headers_enc['To']; + $subject = $headers_enc['Subject']; + + 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 (ini_get('safe_mode')) + $sent = mail($to, $subject, $msg_body, $header_str); + else + $sent = mail($to, $subject, $msg_body, $header_str, "-f$from"); + } } if ($sent) { @@ -1418,7 +1431,7 @@ function rcmail_send_mdn($uid, &$smtp_error) $recipient = array_shift($IMAP->decode_address_list($message->headers->mdn_to)); $mailto = $recipient['mailto']; - $compose = new Mail_mime($RCMAIL->config->header_delimiter()); + $compose = new Mail_mime("\r\n"); $compose->setParam('text_encoding', 'quoted-printable'); $compose->setParam('html_encoding', 'quoted-printable'); diff --git a/program/steps/mail/sendmail.inc b/program/steps/mail/sendmail.inc index 4229e7d3b..3c32530a4 100644 --- a/program/steps/mail/sendmail.inc +++ b/program/steps/mail/sendmail.inc @@ -249,7 +249,7 @@ $headers = array(); // if configured, the Received headers goes to top, for good measure if ($CONFIG['http_received_header']) { - $nldlm = $RCMAIL->config->header_delimiter() . "\t"; + $nldlm = "\r\n\t"; // FROM/VIA $http_header = 'from '; if (isset($_SERVER['HTTP_X_FORWARDED_FOR'])) { @@ -398,7 +398,7 @@ $LINE_LENGTH = $RCMAIL->config->get('line_length', 72); @set_time_limit(0); // create PEAR::Mail_mime instance -$MAIL_MIME = new Mail_mime($RCMAIL->config->header_delimiter()); +$MAIL_MIME = new Mail_mime("\r\n"); // Check if we have enough memory to handle the message in it // It's faster than using files, so we'll do this if we only can @@ -419,7 +419,9 @@ if (is_array($_SESSION['compose']['attachments']) && $CONFIG['smtp_server'] // the HTML part and the plain-text part if ($isHtml) { - $plugin = $RCMAIL->plugins->exec_hook('outgoing_message_body', array('body' => $message_body, 'type' => 'html', 'message' => $MAIL_MIME)); + $plugin = $RCMAIL->plugins->exec_hook('outgoing_message_body', + array('body' => $message_body, 'type' => 'html', 'message' => $MAIL_MIME)); + $MAIL_MIME->setHTMLBody($plugin['body'] . ($footer ? "\r\n<pre>".$footer.'</pre>' : '')); // add a plain text version of the e-mail as an alternative part. @@ -430,7 +432,14 @@ if ($isHtml) { // empty message body breaks attachment handling in drafts $plainTextPart = "\r\n"; } - $plugin = $RCMAIL->plugins->exec_hook('outgoing_message_body', array('body' => $plainTextPart, 'type' => 'alternative', 'message' => $MAIL_MIME)); + else { + // make sure all line endings are CRLF (#1486712) + $plainTextPart = preg_replace('/\r?\n/', "\r\n", $plainTextPart); + } + + $plugin = $RCMAIL->plugins->exec_hook('outgoing_message_body', + array('body' => $plainTextPart, 'type' => 'alternative', 'message' => $MAIL_MIME)); + $MAIL_MIME->setTXTBody($plugin['body']); // look for "emoticon" images from TinyMCE and change their src paths to @@ -452,7 +461,10 @@ else { // empty message body breaks attachment handling in drafts $message_body = "\r\n"; } - $plugin = $RCMAIL->plugins->exec_hook('outgoing_message_body', array('body' => $message_body, 'type' => 'plain', 'message' => $MAIL_MIME)); + + $plugin = $RCMAIL->plugins->exec_hook('outgoing_message_body', + array('body' => $message_body, 'type' => 'plain', 'message' => $MAIL_MIME)); + $MAIL_MIME->setTXTBody($plugin['body'], false, true); } @@ -512,7 +524,7 @@ if (function_exists('mb_encode_mimeheader')) { mb_internal_encoding($message_charset); $headers['Subject'] = mb_encode_mimeheader($headers['Subject'], - $message_charset, 'Q', $RCMAIL->config->header_delimiter(), 8); + $message_charset, 'Q', "\r\n", 8); mb_internal_encoding(RCMAIL_CHARSET); } |