diff --git a/snappymail/v/0.0.0/app/libraries/MailSo/Imap/Traits/ResponseParser.php b/snappymail/v/0.0.0/app/libraries/MailSo/Imap/Traits/ResponseParser.php index 1811af0d8..f28be8dc0 100644 --- a/snappymail/v/0.0.0/app/libraries/MailSo/Imap/Traits/ResponseParser.php +++ b/snappymail/v/0.0.0/app/libraries/MailSo/Imap/Traits/ResponseParser.php @@ -164,6 +164,10 @@ trait ResponseParser unset($mResult); continue 2; + case '~': // literal8 + if ('{' !== $this->sResponseBuffer[++$iPos]) { + break; + } case '{': $iLength = \strspn($this->sResponseBuffer, '0123456789', $iPos + 1); if ($iLength && "}\r\n" === \substr($this->sResponseBuffer, $iPos + 1 + $iLength, 3)) { @@ -383,13 +387,14 @@ trait ResponseParser $sLiteralAtomUpperCasePeek = ''; if (0 === \strpos($sLiteralAtomUpperCase, 'BODY')) { $sLiteralAtomUpperCasePeek = \str_replace('BODY', 'BODY.PEEK', $sLiteralAtomUpperCase); + } else if (0 === \strpos($sLiteralAtomUpperCase, 'BINARY')) { + $sLiteralAtomUpperCasePeek = \str_replace('BINARY', 'BINARY.PEEK', $sLiteralAtomUpperCase); } $sFetchKey = $sLiteralAtomUpperCase; if ($sLiteralAtomUpperCasePeek && isset($this->aFetchCallbacks[$sLiteralAtomUpperCasePeek])) { $sFetchKey = $sLiteralAtomUpperCasePeek; } - if (empty($this->aFetchCallbacks[$sFetchKey]) || !\is_callable($this->aFetchCallbacks[$sFetchKey])) { return false; } diff --git a/snappymail/v/0.0.0/app/libraries/MailSo/Mail/MailClient.php b/snappymail/v/0.0.0/app/libraries/MailSo/Mail/MailClient.php index 90f32a365..ebe9e11eb 100644 --- a/snappymail/v/0.0.0/app/libraries/MailSo/Mail/MailClient.php +++ b/snappymail/v/0.0.0/app/libraries/MailSo/Mail/MailClient.php @@ -208,6 +208,8 @@ class MailClient } /** + * Streams mime part to $mCallback + * * @param mixed $mCallback * * @throws \MailSo\Base\Exceptions\InvalidArgumentException @@ -226,8 +228,9 @@ class MailClient $sFileName = ''; $sContentType = ''; $sMailEncoding = ''; + $sPeek = FetchType::BODY_PEEK; - $sMimeIndex = trim($sMimeIndex); + $sMimeIndex = \trim($sMimeIndex); $aFetchResponse = $this->oImapClient->Fetch(array( \strlen($sMimeIndex) ? FetchType::BODY_PEEK.'['.$sMimeIndex.'.MIME]' @@ -257,6 +260,12 @@ class MailClient $oHeaders->ValueByName(MimeHeader::CONTENT_TRANSFER_ENCODING) ); + // RFC 3516 + if ($sMailEncoding && $this->oImapClient->IsSupported('BINARY')) { + $sMailEncoding = ''; + $sPeek = FetchType::BINARY_PEEK; + } + $sContentType = $oHeaders->ValueByName(MimeHeader::CONTENT_TYPE); } else @@ -271,7 +280,7 @@ class MailClient $aFetchResponse = $this->oImapClient->Fetch(array( // Push in the aFetchCallbacks array and then called by \MailSo\Imap\Traits\ResponseParser::partialResponseLiteralCallbackCallable array( - FetchType::BODY_PEEK.'['.$sMimeIndex.']', + $sPeek.'['.$sMimeIndex.']', function ($sParent, $sLiteralAtomUpperCase, $rImapLiteralStream) use ($mCallback, $sMimeIndex, $sMailEncoding, $sContentType, $sFileName) { if (\strlen($sLiteralAtomUpperCase) && \is_resource($rImapLiteralStream) && 'FETCH' === $sParent)