Skip to content

Commit

Permalink
Mail\MimePart::encodeHeader() - do not use base64 encoding for long h…
Browse files Browse the repository at this point in the history
…eaders [Closes nette/mail#4] partially
  • Loading branch information
dg committed Aug 25, 2014
1 parent 9745bcc commit bfbd9a1
Show file tree
Hide file tree
Showing 3 changed files with 20 additions and 22 deletions.
34 changes: 18 additions & 16 deletions Nette/Mail/MimePart.php
Expand Up @@ -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));
}
}

Expand Down Expand Up @@ -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',
Expand All @@ -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;
}

}
4 changes: 1 addition & 3 deletions tests/Nette/Mail/Mail.email.long.phpt
Expand Up @@ -31,9 +31,7 @@ Date: %a%
To: veryveryveryveryveryveryveryveryveryveryveryveryveryveryveryveryveryveryveryveryveryveryveryverylongemail@example.com
Cc: John Doe
<veryveryveryveryveryveryveryveryveryveryveryveryveryveryveryveryveryveryveryveryveryveryveryverylongemail@example.com>
Bcc: =?UTF-8?B?dmVyeXZlcnl2ZXJ5dmVyeXZlcnl2ZXJ5dmVyeXZlcnl2ZXJ5dmU=?=
=?UTF-8?B?cnl2ZXJ5dmVyeXZlcnl2ZXJ5dmVyeXZlcnl2ZXJ5dmVyeXZlcnl2ZXI=?=
=?UTF-8?B?eXZlcnl2ZXJ5dmVyeXZlcnlsb25nIG5hbWU=?=
Bcc: veryveryveryveryveryveryveryveryveryveryveryveryveryveryveryveryveryveryveryveryveryveryveryverylong name
<veryveryveryveryveryveryveryveryveryveryveryveryveryveryveryveryveryveryveryveryveryveryveryverylongemail@example.com>
Message-ID: <%a%@%a%>
Content-Type: text/plain; charset=UTF-8
Expand Down
4 changes: 1 addition & 3 deletions tests/Nette/Mail/Mail.subject.phpt
Expand Up @@ -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
Expand Down

0 comments on commit bfbd9a1

Please sign in to comment.