From bfbd9a1d08d44239cf3b359140b6e0fc76e3446c Mon Sep 17 00:00:00 2001 From: David Grudl Date: Mon, 18 Aug 2014 19:48:45 +0200 Subject: [PATCH] Mail\MimePart::encodeHeader() - do not use base64 encoding for long headers [Closes nette/mail#4] partially --- Nette/Mail/MimePart.php | 34 ++++++++++++++------------- tests/Nette/Mail/Mail.email.long.phpt | 4 +--- tests/Nette/Mail/Mail.subject.phpt | 4 +--- 3 files changed, 20 insertions(+), 22 deletions(-) diff --git a/Nette/Mail/MimePart.php b/Nette/Mail/MimePart.php index 463665c86e..0821c9e1af 100644 --- a/Nette/Mail/MimePart.php +++ b/Nette/Mail/MimePart.php @@ -132,22 +132,16 @@ public function getEncodedHeader($name) $s .= self::encodeHeader($name, $offset, strpbrk($name, '.,;<@>()[]"=?')); $email = " <$email>"; } - $email .= ','; - if ($s !== '' && $offset + strlen($email) > self::LINE_LENGTH) { - $s .= self::EOL . "\t"; - $offset = 1; - } - $s .= $email; - $offset += strlen($email); + $s .= self::append($email . ',', $offset); } - return substr($s, 0, -1); // last comma + return ltrim(substr($s, 0, -1)); // last comma } elseif (preg_match('#^(\S+; (?:file)?name=)"(.*)"\z#', $this->headers[$name], $m)) { // Content-Disposition $offset += strlen($m[1]); return $m[1] . '"' . self::encodeHeader($m[2], $offset) . '"'; } else { - return self::encodeHeader($this->headers[$name], $offset); + return ltrim(self::encodeHeader($this->headers[$name], $offset)); } } @@ -305,19 +299,16 @@ public function getEncodedMessage() */ private static function encodeHeader($s, & $offset = 0, $force = FALSE) { + if (!$force && strspn($s, "!\"#$%&\'()*+,-./0123456789:;<>@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^`abcdefghijklmnopqrstuvwxyz{|}=? _\r\n\t") === strlen($s)) { + return self::append($s, $offset); + } + $o = ''; if ($offset >= 55) { // maximum for iconv_mime_encode $o = self::EOL . "\t"; $offset = 1; } - if (!$force && strspn($s, "!\"#$%&\'()*+,-./0123456789:;<>@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^`abcdefghijklmnopqrstuvwxyz{|}=? _\r\n\t") === strlen($s) - && ($offset + strlen($s) <= self::LINE_LENGTH) - ) { - $offset += strlen($s); - return $o . $s; - } - $s = iconv_mime_encode(str_repeat(' ', $old = $offset), $s, array( 'scheme' => 'B', // Q is broken 'input-charset' => 'UTF-8', @@ -329,4 +320,15 @@ private static function encodeHeader($s, & $offset = 0, $force = FALSE) return $o . $s; } + + private static function append($s, & $offset = 0) + { + if ($offset + strlen($s) > self::LINE_LENGTH) { + $offset = 1; + $s = self::EOL . "\t" . $s; + } + $offset += strlen($s); + return $s; + } + } diff --git a/tests/Nette/Mail/Mail.email.long.phpt b/tests/Nette/Mail/Mail.email.long.phpt index 2fb7d88627..f69e4fcc97 100644 --- a/tests/Nette/Mail/Mail.email.long.phpt +++ b/tests/Nette/Mail/Mail.email.long.phpt @@ -31,9 +31,7 @@ Date: %a% To: veryveryveryveryveryveryveryveryveryveryveryveryveryveryveryveryveryveryveryveryveryveryveryverylongemail@example.com Cc: John Doe -Bcc: =?UTF-8?B?dmVyeXZlcnl2ZXJ5dmVyeXZlcnl2ZXJ5dmVyeXZlcnl2ZXJ5dmU=?= - =?UTF-8?B?cnl2ZXJ5dmVyeXZlcnl2ZXJ5dmVyeXZlcnl2ZXJ5dmVyeXZlcnl2ZXI=?= - =?UTF-8?B?eXZlcnl2ZXJ5dmVyeXZlcnlsb25nIG5hbWU=?= +Bcc: veryveryveryveryveryveryveryveryveryveryveryveryveryveryveryveryveryveryveryveryveryveryveryverylong name Message-ID: <%a%@%a%> Content-Type: text/plain; charset=UTF-8 diff --git a/tests/Nette/Mail/Mail.subject.phpt b/tests/Nette/Mail/Mail.subject.phpt index 0ff6205d6d..89780a80cd 100644 --- a/tests/Nette/Mail/Mail.subject.phpt +++ b/tests/Nette/Mail/Mail.subject.phpt @@ -36,9 +36,7 @@ $mailer->send($mail); Assert::match( 'MIME-Version: 1.0 X-Mailer: Nette Framework Date: %a% -Subject: =?UTF-8?B?dmVyeXZlcnl2ZXJ5dmVyeXZlcnl2ZXJ5dmVyeXZlcnl2ZXI=?= - =?UTF-8?B?eXZlcnl2ZXJ5dmVyeXZlcnl2ZXJ5dmVyeXZlcnl2ZXJ5dmVyeXZlcnk=?= - =?UTF-8?B?dmVyeXZlcnl2ZXJ5dmVyeXZlcnlsb25nZW1haWw=?= +Subject: veryveryveryveryveryveryveryveryveryveryveryveryveryveryveryveryveryveryveryveryveryveryveryverylongemail Message-ID: <%S%@%S%> Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 7bit