mirror of
https://github.com/the-djmaze/snappymail.git
synced 2026-09-08 00:47:04 +03:00
Improved IMAP FetchType handling
This commit is contained in:
parent
ab6b9bb412
commit
d691e3c327
3 changed files with 41 additions and 63 deletions
|
|
@ -39,27 +39,15 @@ abstract class FetchType
|
||||||
const BINARY = 'BINARY';
|
const BINARY = 'BINARY';
|
||||||
const BINARY_PEEK = 'BINARY.PEEK';
|
const BINARY_PEEK = 'BINARY.PEEK';
|
||||||
const BINARY_SIZE = 'BINARY.SIZE';
|
const BINARY_SIZE = 'BINARY.SIZE';
|
||||||
|
// RFC 4551
|
||||||
private static function addHelper(array &$aReturn, $mType)
|
const MODSEQ = 'MODSEQ';
|
||||||
{
|
|
||||||
if (\is_string($mType))
|
|
||||||
{
|
|
||||||
$aReturn[$mType] = '';
|
|
||||||
}
|
|
||||||
else if (\is_array($mType) && 2 === \count($mType) && \is_string($mType[0]) &&
|
|
||||||
\is_callable($mType[1]))
|
|
||||||
{
|
|
||||||
$aReturn[$mType[0]] = $mType[1];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public static function BuildBodyCustomHeaderRequest(array $aHeaders, bool $bPeek = true) : string
|
public static function BuildBodyCustomHeaderRequest(array $aHeaders, bool $bPeek = true) : string
|
||||||
{
|
{
|
||||||
$sResult = '';
|
$sResult = '';
|
||||||
if (\count($aHeaders))
|
if (\count($aHeaders))
|
||||||
{
|
{
|
||||||
$aHeaders = \array_map('trim', $aHeaders);
|
$aHeaders = \array_map('strtoupper', \array_map('trim', $aHeaders));
|
||||||
$aHeaders = \array_map('strtoupper', $aHeaders);
|
|
||||||
|
|
||||||
$sResult = $bPeek ? self::BODY_PEEK : self::BODY;
|
$sResult = $bPeek ? self::BODY_PEEK : self::BODY;
|
||||||
$sResult .= '[HEADER.FIELDS ('.\implode(' ', $aHeaders).')]';
|
$sResult .= '[HEADER.FIELDS ('.\implode(' ', $aHeaders).')]';
|
||||||
|
|
@ -67,45 +55,4 @@ abstract class FetchType
|
||||||
|
|
||||||
return $sResult;
|
return $sResult;
|
||||||
}
|
}
|
||||||
|
|
||||||
public static function ChangeFetchItemsBefourRequest(array $aFetchItems) : array
|
|
||||||
{
|
|
||||||
$aReturn = array();
|
|
||||||
self::addHelper($aReturn, self::UID);
|
|
||||||
self::addHelper($aReturn, self::RFC822_SIZE);
|
|
||||||
|
|
||||||
foreach ($aFetchItems as $mFetchKey)
|
|
||||||
{
|
|
||||||
switch ($mFetchKey)
|
|
||||||
{
|
|
||||||
default:
|
|
||||||
if (is_string($mFetchKey) || is_array($mFetchKey))
|
|
||||||
{
|
|
||||||
self::addHelper($aReturn, $mFetchKey);
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case self::INDEX:
|
|
||||||
case self::UID:
|
|
||||||
case self::RFC822_SIZE:
|
|
||||||
break;
|
|
||||||
case self::ALL:
|
|
||||||
self::addHelper($aReturn, self::FLAGS);
|
|
||||||
self::addHelper($aReturn, self::INTERNALDATE);
|
|
||||||
self::addHelper($aReturn, self::ENVELOPE);
|
|
||||||
break;
|
|
||||||
case self::FAST:
|
|
||||||
self::addHelper($aReturn, self::FLAGS);
|
|
||||||
self::addHelper($aReturn, self::INTERNALDATE);
|
|
||||||
break;
|
|
||||||
case self::FULL:
|
|
||||||
self::addHelper($aReturn, self::FLAGS);
|
|
||||||
self::addHelper($aReturn, self::INTERNALDATE);
|
|
||||||
self::addHelper($aReturn, self::ENVELOPE);
|
|
||||||
self::addHelper($aReturn, self::BODY);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return $aReturn;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -11,6 +11,8 @@
|
||||||
|
|
||||||
namespace MailSo\Imap;
|
namespace MailSo\Imap;
|
||||||
|
|
||||||
|
use MailSo\Imap\Enumerations\FetchType;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @category MailSo
|
* @category MailSo
|
||||||
* @package Imap
|
* @package Imap
|
||||||
|
|
@ -862,16 +864,45 @@ class ImapClient extends \MailSo\Net\NetClient
|
||||||
$aReturn = array();
|
$aReturn = array();
|
||||||
$this->aFetchCallbacks = array();
|
$this->aFetchCallbacks = array();
|
||||||
try {
|
try {
|
||||||
$aFetchItems = Enumerations\FetchType::ChangeFetchItemsBefourRequest($aInputFetchItems);
|
$aFetchItems = array(
|
||||||
foreach ($aFetchItems as $sName => $mItem)
|
FetchType::UID,
|
||||||
|
FetchType::RFC822_SIZE
|
||||||
|
);
|
||||||
|
foreach ($aInputFetchItems as $mFetchKey)
|
||||||
{
|
{
|
||||||
if (\strlen($sName) && '' !== $mItem)
|
switch ($mFetchKey)
|
||||||
{
|
{
|
||||||
$this->aFetchCallbacks[$sName] = $mItem;
|
case FetchType::INDEX:
|
||||||
|
case FetchType::UID:
|
||||||
|
case FetchType::RFC822_SIZE:
|
||||||
|
// Already defined by default
|
||||||
|
break;
|
||||||
|
|
||||||
|
case FetchType::FULL:
|
||||||
|
$aFetchItems[] = FetchType::BODY;
|
||||||
|
// Falls through
|
||||||
|
case FetchType::ALL:
|
||||||
|
$aFetchItems[] = FetchType::ENVELOPE;
|
||||||
|
// Falls through
|
||||||
|
case FetchType::FAST:
|
||||||
|
$aFetchItems[] = FetchType::FLAGS;
|
||||||
|
$aFetchItems[] = FetchType::INTERNALDATE;
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
if (\is_string($mFetchKey)) {
|
||||||
|
$aFetchItems[] = $mFetchKey;
|
||||||
|
} else if (\is_array($mFetchKey) && 2 === \count($mFetchKey)
|
||||||
|
&& \is_string($mFetchKey[0]) && \is_callable($mFetchKey[1]))
|
||||||
|
{
|
||||||
|
$this->aFetchCallbacks[$mFetchKey[0]] = $mFetchKey[1];
|
||||||
|
}
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
$aParams = array($sIndexRange, \array_keys($aFetchItems));
|
$aParams = array($sIndexRange, $aFetchItems);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* TODO:
|
* TODO:
|
||||||
* https://datatracker.ietf.org/doc/html/rfc4551#section-3.3.1
|
* https://datatracker.ietf.org/doc/html/rfc4551#section-3.3.1
|
||||||
|
|
@ -887,7 +918,7 @@ class ImapClient extends \MailSo\Net\NetClient
|
||||||
if (FetchResponse::hasUidAndSize($oResponse)) {
|
if (FetchResponse::hasUidAndSize($oResponse)) {
|
||||||
$aReturn[] = new FetchResponse($oResponse);
|
$aReturn[] = new FetchResponse($oResponse);
|
||||||
} else if ($this->oLogger) {
|
} else if ($this->oLogger) {
|
||||||
$this->oLogger->Write('Skipped Imap Response! ['.$oResponse->ToLine().']', \MailSo\Log\Enumerations\Type::NOTICE);
|
$this->oLogger->Write('Skipped Imap Response! ['.$oResponse.']', \MailSo\Log\Enumerations\Type::NOTICE);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -83,7 +83,7 @@ class Response
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public function ToLine() : string
|
public function __toString()
|
||||||
{
|
{
|
||||||
return $this->recToLine($this->ResponseList);
|
return $this->recToLine($this->ResponseList);
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue