diff options
Diffstat (limited to 'program/lib/imap.inc')
-rw-r--r-- | program/lib/imap.inc | 22 |
1 files changed, 18 insertions, 4 deletions
diff --git a/program/lib/imap.inc b/program/lib/imap.inc index 302cfc007..056632209 100644 --- a/program/lib/imap.inc +++ b/program/lib/imap.inc @@ -2508,7 +2508,8 @@ function iil_C_HandlePartBody(&$conn, $mailbox, $id, $part='', $mode=1, $file=NU $len = $to - $from; $sizeStr = substr($line, $from, $len); $bytes = (int)$sizeStr; - + $prev = ''; + while ($bytes > 0) { $line = iil_ReadLine($fp, 1024); $len = strlen($line); @@ -2518,14 +2519,27 @@ function iil_C_HandlePartBody(&$conn, $mailbox, $id, $part='', $mode=1, $file=NU } $bytes -= strlen($line); + $line = rtrim($line, "\t\r\n\0\x0B"); + if ($mode == 1) { if ($file) - fwrite($file, rtrim($line, "\t\r\n\0\x0B") . "\n"); + fwrite($file, $line . "\n"); else - $result .= rtrim($line, "\t\r\n\0\x0B") . "\n"; + $result .= $line . "\n"; } else if ($mode == 2) { - echo rtrim($line, "\t\r\n\0\x0B") . "\n"; + echo $line . "\n"; } else if ($mode == 3) { + // create chunks with proper length for base64 decoding + $line = $prev.$line; + $length = strlen($line); + if ($length % 4) { + $length = floor($length / 4) * 4; + $prev = substr($line, $length); + $line = substr($line, 0, $length); + } + else + $prev = ''; + if ($file) fwrite($file, base64_decode($line)); else |