mirror of
https://github.com/the-djmaze/snappymail.git
synced 2026-09-07 00:17:03 +03:00
Improved comments for IMAP RFC's
This commit is contained in:
parent
c7f80d617e
commit
d42f54ad58
9 changed files with 84 additions and 23 deletions
|
|
@ -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
|
||||||
{
|
{
|
||||||
|
|
|
||||||
|
|
@ -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';
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
|
|
|
||||||
|
|
@ -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';
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -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';
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -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));
|
||||||
|
|
|
||||||
|
|
@ -30,7 +30,7 @@ class SORT extends Request
|
||||||
$bUid = true,
|
$bUid = true,
|
||||||
$aSortTypes = [],
|
$aSortTypes = [],
|
||||||
$sLimit = '',
|
$sLimit = '',
|
||||||
// rfc5267
|
// RFC 5267
|
||||||
$aReturn = [
|
$aReturn = [
|
||||||
/**
|
/**
|
||||||
ALL
|
ALL
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue