summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--CHANGELOG2
-rw-r--r--program/include/rcube_shared.inc48
-rw-r--r--program/steps/mail/compose.inc2
-rw-r--r--program/steps/mail/func.inc6
-rw-r--r--program/steps/mail/sendmail.inc10
5 files changed, 59 insertions, 9 deletions
diff --git a/CHANGELOG b/CHANGELOG
index 0e9ccfd51..efb8026e7 100644
--- a/CHANGELOG
+++ b/CHANGELOG
@@ -1,6 +1,8 @@
CHANGELOG RoundCube Webmail
===========================
+- Fix incorrect word wrapping in outgoing plaintext multibyte messages (#1485714)
+- Fix double footer in HTML message with embedded images
- Fix TNEF implementation bug (#1485773)
- Fix incorrect row id parsing for LDAP contacts list (#1485784)
- Fix 'mode' parameter in sqlite DSN (#1485772)
diff --git a/program/include/rcube_shared.inc b/program/include/rcube_shared.inc
index f1cbb19c3..a05815800 100644
--- a/program/include/rcube_shared.inc
+++ b/program/include/rcube_shared.inc
@@ -405,6 +405,54 @@ function rc_strrpos($haystack, $needle, $offset=0)
return strrpos($haystack, $needle, $offset);
}
+/**
+ * Wrapper function for wordwrap
+ */
+function rc_wordwrap($string, $width=75, $break="\n", $cut=false)
+{
+ if (!function_exists('mb_substr') || !function_exists('mb_strlen'))
+ return wordwrap($string, $width, $break, $cut);
+
+ $para = explode($break, $string);
+ $string = '';
+ while (count($para)) {
+ $list = explode(' ', array_shift($para));
+ $len = 0;
+ while (count($list)) {
+ $line = array_shift($list);
+ $l = mb_strlen($line);
+ $newlen = $len + $l + ($len ? 1 : 0);
+
+ if ($newlen <= $width) {
+ $string .= ($len ? ' ' : '').$line;
+ $len += ($len ? 1 : 0) + $l;
+ } else {
+ if ($l > $width) {
+ if ($cut) {
+ $start = 0;
+ while ($l) {
+ $str = mb_substr($line, $start, $width);
+ $strlen = mb_strlen($str);
+ $string .= ($len ? $break : '').$str;
+ $start += $strlen;
+ $l -= $strlen;
+ $len = $strlen;
+ }
+ } else {
+ $string .= ($len ? $break : '').$line;
+ if (count($list)) $string .= $break;
+ $len = 0;
+ }
+ } else {
+ $string .= $break.$line;
+ $len = $l;
+ }
+ }
+ }
+ if (count($para)) $string .= $break;
+ }
+ return $string;
+}
/**
* Read a specific HTTP request header
diff --git a/program/steps/mail/compose.inc b/program/steps/mail/compose.inc
index ab25b1b8d..49c4c3011 100644
--- a/program/steps/mail/compose.inc
+++ b/program/steps/mail/compose.inc
@@ -490,7 +490,7 @@ function rcmail_create_reply_body($body, $bodyIsHtml)
}
// add title line(s)
- $prefix = wordwrap(sprintf("On %s, %s wrote:\n",
+ $prefix = rc_wordwrap(sprintf("On %s, %s wrote:\n",
$MESSAGE->headers->date,
$MESSAGE->get_header('from')), 76);
diff --git a/program/steps/mail/func.inc b/program/steps/mail/func.inc
index 79e148d8a..a76532cb9 100644
--- a/program/steps/mail/func.inc
+++ b/program/steps/mail/func.inc
@@ -1179,7 +1179,7 @@ function rcmail_wrap_quoted($text, $max = 76)
$prefix = substr($line, 0, $length);
// Remove '> ' from the line, then wordwrap() the line
- $line = wordwrap(substr($line, $length), $max - $length);
+ $line = rc_wordwrap(substr($line, $length), $max - $length);
// Rebuild the line with '> ' at the beginning of each 'subline'
$newline = '';
@@ -1191,7 +1191,7 @@ function rcmail_wrap_quoted($text, $max = 76)
$line = rtrim($newline);
}
else {
- $line = wordwrap($line, $max);
+ $line = rc_wordwrap($line, $max);
}
}
@@ -1390,7 +1390,7 @@ function rcmail_send_mdn($uid)
"Disposition: manual-action/MDN-sent-manually; displayed\r\n";
$compose->headers($headers);
- $compose->setTXTBody(wordwrap($body, 75, "\r\n"));
+ $compose->setTXTBody(rc_wordwrap($body, 75, "\r\n"));
$compose->addAttachment($report, 'message/disposition-notification', 'MDNPart2.txt', false, '7bit', 'inline');
$sent = rcmail_deliver_message($compose, $identity['email'], $mailto);
diff --git a/program/steps/mail/sendmail.inc b/program/steps/mail/sendmail.inc
index eb81fc9ad..9607619e9 100644
--- a/program/steps/mail/sendmail.inc
+++ b/program/steps/mail/sendmail.inc
@@ -302,10 +302,10 @@ if ($isHtml)
$MAIL_MIME->setHTMLBody($message_body . ($footer ? "\r\n<pre>".$footer.'</pre>' : ''));
// add a plain text version of the e-mail as an alternative part.
- $h2t = new html2text($message_body);
- $plainTextPart = $h2t->get_text() . ($footer ? "\r\n".$footer : '');
+ $h2t = new html2text($message_body, false, true, 0);
+ $plainTextPart = rc_wordwrap($h2t->get_text(), 75, "\r\n"). ($footer ? "\r\n".$footer : '');
$plainTextPart = wordwrap($plainTextPart, 998, "\r\n", true);
- if (!strlen($plainTextPart))
+ if (!strlen($plainTextPart))
{
// empty message body breaks attachment handling in drafts
$plainTextPart = "\r\n";
@@ -317,7 +317,7 @@ if ($isHtml)
}
else
{
- $message_body = wordwrap($message_body, 75, "\r\n");
+ $message_body = rc_wordwrap($message_body, 75, "\r\n");
if ($footer)
$message_body .= "\r\n" . $footer;
$message_body = wordwrap($message_body, 998, "\r\n", true);
@@ -342,7 +342,7 @@ if (is_array($_SESSION['compose']['attachments']))
if ($isHtml && ($match > 0))
{
$message_body = preg_replace($dispurl, ' src="'.$attachment['name'].'" ', $message_body);
- $MAIL_MIME->setHTMLBody($message_body. ($footer ? "\r\n<pre>".$footer.'</pre>' : ''));
+ $MAIL_MIME->setHTMLBody($message_body);
$MAIL_MIME->addHTMLImage($attachment['path'], $attachment['mimetype'], $attachment['name']);
}
else