Support IMAP RFC 3516 BINARY

This commit is contained in:
the-djmaze 2022-01-13 15:40:58 +01:00
parent 464e766fcc
commit 33967c2319
2 changed files with 17 additions and 3 deletions

View file

@ -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;
}

View file

@ -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)