diff options
author | alecpl <alec@alec.pl> | 2009-03-30 18:04:18 +0000 |
---|---|---|
committer | alecpl <alec@alec.pl> | 2009-03-30 18:04:18 +0000 |
commit | 7145e009e440ef4d6dcba2b4845656376c9d8ccd (patch) | |
tree | 781720e87f351cecef10ed49126c6b1ea6f90077 | |
parent | dadb05b0afc9a76d4f29a8d35bdf268aa20926df (diff) |
- Fix incorrect word wrapping in outgoing plaintext multibyte messages (#1485714)
- Fix double footer in HTML message with embedded images
-rw-r--r-- | CHANGELOG | 2 | ||||
-rw-r--r-- | program/include/rcube_shared.inc | 48 | ||||
-rw-r--r-- | program/steps/mail/compose.inc | 2 | ||||
-rw-r--r-- | program/steps/mail/func.inc | 6 | ||||
-rw-r--r-- | program/steps/mail/sendmail.inc | 10 |
5 files changed, 59 insertions, 9 deletions
@@ -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 |