Improved comments for IMAP RFC's

This commit is contained in:
the-djmaze 2022-01-12 15:06:33 +01:00
parent c7f80d617e
commit d42f54ad58
9 changed files with 84 additions and 23 deletions

View file

@ -32,7 +32,7 @@ abstract class DateTimeHelper
/** /**
* Parse date string formated as "Thu, 10 Jun 2010 08:58:33 -0700 (PDT)" * Parse date string formated as "Thu, 10 Jun 2010 08:58:33 -0700 (PDT)"
* RFC2822 * RFC 2822
*/ */
public static function ParseRFC2822DateString(string $sDateTime) : int public static function ParseRFC2822DateString(string $sDateTime) : int
{ {

View file

@ -31,8 +31,10 @@ trait Folders
*/ */
public function FolderCreate(string $sFolderName) : self public function FolderCreate(string $sFolderName) : self
{ {
$this->SendRequestGetResponse('CREATE', $this->SendRequestGetResponse('CREATE', array(
array($this->EscapeFolderName($sFolderName))); $this->EscapeFolderName($sFolderName)
// , ['(USE (\Drafts \Sent))'] RFC 6154
));
return $this; return $this;
} }
@ -163,13 +165,15 @@ trait Folders
* @throws \MailSo\Net\Exceptions\Exception * @throws \MailSo\Net\Exceptions\Exception
* @throws \MailSo\Imap\Exceptions\Exception * @throws \MailSo\Imap\Exceptions\Exception
*/ */
public function FolderClose() : self public function FolderClose() : int
{ {
if ($this->IsSelected()) { if ($this->IsSelected()) {
$this->SendRequestGetResponse('CLOSE'); $this->SendRequestGetResponse('CLOSE');
$this->oCurrentFolderInfo = null; $this->oCurrentFolderInfo = null;
// https://datatracker.ietf.org/doc/html/rfc5162#section-3.4
// return HIGHESTMODSEQ ?
} }
return $this; return 0;
} }
/** /**
@ -204,7 +208,7 @@ trait Folders
* @throws \MailSo\Net\Exceptions\Exception * @throws \MailSo\Net\Exceptions\Exception
* @throws \MailSo\Imap\Exceptions\Exception * @throws \MailSo\Imap\Exceptions\Exception
*/ */
public function FolderExpunge(SequenceSet $oUidRange = null) : self public function FolderExpunge(SequenceSet $oUidRange = null) : void
{ {
$sCmd = 'EXPUNGE'; $sCmd = 'EXPUNGE';
$aArguments = array(); $aArguments = array();
@ -214,8 +218,11 @@ trait Folders
$aArguments = array((string) $oUidRange); $aArguments = array((string) $oUidRange);
} }
// https://datatracker.ietf.org/doc/html/rfc5162#section-3.5
// Before returning an OK to the client, those messages that are removed
// are reported using a VANISHED response or EXPUNGE responses.
$this->SendRequestGetResponse($sCmd, $aArguments); $this->SendRequestGetResponse($sCmd, $aArguments);
return $this;
} }
/** /**
@ -274,10 +281,24 @@ trait Folders
} }
$aSelectParams = array(); $aSelectParams = array();
/* /*
// RFC 5162
if ($this->IsSupported('QRESYNC')) {
$this->Enable(['QRESYNC', 'CONDSTORE']);
- the last known UIDVALIDITY,
- the last known modification sequence,
- the optional set of known UIDs,
- and an optional parenthesized list of known sequence ranges and their corresponding UIDs.
QRESYNC (UIDVALIDITY HIGHESTMODSEQ 41,43:211,214:541)
QRESYNC (67890007 20050715194045000 41,43:211,214:541)
}
// RFC 4551
if ($this->IsSupported('CONDSTORE')) { if ($this->IsSupported('CONDSTORE')) {
$aSelectParams[] = 'CONDSTORE'; $aSelectParams[] = 'CONDSTORE';
} }
// RFC 5738 // RFC 5738
if ($this->UTF8) { if ($this->UTF8) {
$aSelectParams[] = 'UTF8'; $aSelectParams[] = 'UTF8';

View file

@ -88,6 +88,8 @@ trait Messages
* $aParams[] = (CHANGEDSINCE $modsequence) * $aParams[] = (CHANGEDSINCE $modsequence)
* https://datatracker.ietf.org/doc/html/rfc4551#section-3.3.2 * https://datatracker.ietf.org/doc/html/rfc4551#section-3.3.2
* $aParams[1][] = MODSEQ * $aParams[1][] = MODSEQ
* https://datatracker.ietf.org/doc/html/rfc5162#section-3.2
* $bIndexIsUid && $aParams[] = (CHANGEDSINCE $modsequence VANISHED)
*/ */
$this->SendRequest($bIndexIsUid ? 'UID FETCH' : 'FETCH', $aParams); $this->SendRequest($bIndexIsUid ? 'UID FETCH' : 'FETCH', $aParams);
@ -150,6 +152,11 @@ trait Messages
return $iUid; return $iUid;
} }
/**
* RFC 3502 MULTIAPPEND
public function MessageAppendStreams(string $sFolderName, $rMessageAppendStream, int $iStreamSize, array $aAppendFlags = null, int &$iUid = null, int $iDateTime = 0) : ?int
*/
/** /**
* @throws \MailSo\Base\Exceptions\InvalidArgumentException * @throws \MailSo\Base\Exceptions\InvalidArgumentException
* @throws \MailSo\Net\Exceptions\Exception * @throws \MailSo\Net\Exceptions\Exception

View file

@ -28,7 +28,7 @@ enum FolderACL: string {
abstract class FolderACL abstract class FolderACL
{ {
const const
/** rfc2086 */ /** RFC 2086 */
// perform SETACL/DELETEACL/GETACL/LISTRIGHTS // perform SETACL/DELETEACL/GETACL/LISTRIGHTS
ADMINISTER = 'a', ADMINISTER = 'a',
// mailbox is visible to LIST/LSUB commands, SUBSCRIBE mailbox // mailbox is visible to LIST/LSUB commands, SUBSCRIBE mailbox
@ -47,7 +47,7 @@ abstract class FolderACL
// CREATE_OLD = 'c', // CREATE_OLD = 'c',
// STORE DELETED flag, perform EXPUNGE // STORE DELETED flag, perform EXPUNGE
// DELETED_OLD = 'd', // DELETED_OLD = 'd',
/** rfc4314 */ /** RFC 4314 */
// CREATE new sub-mailboxes in any implementation-defined hierarchy, parent mailbox for the new mailbox name in RENAME // CREATE new sub-mailboxes in any implementation-defined hierarchy, parent mailbox for the new mailbox name in RENAME
CREATE = 'k', CREATE = 'k',
// DELETE mailbox, old mailbox name in RENAME // DELETE mailbox, old mailbox name in RENAME

View file

@ -18,16 +18,16 @@ namespace MailSo\Imap\Enumerations;
*/ */
abstract class FolderResponseStatus abstract class FolderResponseStatus
{ {
// rfc3501 // RFC 3501
const MESSAGES = 'MESSAGES'; const MESSAGES = 'MESSAGES';
// const RECENT = 'RECENT'; // IMAP4rev2 deprecated // const RECENT = 'RECENT'; // IMAP4rev2 deprecated
const UIDNEXT = 'UIDNEXT'; const UIDNEXT = 'UIDNEXT';
const UIDVALIDITY = 'UIDVALIDITY'; const UIDVALIDITY = 'UIDVALIDITY';
const UNSEEN = 'UNSEEN'; const UNSEEN = 'UNSEEN';
// rfc4551 // RFC 4551
const HIGHESTMODSEQ = 'HIGHESTMODSEQ'; const HIGHESTMODSEQ = 'HIGHESTMODSEQ';
// rfc7889 // RFC 7889
const APPENDLIMIT = 'APPENDLIMIT'; const APPENDLIMIT = 'APPENDLIMIT';
// rfc8474 // RFC 8474
const MAILBOXID = 'MAILBOXID'; const MAILBOXID = 'MAILBOXID';
} }

View file

@ -18,16 +18,16 @@ namespace MailSo\Imap\Enumerations;
*/ */
abstract class FolderStatus abstract class FolderStatus
{ {
// rfc3501 // RFC 3501
const MESSAGES = 'MESSAGES'; const MESSAGES = 'MESSAGES';
// const RECENT = 'RECENT'; // IMAP4rev2 deprecated // const RECENT = 'RECENT'; // IMAP4rev2 deprecated
const UIDNEXT = 'UIDNEXT'; const UIDNEXT = 'UIDNEXT';
const UIDVALIDITY = 'UIDVALIDITY'; const UIDVALIDITY = 'UIDVALIDITY';
const UNSEEN = 'UNSEEN'; const UNSEEN = 'UNSEEN';
// rfc4551 // RFC 4551
const HIGHESTMODSEQ = 'HIGHESTMODSEQ'; const HIGHESTMODSEQ = 'HIGHESTMODSEQ';
// rfc7889 // RFC 7889
const APPENDLIMIT = 'APPENDLIMIT'; const APPENDLIMIT = 'APPENDLIMIT';
// rfc8474 // RFC 8474
const MAILBOXID = 'MAILBOXID'; const MAILBOXID = 'MAILBOXID';
} }

View file

@ -234,13 +234,13 @@ class ImapClient extends \MailSo\Net\NetClient
/* /*
// TODO: RFC 9051 // TODO: RFC 9051
if ($this->IsSupported('IMAP4rev2')) { if ($this->IsSupported('IMAP4rev2')) {
$this->SendRequestGetResponse('ENABLE', array('IMAP4rev1')); $this->Enable('IMAP4rev1');
} }
*/ */
// RFC 6855 || RFC 5738 // RFC 6855 || RFC 5738
$this->UTF8 = $this->IsSupported('UTF8=ONLY') || $this->IsSupported('UTF8=ACCEPT'); $this->UTF8 = $this->IsSupported('UTF8=ONLY') || $this->IsSupported('UTF8=ACCEPT');
if ($this->UTF8) { if ($this->UTF8) {
$this->SendRequestGetResponse('ENABLE', array('UTF8=ACCEPT')); $this->Enable('ENABLE', 'UTF8=ACCEPT');
} }
} }
catch (Exceptions\NegativeResponseException $oException) catch (Exceptions\NegativeResponseException $oException)
@ -310,6 +310,19 @@ class ImapClient extends \MailSo\Net\NetClient
return $sExtentionName && \in_array(\strtoupper($sExtentionName), $this->Capability() ?: []); return $sExtentionName && \in_array(\strtoupper($sExtentionName), $this->Capability() ?: []);
} }
/**
* RFC 5161
*/
public function Enable(/*string|array*/ $mCapabilityNames) : void
{
if (\is_string($mCapabilityNames)) {
$mCapabilityNames = [$mCapabilityNames];
}
if (\is_array($mCapabilityNames)) {
$this->SendRequestGetResponse('ENABLE', $mCapabilityNames);
}
}
/** /**
* @throws \MailSo\Net\Exceptions\Exception * @throws \MailSo\Net\Exceptions\Exception
* @throws \MailSo\Imap\Exceptions\Exception * @throws \MailSo\Imap\Exceptions\Exception
@ -637,6 +650,26 @@ class ImapClient extends \MailSo\Net\NetClient
return 'UNKNOWN'; return 'UNKNOWN';
} }
/**
* RFC 4978
* It is RECOMMENDED that the client uses TLS compression.
*//*
public function Compress() : bool
{
try {
if ($this->IsSupported('COMPRESS=DEFLATE')) {
$this->SendRequestGetResponse('COMPRESS', ['DEFLATE']);
\stream_filter_append($this->ConnectionResource(), 'zlib.inflate');
\stream_filter_append($this->ConnectionResource(), 'zlib.deflate', STREAM_FILTER_WRITE, array(
'level' => 6, 'window' => 15, 'memory' => 9
));
return true;
}
} catch (\Throwable $e) {
}
return false;
}*/
public function EscapeFolderName(string $sFolderName) : string public function EscapeFolderName(string $sFolderName) : string
{ {
return $this->EscapeString($this->UTF8 ? $sFolderName : \MailSo\Base\Utils::Utf8ToUtf7Modified($sFolderName)); return $this->EscapeString($this->UTF8 ? $sFolderName : \MailSo\Base\Utils::Utf8ToUtf7Modified($sFolderName));

View file

@ -30,7 +30,7 @@ class SORT extends Request
$bUid = true, $bUid = true,
$aSortTypes = [], $aSortTypes = [],
$sLimit = '', $sLimit = '',
// rfc5267 // RFC 5267
$aReturn = [ $aReturn = [
/** /**
ALL ALL

View file

@ -63,7 +63,7 @@ trait Status
$UNSEEN, $UNSEEN,
/** /**
* RFC4551 * RFC 4551
* The highest mod-sequence value of all messages in the mailbox. * The highest mod-sequence value of all messages in the mailbox.
* This response also occurs as a result of a SELECT or EXAMINE command. * This response also occurs as a result of a SELECT or EXAMINE command.
* @var int 1*DIGIT Positive unsigned 64-bit integer * @var int 1*DIGIT Positive unsigned 64-bit integer
@ -71,14 +71,14 @@ trait Status
$HIGHESTMODSEQ, $HIGHESTMODSEQ,
/** /**
* RFC7889 * RFC 7889
* Message upload size limit. * Message upload size limit.
* @var int * @var int
*/ */
$APPENDLIMIT, $APPENDLIMIT,
/** /**
* RFC8474 * RFC 8474
* A server-allocated unique identifier for the mailbox. * A server-allocated unique identifier for the mailbox.
* This response also occurs as a result of a CREATE, SELECT or EXAMINE command. * This response also occurs as a result of a CREATE, SELECT or EXAMINE command.
* @var string * @var string