diff options
Diffstat (limited to 'program/include')
-rw-r--r-- | program/include/rcube_imap_generic.php | 29 |
1 files changed, 20 insertions, 9 deletions
diff --git a/program/include/rcube_imap_generic.php b/program/include/rcube_imap_generic.php index a25413c11..bcfaa812e 100644 --- a/program/include/rcube_imap_generic.php +++ b/program/include/rcube_imap_generic.php @@ -2300,12 +2300,11 @@ class rcube_imap_generic $result = false; $parts = (array) $parts; $key = $this->nextTag(); - $peeks = ''; - $idx = 0; + $peeks = array(); $type = $mime ? 'MIME' : 'HEADER'; // format request - foreach($parts as $part) { + foreach ($parts as $part) { $peeks[] = "BODY.PEEK[$part.$type]"; } @@ -2319,13 +2318,25 @@ class rcube_imap_generic do { $line = $this->readLine(1024); - $line = $this->multLine($line); - if (preg_match('/BODY\[([0-9\.]+)\.'.$type.'\]/', $line, $matches)) { - $idx = $matches[1]; - $result[$idx] = preg_replace('/^(\* [0-9]+ FETCH \()?\s*BODY\['.$idx.'\.'.$type.'\]\s+/', '', $line); - $result[$idx] = trim($result[$idx], '"'); - $result[$idx] = rtrim($result[$idx], "\t\r\n\0\x0B"); + if (preg_match('/^\* [0-9]+ FETCH [0-9UID( ]+BODY\[([0-9\.]+)\.'.$type.'\]/', $line, $matches)) { + $idx = $matches[1]; + $headers = ''; + + // get complete entry + if (preg_match('/\{([0-9]+)\}\r\n$/', $line, $m)) { + $bytes = $m[1]; + $out = ''; + + while (strlen($out) < $bytes) { + $out = $this->readBytes($bytes); + if ($out === null) + break; + $headers .= $out; + } + } + + $result[$idx] = trim($headers); } } while (!$this->startsWith($line, $key, true)); |