Skip to content

Instantly share code, notes, and snippets.

@nevans
Last active June 12, 2024 16:50
Show Gist options
  • Save nevans/8ef449da0786f9d1cc7c8324a288dd9b to your computer and use it in GitHub Desktop.
Save nevans/8ef449da0786f9d1cc7c8324a288dd9b to your computer and use it in GitHub Desktop.
IMAP Specifications

IMAP specifications

(TODO) All IANA registered IMAP capabilities, response codes, keywords, mailbox attributes, the most relevant SASL mechanisms, and other relevant specifications.

  • ⛔️: obsolete specifications that have been deprecated or replaced
  • ⏭️: extensions that have been completely or partially included in IMAP4rev2.
  • ✨: extensions that are recommended for IMAP4rev2 servers and clients. The IETF EXTRA WG decided that requiring them as a part of IMAP4rev2 would push the bar to implement too high for new implementations.
  • 🗑: extensions that have been completely or partially deprecated or removed in IMAP4rev2.
  • 🍋: extensions that are included in the "Lemonade" profile RFC5550. The Lemonade profile is not fully supported by the most common email servers nor by most email clients, but many of its included extensions are both widely deployed and very useful.
  • 🔑: related to authentication or authorization
Reference (year) Extension notes
RFC2060 (1997) ⛔️ IMAP4rev1 Replaced by RFC3501 (2003)
RFC2060 (1997) ⛔️ Resp Code: NEWNAME ⛔️ OBSOLETE (See RFC3501)
RFC2087 (1997) QUOTA Replaced by RFC9208 (2022)
RFC2088 (1997) ⛔️ LITERAL+ Replaced by RFC7888 (2016)
RFC2177 (1997) ⏭️🍋 IDLE
RFC2192 (1997) ⛔️ IMAP URL Scheme Replaced by RFC5092 (2007)
RFC2193 (1997) MAILBOX-REFERRALS
RFC2221 (1997) Resp Code: REFERRAL
RFC2221 (1997) 🔑 LOGIN-REFERRALS
RFC2342 (1998) ⏭️🍋 NAMESPACE
RFC2595 (1999) ⏭️🔑 LOGINDISABLED Included and required by RFC3501
RFC2595 (1999) ⏭️🔒 STARTTLS Included and required by RFC3501
RFC2971 (2000) ID
RFC3348 (2002) ⏭️ CHILDREN a subset of LIST-EXTENDED
RFC3501 (2003) ⏭️🗑 IMAP4rev1 Internet Message Access Protocol - VERSION 4rev1
RFC3501 (2003) ⏭️📬 Mbox Attr: \Marked 📬 Server has marked the mailbox as "interesting"
RFC3501 (2003) ⏭️📬 Mbox Attr: \NoInferiors 📬 No hierarchy under this name
RFC3501 (2003) ⏭️📬 Mbox Attr: \Noselect 📬 The mailbox is not selectable
RFC3501 (2003) ⏭️📬 Mbox Attr: \Unmarked 📬 No new messages since last select
RFC3501 (2003) ⏭️ Resp Code: ALERT
RFC3501 (2003) ⏭️ Resp Code: BADCHARSET
RFC3501 (2003) ⏭️ Resp Code: PARSE
RFC3501 (2003) ⏭️ Resp Code: PERMANENTFLAGS
RFC3501 (2003) ⏭️ Resp Code: READ-ONLY
RFC3501 (2003) ⏭️ Resp Code: READ-WRITE
RFC3501 (2003) ⏭️ Resp Code: TRYCREATE
RFC3501 (2003) ⏭️ Resp Code: UIDNEXT
RFC3501 (2003) ⏭️ Resp Code: UIDVALIDITY
RFC3501 (2003) 🗑 Resp Code: UNSEEN
RFC3501 (2003) ⏭️🔑 AUTH=* mechanisms are defined by SASL
RFC3501 (2003) 🗄️ IMAP Capabiliities Establishes IANA registry
RFC3501 (2003) 🗄️📬 Mailbox attributes Establishes IANA registry
RFC3501 Errata ⏭️ Updates to ABNF (charset, etc) 🌟 mostly included in RFC4466
RFC3502 (2003) MULTIAPPEND
RFC3503 (2003) ⏭️ Keyword: $MDNSent
RFC3516 (2003) ⏭️ Resp Code: UNKNOWN-CTE
RFC3516 (2003) ⏭️🍋 BINARY (rev2: FETCH part only)
RFC3691 (2004) ⏭️ UNSELECT
RFC4314 (2005) 🔑 ACL
RFC4314 (2005) 🔑 RIGHTS=
RFC4315 (2005) ⏭️ Resp Code: APPENDUID
RFC4315 (2005) ⏭️ Resp Code: COPYUID
RFC4315 (2005) ⏭️ Resp Code: UIDNOTSTICKY
RFC4315 (2005) ⏭️🍋 UIDPLUS
RFC4422 (2006) 🗄️🔑 SASL mechanisms Establishes IANA registry
RFC4466 (2006) ⏭️ 🌟 Collected ABNF extensions 🌟 Forward compatibility for parsing many extensions
RFC4467 (2006) Resp Code: URLMECH
RFC4467 (2006) 🔑🍋 URLAUTH
RFC4469 (2006) Resp Code: BADURL
RFC4469 (2006) Resp Code: TOOBIG
RFC4469 (2006) CATENATE Has errata which updates ABNF.
RFC4550 (2006) ⛔️ 🍋 The "Lemonade" Profile Replaced by RFC5550 (2009)
RFC4551 (2006) ⛔️🍋 Resp Code: HIGHESTMODSEQ Replaced by RFC7162 (2014)
RFC4551 (2006) ⛔️🍋 Resp Code: MODIFIED Replaced by RFC7162 (2014)
RFC4551 (2006) ⛔️🍋 Resp Code: NOMODSEQ Replaced by RFC7162 (2014)
RFC4551 (2006) ⛔️🍋 CONDSTORE Replaced by RFC7162 (2014)
RFC4616 (2006) ⏭️🔑 SASL: AUTH=PLAIN
RFC4731 (2006) ⏭️🍋 ESEARCH
RFC4959 (2007) ⏭️🔑 SASL-IR
RFC4978 (2007) 🍋 COMPRESS=DEFLATE 🌟 IMAP sessions can be significantly compressed.
RFC4978 (2007) 🍋 Resp Code: COMPRESSIONACTIVE
RFC5032 (2007) WITHIN
RFC5092 (2007) IMAP URL Scheme
RFC5161 (2008) ⏭️🍋 ENABLE
RFC5162 (2008) ⛔️🍋 Resp Code: CLOSED Replaced by RFC7162 (2014)
RFC5162 (2008) ⛔️🍋 QRESYNC Replaced by RFC7162 (2014)
RFC5182 (2008) Resp Code: NOTSAVED
RFC5182 (2008) ⏭️ SEARCHRES
RFC5255 (2008) Resp Code: BADCOMPARATOR
RFC5255 (2008) 🍋 I18NLEVEL=1
RFC5255 (2008) 🍋 I18NLEVEL=2
RFC5255 (2008) LANGUAGE
RFC5256 (2008) 🍋 SORT
RFC5256 (2008) THREAD
RFC5257 (2008) Resp Code: ANNOTATE
RFC5257 (2008) Resp Code: ANNOTATIONS
RFC5257 (2008) ANNOTATE-EXPERIMENT-1
RFC5258 (2008) ⏭️ LIST (RECURSIVEMATCH)
RFC5258 (2008) ⏭️ LIST (REMOTE)
RFC5258 (2008) ⏭️ LIST (SUBSCRIBED)
RFC5258 (2008) ⏭️ LIST RETURN (CHILDREN)
RFC5258 (2008) ⏭️ LIST RETURN (SUBSCRIBED)
RFC5258 (2008) ⏭️ LIST-EXTENDED resp CHILDINFO
RFC5258 (2008) 🗄️ LIST-EXTENDED registry Establishes IANA registry
RFC5258 (2008) ⏭️📬 Mbox Attr: \HasChildren 📬 Has accessible child mailboxes
RFC5258 (2008) ⏭️📬 Mbox Attr: \HasNoChildren 📬 Has no accessible child mailboxes
RFC5258 (2008) ⏭️📬 Mbox Attr: \NonExistent 📬 The mailbox name doesn't actually exist
RFC5258 (2008) ⏭️📬 Mbox Attr: \Remote 📬 The mailbox exists on a remote server
RFC5258 (2008) ⏭️📬 Mbox Attr: \Subscribed 📬 The mailbox is subscribed to
RFC5258 (2008) ⏭️ LIST-EXTENDED (rev2: everything except multiple mailbox patterns)
RFC5259 (2008) 🍋 Resp Code: MAXCONVERTMESSAGES
RFC5259 (2008) 🍋 Resp Code: MAXCONVERTPARTS
RFC5259 (2008) 🍋 Resp Code: TEMPFAIL
RFC5259 (2008) 🍋 CONVERT
RFC5267 (2008) 🍋 Resp Code: NOUPDATE
RFC5267 (2008) 🍋 CONTEXT=SEARCH
RFC5267 (2008) 🍋 CONTEXT=SORT
RFC5267 (2008) 🍋 ESORT
RFC5464 (2009) 🍋 Resp Code: METADATA
RFC5464 (2009) 🍋 METADATA-SERVER
RFC5464 (2009) 🍋 METADATA
RFC5465 (2009) 🍋 Resp Code: BADEVENT
RFC5465 (2009) 🍋 Resp Code: NOTIFICATIONOVERFLOW
RFC5465 (2009) 🍋 LIST-EXTENDED resp OLDNAME
RFC5465 (2009) 🍋 NOTIFY
RFC5466 (2009) 🍋 Resp Code: UNDEFINED-FILTER
RFC5466 (2009) 🍋 FILTERS
RFC5524 (2009) 🔑🍋 URLAUTH=BINARY
RFC5530 (2009) ⏭️ Resp Code: ALREADYEXISTS
RFC5530 (2009) ⏭️🔑 Resp Code: AUTHENTICATIONFAILED
RFC5530 (2009) ⏭️🔑 Resp Code: AUTHORIZATIONFAILED
RFC5530 (2009) ⏭️ Resp Code: CANNOT
RFC5530 (2009) ⏭️ Resp Code: CLIENTBUG
RFC5530 (2009) ⏭️ Resp Code: CONTACTADMIN
RFC5530 (2009) ⏭️ Resp Code: CORRUPTION
RFC5530 (2009) ⏭️ Resp Code: EXPIRED
RFC5530 (2009) ⏭️ Resp Code: EXPUNGEISSUED
RFC5530 (2009) ⏭️ Resp Code: INUSE
RFC5530 (2009) ⏭️ Resp Code: LIMIT
RFC5530 (2009) ⏭️ Resp Code: NONEXISTENT
RFC5530 (2009) ⏭️ Resp Code: NOPERM
RFC5530 (2009) ⏭️ Resp Code: OVERQUOTA
RFC5530 (2009) ⏭️ Resp Code: PRIVACYREQUIRED
RFC5530 (2009) ⏭️ Resp Code: SERVERBUG
RFC5530 (2009) ⏭️ Resp Code: UNAVAILABLE
RFC5530 (2009) 🗄️ Response codes registry Establishes an IANA registry
RFC5550 (2009) ⏭️🍋 Keyword: $Forwarded
RFC5550 (2009) 🍋 Keyword: $SubmitPending
RFC5550 (2009) 🍋 Keyword: $Submitted
RFC5550 (2009) 🍋 URL-PARTIAL
RFC5550 (2009) 🍋 🍋 The "Lemonade" Profile Profile "to Support Diverse Service Environments"
RFC5593 (2009) IMAP URL access identifier
RFC5598 (2009) ℹ️ Internet Mail Architecture ℹ️ Informational
RFC5738 (2010) ⛔️ LIST (UTF8) ⛔️ OBSOLETE (RFC6855 is silent on list extensions)
RFC5738 (2010) ⛔️ LIST (UTF8ONLY) ⛔️ OBSOLETE (RFC6855 is silent on list extensions)
RFC5738 (2010) ⛔️ LIST RETURN (UTF8) ⛔️ OBSOLETE (RFC6855 is silent on list extensions)
RFC5738 (2010) ⛔️ UTF8=ALL ⛔️ OBSOLETE (See RFC6855)
RFC5738 (2010) ⛔️ UTF8=APPEND ⛔️ OBSOLETE (See RFC6855)
RFC5738 (2010) ⛔️ UTF8=USER ⛔️ OBSOLETE (See RFC6855)
RFC5738 (2010) ⛔️ UTF8=ACCEPT Replaced by RFC6855 (2013)
RFC5738 (2010) ⛔️ UTF8=ONLY Replaced by RFC6855 (2013)
RFC5788 (2010) 🗄️ Keyword registry Establishes an IANA registry
RFC5802 (2010) ⏭️🔑 SASL: AUTH=SCRAM-* (rev2: SCRAM-SHA-256 replaces DIGEST-MD5)
RFC5819 (2010) LIST RETURN (STATUS)
RFC5819 (2010) ⏭️ LIST-STATUS
RFC5957 (2010) SORT=DISPLAY
RFC6154 (2011) ⏭️📬 Mbox Attr: \All 📬 All messages
RFC6154 (2011) ⏭️📬 Mbox Attr: \Archive 📬 Archived messages
RFC6154 (2011) ⏭️📬 Mbox Attr: \Drafts 📬 Messages that are working drafts
RFC6154 (2011) ⏭️📬 Mbox Attr: \Flagged 📬 Messages with the \Flagged flag
RFC6154 (2011) ⏭️📬 Mbox Attr: \Junk 📬 Messages identified as Spam/Junk
RFC6154 (2011) ⏭️📬 Mbox Attr: \Sent 📬 Sent mail
RFC6154 (2011) ⏭️📬 Mbox Attr: \Trash 📬 Messages the user has discarded
RFC6154 (2011) Resp Code: \USEATTR
RFC6154 (2011) CREATE-SPECIAL-USE
RFC6154 (2011) LIST (SPECIAL-USE)
RFC6154 (2011) LIST RETURN (SPECIAL-USE)
RFC6154 (2011) SPECIAL-USE (rev2: new mailbox attributes only)
RFC6186 (2011) DNS SRV Records for Email Updated by RFC8314, RFC8553
RFC6203 (2011) SEARCH=FUZZY
RFC6785 (2012) IMAPSIEVE=
RFC6851 (2013) ⏭️ MOVE
RFC6855 (2013) UTF8=ACCEPT (rev2: for backward compatibility with IMAP4rev1)
RFC6855 (2013) UTF8=ONLY (rev2: for backward compatibility with IMAP4rev1)
RFC6858 (2013) Resp Code: DOWNGRADED
RFC6858 (2013) Simplified Downgrading for I18n
RFC7162 (2014) Resp Code: HIGHESTMODSEQ
RFC7162 (2014) Resp Code: MODIFIED
RFC7162 (2014) Resp Code: NOMODSEQ
RFC7162 (2014) CONDSTORE
RFC7162 (2014) ⏭️ Resp Code: CLOSED
RFC7162 (2014) QRESYNC
RFC7377 (2014) MULTISEARCH
RFC7525 (2015) ⏭️💡 Recommendations for Secure TLS
RFC7628 (2015) 🔑 SASL: AUTH=OAUTHBEARER Replaces AUTH=XOAUTH2
RFC7817 (2016) ⏭️ TLS Identity Check Procedure
RFC7888 (2016) 🍋 LITERAL+
RFC7888 (2016) ⏭️ LITERAL-
RFC7889 (2016) APPENDLIMIT
RFC8314 (2018) ⏭️ Cleartext Obsolete: Use TLS
RFC8437 (2018) 🔑 UNAUTHENTICATE
RFC8438 (2018) STATUS=SIZE
RFC8440 (2018) 🔑 LIST RETURN (MYRIGHTS)
RFC8440 (2018) 🔑 LIST-MYRIGHTS
RFC8457 (2018) Keyword: $Important
RFC8457 (2018) 📬 Mbox Attr: \Important 📬 Messages deemed important to user
RFC8474 (2018) Resp Code: MAILBOXID
RFC8474 (2018) OBJECTID
RFC8508 (2019) REPLACE
RFC8514 (2019) SAVEDATE
RFC8553 (2019) 💡 DNS AttrLeaf Changes Fixing Specifications That Use Underscored Node Names
RFC8970 (2020) PREVIEW
RFC9051 (2021) 🎉 IMAP4rev2 Internet Message Access Protocol - VERSION 4rev2
RFC9051 (2021) Keyword: $Junk
RFC9051 (2021) Keyword: $NotJunk
RFC9051 (2021) Keyword: $Phishing
RFC9051 (2021) Resp code: HASCHILDREN
RFC9208 (2022) QUOTA
RFC9394 (2023) PARTIAL
MESSAGELIMIT (draft) 🚧 MESSAGELIMIT (DRAFT)
INPROGRESS (draft) 🚧 INPROGRESS (DRAFT)
INPROGRESS (draft) 🚧 Resp code: INPROGRESS (DRAFT)
UIDONLY (draft) 🚧 UIDONLY (DRAFT)
JMAPACCESS (draft) 🚧 JMAPACCESS (DRAFT)
SNOOZE (draft) 🚧📬 Mbox Attr: \Snoozed (DRAFT)
LIST-METADATA (draft) 🚧 LIST-METADATA (DRAFT)
LIST-METADATA (draft) 🚧 LIST-EXTENDED resp METADATA

IANA registries

Registry references
IMAP Capabilities RFC3501
IMAP Mailbox attributes RFC3501
SASL Mechanisms RFC4422
IMAP LIST EXTENDED RFC5258
IMAP Response codes RFC5530
IMAP Keywords RFC5788, RFC8621
vim: tw=250
; ############################################################################
; Crispin Standards Track [Page 81]
; RFC 3501 IMAPv4 March 2003
;
; 9. Formal Syntax
;
; The following syntax specification uses the Augmented Backus-Naur
; Form (ABNF) notation as specified in [ABNF].
;
; In the case of alternative or optional rules in which a later rule
; overlaps an earlier rule, the rule which is listed earlier MUST take
; priority. For example, "\Seen" when parsed as a flag is the \Seen
; flag name and not a flag-extension, even though "\Seen" can be parsed
; as a flag-extension. Some, but not all, instances of this rule are
; noted below.
;
; Note: [ABNF] rules MUST be followed strictly; in
; particular:
;
; (1) Except as noted otherwise, all alphabetic characters
; are case-insensitive. The use of upper or lower case
; characters to define token strings is for editorial clarity
; only. Implementations MUST accept these strings in a
; case-insensitive fashion.
;
; (2) In all cases, SP refers to exactly one space. It is
; NOT permitted to substitute TAB, insert additional spaces,
; or otherwise treat SP as being equivalent to LWSP.
;
; (3) The ASCII NUL character, %x00, MUST NOT be used at any
; time.
address = "(" addr-name SP addr-adl SP addr-mailbox SP
addr-host ")"
addr-adl = nstring
; Holds route from [RFC-2822] route-addr if
; non-NIL
addr-host = nstring
; NIL indicates [RFC-2822] group syntax.
; Otherwise, holds [RFC-2822] domain name
addr-mailbox = nstring
; NIL indicates end of [RFC-2822] group; if
; non-NIL and addr-host is NIL, holds
; [RFC-2822] group name.
; Otherwise, holds [RFC-2822] local-part
; after removing [RFC-2822] quoting
; Crispin Standards Track [Page 81]
; RFC 3501 IMAPv4 March 2003
addr-name = nstring
; If non-NIL, holds phrase from [RFC-2822]
; mailbox after removing [RFC-2822] quoting
append = "APPEND" SP mailbox [SP flag-list] [SP date-time] SP
literal
astring = 1*ASTRING-CHAR / string
ASTRING-CHAR = ATOM-CHAR / resp-specials
atom = 1*ATOM-CHAR
ATOM-CHAR = <any CHAR except atom-specials>
atom-specials = "(" / ")" / "{" / SP / CTL / list-wildcards /
quoted-specials / resp-specials
authenticate = "AUTHENTICATE" SP auth-type *(CRLF base64)
auth-type = atom
; Defined by [SASL]
base64 = *(4base64-char) [base64-terminal]
base64-char = ALPHA / DIGIT / "+" / "/"
; Case-sensitive
base64-terminal = (2base64-char "==") / (3base64-char "=")
body = "(" (body-type-1part / body-type-mpart) ")"
body-extension = nstring / number /
"(" body-extension *(SP body-extension) ")"
; Future expansion. Client implementations
; MUST accept body-extension fields. Server
; implementations MUST NOT generate
; body-extension fields except as defined by
; future standard or standards-track
; revisions of this specification.
body-ext-1part = body-fld-md5 [SP body-fld-dsp [SP body-fld-lang
[SP body-fld-loc *(SP body-extension)]]]
; MUST NOT be returned on non-extensible
; "BODY" fetch
; Crispin Standards Track [Page 82]
; RFC 3501 IMAPv4 March 2003
body-ext-mpart = body-fld-param [SP body-fld-dsp [SP body-fld-lang
[SP body-fld-loc *(SP body-extension)]]]
; MUST NOT be returned on non-extensible
; "BODY" fetch
body-fields = body-fld-param SP body-fld-id SP body-fld-desc SP
body-fld-enc SP body-fld-octets
body-fld-desc = nstring
body-fld-dsp = "(" string SP body-fld-param ")" / nil
body-fld-enc = (DQUOTE ("7BIT" / "8BIT" / "BINARY" / "BASE64"/
"QUOTED-PRINTABLE") DQUOTE) / string
body-fld-id = nstring
body-fld-lang = nstring / "(" string *(SP string) ")"
body-fld-loc = nstring
body-fld-lines = number
body-fld-md5 = nstring
body-fld-octets = number
body-fld-param = "(" string SP string *(SP string SP string) ")" / nil
body-type-1part = (body-type-basic / body-type-msg / body-type-text)
[SP body-ext-1part]
body-type-basic = media-basic SP body-fields
; MESSAGE subtype MUST NOT be "RFC822"
body-type-mpart = 1*body SP media-subtype
[SP body-ext-mpart]
body-type-msg = media-message SP body-fields SP envelope
SP body SP body-fld-lines
body-type-text = media-text SP body-fields SP body-fld-lines
capability = ("AUTH=" auth-type) / atom
; New capabilities MUST begin with "X" or be
; registered with IANA as standard or
; standards-track
; Crispin Standards Track [Page 83]
; RFC 3501 IMAPv4 March 2003
capability-data = "CAPABILITY" *(SP capability) SP "IMAP4rev1"
*(SP capability)
; Servers MUST implement the STARTTLS, AUTH=PLAIN,
; and LOGINDISABLED capabilities
; Servers which offer RFC 1730 compatibility MUST
; list "IMAP4" as the first capability.
CHAR8 = %x01-ff
; any OCTET except NUL, %x00
command = tag SP (command-any / command-auth / command-nonauth /
command-select) CRLF
; Modal based on state
command-any = "CAPABILITY" / "LOGOUT" / "NOOP" / x-command
; Valid in all states
command-auth = append / create / delete / examine / list / lsub /
rename / select / status / subscribe / unsubscribe
; Valid only in Authenticated or Selected state
command-nonauth = login / authenticate / "STARTTLS"
; Valid only when in Not Authenticated state
command-select = "CHECK" / "CLOSE" / "EXPUNGE" / copy / fetch / store /
uid / search
; Valid only when in Selected state
continue-req = "+" SP (resp-text / base64) CRLF
copy = "COPY" SP sequence-set SP mailbox
create = "CREATE" SP mailbox
; Use of INBOX gives a NO error
date = date-text / DQUOTE date-text DQUOTE
date-day = 1*2DIGIT
; Day of month
date-day-fixed = (SP DIGIT) / 2DIGIT
; Fixed-format version of date-day
date-month = "Jan" / "Feb" / "Mar" / "Apr" / "May" / "Jun" /
"Jul" / "Aug" / "Sep" / "Oct" / "Nov" / "Dec"
date-text = date-day "-" date-month "-" date-year
; Crispin Standards Track [Page 84]
; RFC 3501 IMAPv4 March 2003
date-year = 4DIGIT
date-time = DQUOTE date-day-fixed "-" date-month "-" date-year
SP time SP zone DQUOTE
delete = "DELETE" SP mailbox
; Use of INBOX gives a NO error
digit-nz = %x31-39
; 1-9
envelope = "(" env-date SP env-subject SP env-from SP
env-sender SP env-reply-to SP env-to SP env-cc SP
env-bcc SP env-in-reply-to SP env-message-id ")"
env-bcc = "(" 1*address ")" / nil
env-cc = "(" 1*address ")" / nil
env-date = nstring
env-from = "(" 1*address ")" / nil
env-in-reply-to = nstring
env-message-id = nstring
env-reply-to = "(" 1*address ")" / nil
env-sender = "(" 1*address ")" / nil
env-subject = nstring
env-to = "(" 1*address ")" / nil
examine = "EXAMINE" SP mailbox
fetch = "FETCH" SP sequence-set SP ("ALL" / "FULL" / "FAST" /
fetch-att / "(" fetch-att *(SP fetch-att) ")")
fetch-att = "ENVELOPE" / "FLAGS" / "INTERNALDATE" /
"RFC822" [".HEADER" / ".SIZE" / ".TEXT"] /
"BODY" ["STRUCTURE"] / "UID" /
"BODY" section ["<" number "." nz-number ">"] /
"BODY.PEEK" section ["<" number "." nz-number ">"]
; Crispin Standards Track [Page 85]
; RFC 3501 IMAPv4 March 2003
flag = "\Answered" / "\Flagged" / "\Deleted" /
"\Seen" / "\Draft" / flag-keyword / flag-extension
; Does not include "\Recent"
flag-extension = "\" atom
; Future expansion. Client implementations
; MUST accept flag-extension flags. Server
; implementations MUST NOT generate
; flag-extension flags except as defined by
; future standard or standards-track
; revisions of this specification.
flag-fetch = flag / "\Recent"
flag-keyword = atom
flag-list = "(" [flag *(SP flag)] ")"
flag-perm = flag / "\*"
greeting = "*" SP (resp-cond-auth / resp-cond-bye) CRLF
header-fld-name = astring
header-list = "(" header-fld-name *(SP header-fld-name) ")"
list = "LIST" SP mailbox SP list-mailbox
list-mailbox = 1*list-char / string
list-char = ATOM-CHAR / list-wildcards / resp-specials
list-wildcards = "%" / "*"
literal = "{" number "}" CRLF *CHAR8
; Number represents the number of CHAR8s
login = "LOGIN" SP userid SP password
lsub = "LSUB" SP mailbox SP list-mailbox
; Crispin Standards Track [Page 86]
; RFC 3501 IMAPv4 March 2003
mailbox = "INBOX" / astring
; INBOX is case-insensitive. All case variants of
; INBOX (e.g., "iNbOx") MUST be interpreted as INBOX
; not as an astring. An astring which consists of
; the case-insensitive sequence "I" "N" "B" "O" "X"
; is considered to be INBOX and not an astring.
; Refer to section 5.1 for further
; semantic details of mailbox names.
mailbox-data = "FLAGS" SP flag-list / "LIST" SP mailbox-list /
"LSUB" SP mailbox-list / "SEARCH" *(SP nz-number) /
"STATUS" SP mailbox SP "(" [status-att-list] ")" /
number SP "EXISTS" / number SP "RECENT"
mailbox-list = "(" [mbx-list-flags] ")" SP
(DQUOTE QUOTED-CHAR DQUOTE / nil) SP mailbox
mbx-list-flags = *(mbx-list-oflag SP) mbx-list-sflag
*(SP mbx-list-oflag) /
mbx-list-oflag *(SP mbx-list-oflag)
mbx-list-oflag = "\Noinferiors" / flag-extension
; Other flags; multiple possible per LIST response
mbx-list-sflag = "\Noselect" / "\Marked" / "\Unmarked"
; Selectability flags; only one per LIST response
media-basic = ((DQUOTE ("APPLICATION" / "AUDIO" / "IMAGE" /
"MESSAGE" / "VIDEO") DQUOTE) / string) SP
media-subtype
; Defined in [MIME-IMT]
media-message = DQUOTE "MESSAGE" DQUOTE SP DQUOTE "RFC822" DQUOTE
; Defined in [MIME-IMT]
media-subtype = string
; Defined in [MIME-IMT]
media-text = DQUOTE "TEXT" DQUOTE SP media-subtype
; Defined in [MIME-IMT]
message-data = nz-number SP ("EXPUNGE" / ("FETCH" SP msg-att))
msg-att = "(" (msg-att-dynamic / msg-att-static)
*(SP (msg-att-dynamic / msg-att-static)) ")"
msg-att-dynamic = "FLAGS" SP "(" [flag-fetch *(SP flag-fetch)] ")"
; MAY change for a message
; Crispin Standards Track [Page 87]
; RFC 3501 IMAPv4 March 2003
msg-att-static = "ENVELOPE" SP envelope / "INTERNALDATE" SP date-time /
"RFC822" [".HEADER" / ".TEXT"] SP nstring /
"RFC822.SIZE" SP number /
"BODY" ["STRUCTURE"] SP body /
"BODY" section ["<" number ">"] SP nstring /
"UID" SP uniqueid
; MUST NOT change for a message
nil = "NIL"
nstring = string / nil
number = 1*DIGIT
; Unsigned 32-bit integer
; (0 <= n < 4,294,967,296)
nz-number = digit-nz *DIGIT
; Non-zero unsigned 32-bit integer
; (0 < n < 4,294,967,296)
password = astring
quoted = DQUOTE *QUOTED-CHAR DQUOTE
QUOTED-CHAR = <any TEXT-CHAR except quoted-specials> /
"\" quoted-specials
quoted-specials = DQUOTE / "\"
rename = "RENAME" SP mailbox SP mailbox
; Use of INBOX as a destination gives a NO error
response = *(continue-req / response-data) response-done
response-data = "*" SP (resp-cond-state / resp-cond-bye /
mailbox-data / message-data / capability-data) CRLF
response-done = response-tagged / response-fatal
response-fatal = "*" SP resp-cond-bye CRLF
; Server closes connection immediately
response-tagged = tag SP resp-cond-state CRLF
resp-cond-auth = ("OK" / "PREAUTH") SP resp-text
; Authentication condition
; Crispin Standards Track [Page 88]
; RFC 3501 IMAPv4 March 2003
resp-cond-bye = "BYE" SP resp-text
resp-cond-state = ("OK" / "NO" / "BAD") SP resp-text
; Status condition
resp-specials = "]"
resp-text = ["[" resp-text-code "]" SP] text
resp-text-code = "ALERT" /
"BADCHARSET" [SP "(" astring *(SP astring) ")" ] /
capability-data / "PARSE" /
"PERMANENTFLAGS" SP "("
[flag-perm *(SP flag-perm)] ")" /
"READ-ONLY" / "READ-WRITE" / "TRYCREATE" /
"UIDNEXT" SP nz-number / "UIDVALIDITY" SP nz-number /
"UNSEEN" SP nz-number /
atom [SP 1*<any TEXT-CHAR except "]">]
search = "SEARCH" [SP "CHARSET" SP astring] 1*(SP search-key)
; CHARSET argument to MUST be registered with IANA
search-key = "ALL" / "ANSWERED" / "BCC" SP astring /
"BEFORE" SP date / "BODY" SP astring /
"CC" SP astring / "DELETED" / "FLAGGED" /
"FROM" SP astring / "KEYWORD" SP flag-keyword /
"NEW" / "OLD" / "ON" SP date / "RECENT" / "SEEN" /
"SINCE" SP date / "SUBJECT" SP astring /
"TEXT" SP astring / "TO" SP astring /
"UNANSWERED" / "UNDELETED" / "UNFLAGGED" /
"UNKEYWORD" SP flag-keyword / "UNSEEN" /
; Above this line were in [IMAP2]
"DRAFT" / "HEADER" SP header-fld-name SP astring /
"LARGER" SP number / "NOT" SP search-key /
"OR" SP search-key SP search-key /
"SENTBEFORE" SP date / "SENTON" SP date /
"SENTSINCE" SP date / "SMALLER" SP number /
"UID" SP sequence-set / "UNDRAFT" / sequence-set /
"(" search-key *(SP search-key) ")"
section = "[" [section-spec] "]"
section-msgtext = "HEADER" / "HEADER.FIELDS" [".NOT"] SP header-list /
"TEXT"
; top-level or MESSAGE/RFC822 part
section-part = nz-number *("." nz-number)
; body part nesting
; Crispin Standards Track [Page 89]
; RFC 3501 IMAPv4 March 2003
section-spec = section-msgtext / (section-part ["." section-text])
section-text = section-msgtext / "MIME"
; text other than actual body part (headers, etc.)
select = "SELECT" SP mailbox
seq-number = nz-number / "*"
; message sequence number (COPY, FETCH, STORE
; commands) or unique identifier (UID COPY,
; UID FETCH, UID STORE commands).
; * represents the largest number in use. In
; the case of message sequence numbers, it is
; the number of messages in a non-empty mailbox.
; In the case of unique identifiers, it is the
; unique identifier of the last message in the
; mailbox or, if the mailbox is empty, the
; mailbox's current UIDNEXT value.
; The server should respond with a tagged BAD
; response to a command that uses a message
; sequence number greater than the number of
; messages in the selected mailbox. This
; includes "*" if the selected mailbox is empty.
seq-range = seq-number ":" seq-number
; two seq-number values and all values between
; these two regardless of order.
; Example: 2:4 and 4:2 are equivalent and indicate
; values 2, 3, and 4.
; Example: a unique identifier sequence range of
; 3291:* includes the UID of the last message in
; the mailbox, even if that value is less than 3291.
sequence-set = (seq-number / seq-range) *("," sequence-set)
; set of seq-number values, regardless of order.
; Servers MAY coalesce overlaps and/or execute the
; sequence in any order.
; Example: a message sequence number set of
; 2,4:7,9,12:* for a mailbox with 15 messages is
; equivalent to 2,4,5,6,7,9,12,13,14,15
; Example: a message sequence number set of *:4,5:7
; for a mailbox with 10 messages is equivalent to
; 10,9,8,7,6,5,4,5,6,7 and MAY be reordered and
; overlap coalesced to be 4,5,6,7,8,9,10.
status = "STATUS" SP mailbox SP
"(" status-att *(SP status-att) ")"
; Crispin Standards Track [Page 90]
; RFC 3501 IMAPv4 March 2003
status-att = "MESSAGES" / "RECENT" / "UIDNEXT" / "UIDVALIDITY" /
"UNSEEN"
status-att-list = status-att SP number *(SP status-att SP number)
store = "STORE" SP sequence-set SP store-att-flags
store-att-flags = (["+" / "-"] "FLAGS" [".SILENT"]) SP
(flag-list / (flag *(SP flag)))
string = quoted / literal
subscribe = "SUBSCRIBE" SP mailbox
tag = 1*<any ASTRING-CHAR except "+">
text = 1*TEXT-CHAR
TEXT-CHAR = <any CHAR except CR and LF>
time = 2DIGIT ":" 2DIGIT ":" 2DIGIT
; Hours minutes seconds
uid = "UID" SP (copy / fetch / search / store)
; Unique identifiers used instead of message
; sequence numbers
uniqueid = nz-number
; Strictly ascending
unsubscribe = "UNSUBSCRIBE" SP mailbox
userid = astring
x-command = "X" atom <experimental command arguments>
zone = ("+" / "-") 4DIGIT
; Signed four-digit value of hhmm representing
; hours and minutes east of Greenwich (that is,
; the amount that the given time differs from
; Universal Time). Subtracting the timezone
; from the given time will give the UT form.
; The Universal Time zone is "+0000".
; ############################################################################
; RFC3501 Errata
; Source of RFC: IETF - NON WORKING GROUP
; Area Assignment: app
;
; Errata ID: 261
; Status: Verified
; Type: Technical
; Publication Format(s) : TEXT
; Reported By: Mark Crispin
; Date Reported: 2007-06-13
; Formal Syntax, Page 84:
; old:
CHAR8 = %x01-ff
; any OCTET except NUL, %x00
; new:
CHAR8 = %x01-ff
; any OCTET except NUL, %x00
charset = atom / quoted
; -----
; Formal Syntax, Page 89:
; old:
resp-text-code = "ALERT" /
"BADCHARSET" [SP "(" astring *(SP astring) ")" ] /
; new:
resp-text-code = "ALERT" /
"BADCHARSET" [SP "(" charset *(SP charset) ")" ] /
; -----
; Formal Syntax, Page 89:
; old:
search = "SEARCH" [SP "CHARSET" SP astring] 1*(SP search-key)
; new:
search = "SEARCH" [SP "CHARSET" SP charset] 1*(SP search-key)
; -----
; Formal Syntax, Page 90:
; old:
sequence-set = (seq-number / seq-range) *("," sequence-set)
; new:
sequence-set = (seq-number / seq-range) ["," sequence-set]
; -----
; Formal Syntax, Page 90:
; old:
status-att-list = status-att SP number *(SP status-att SP number)
; new:
status-att-val = ("MESSAGES" SP number) / ("RECENT" SP number) /
("UIDNEXT" SP nz-number) / ("UIDVALIDITY" SP nz-number) /
("UNSEEN" SP number)
status-att-list = status-att-val *(SP status-att-val)
; ############################################################################
; Crocker & Overell Standards Track [Page 12]
; RFC 5234 ABNF January 2008
;
; ...
;
; Appendix B. Core ABNF of ABNF
;
; This appendix contains some basic rules that are in common use.
; Basic rules are in uppercase. Note that these rules are only valid
; for ABNF encoded in 7-bit ASCII or in characters sets that are a
; superset of 7-bit ASCII.
;
; B.1. Core Rules
;
; Certain basic rules are in uppercase, such as SP, HTAB, CRLF, DIGIT,
; ALPHA, etc.
ALPHA = %x41-5A / %x61-7A ; A-Z / a-z
BIT = "0" / "1"
CHAR = %x01-7F
; any 7-bit US-ASCII character,
; excluding NUL
; Crocker & Overell Standards Track [Page 13]
; RFC 5234 ABNF January 2008
CR = %x0D
; carriage return
CRLF = CR LF
; Internet standard newline
CTL = %x00-1F / %x7F
; controls
DIGIT = %x30-39
; 0-9
DQUOTE = %x22
; " (Double Quote)
HEXDIG = DIGIT / "A" / "B" / "C" / "D" / "E" / "F"
HTAB = %x09
; horizontal tab
LF = %x0A
; linefeed
LWSP = *(WSP / CRLF WSP)
; Use of this linear-white-space rule
; permits lines containing only white
; space that are no longer legal in
; mail headers and have caused
; interoperability problems in other
; contexts.
; Do not use when defining mail
; headers and use with caution in
; other contexts.
OCTET = %x00-FF
; 8 bits of data
SP = %x20
VCHAR = %x21-7E
; visible (printing) characters
WSP = SP / HTAB
; white space
; ############################################################################
; Myers Standards Track [Page 3]
; RFC 2087 QUOTA January 1997
;
; ...
;
; 6. Formal syntax
;
; The following syntax specification uses the augmented Backus-Naur
; Form (BNF) notation as specified in RFC 822 with one exception; the
; delimiter used with the "#" construct is a single space (SP) and not
; one or more commas.
;
; Except as noted otherwise, all alphabetic characters are case-
; insensitive. The use of upper or lower case characters to define
; token strings is for editorial clarity only. Implementations MUST
; accept these strings in a case-insensitive fashion.
;
;
; Myers Standards Track [Page 4]
; RFC 2087 QUOTA January 1997
getquota ::= "GETQUOTA" SP astring
getquotaroot ::= "GETQUOTAROOT" SP astring
quota_list ::= "(" #quota_resource ")"
quota_resource ::= atom SP number SP number
quota_response ::= "QUOTA" SP astring SP quota_list
quotaroot_response
::= "QUOTAROOT" SP astring *(SP astring)
setquota ::= "SETQUOTA" SP astring SP setquota_list
setquota_list ::= "(" 0#setquota_resource ")"
setquota_resource ::= atom SP number
; ############################################################################
; RFC 7888 Obsoletes RFC 2088 (1997)
;
; Melnikov Standards Track [Page 5]
; RFC 7888 IMAP4 Non-synchronizing Literals May 2016
;
; ...
;
; 8. Formal Syntax
;
; The following syntax specification uses the Augmented Backus-Naur
; Form (ABNF) notation as specified in [ABNF].
;
; Non-terminals referenced but not defined below are as defined by
; [RFC3501].
literal = "{" number ["+"] "}" CRLF *CHAR8
; Number represents the number of CHAR8 octets
CHAR8 = <defined in RFC 3501>
literal8 = <defined in RFC 4466>
; ############################################################################
; Leiba Standards Track [Page 2]
; RFC 2177 IMAP4 IDLE command June 1997
;
; ...
;
; 4. Formal Syntax
;
; The following syntax specification uses the augmented Backus-Naur
; Form (BNF) notation as specified in [RFC-822] as modified by [IMAP4].
; Non-terminals referenced but not defined below are as defined by
; [IMAP4].
command_auth ::= append / create / delete / examine / list / lsub /
rename / select / status / subscribe / unsubscribe
/ idle
;; Valid only in Authenticated or Selected state
idle ::= "IDLE" CRLF "DONE"
; ############################################################################
; RFC 5092 Obsoletes RFC 2192 (1997)
;
; Melnikov & Newman Standards Track [Page 16]
; RFC 5092 IMAP URL Scheme November 2007
;
; ...
;
; 11. ABNF for IMAP URL Scheme
;
; Formal syntax is defined using ABNF [ABNF], extending the ABNF rules
; in Section 9 of [IMAP4]. Elements not defined here can be found in
; [ABNF], [IMAP4], [IMAPABNF], or [URI-GEN]. Strings are not case
; sensitive, and free insertion of linear white space is not permitted.
sub-delims-sh = "!" / "$" / "'" / "(" / ")" /
"*" / "+" / ","
;; Same as [URI-GEN] sub-delims,
;; but without ";", "&" and "=".
uchar = unreserved / sub-delims-sh / pct-encoded
achar = uchar / "&" / "="
;; Same as [URI-GEN] 'unreserved / sub-delims /
;; pct-encoded', but ";" is disallowed.
bchar = achar / ":" / "@" / "/"
; Melnikov & Newman Standards Track [Page 17]
; RFC 5092 IMAP URL Scheme November 2007
enc-auth-type = 1*achar
; %-encoded version of [IMAP4] "auth-type"
enc-mailbox = 1*bchar
; %-encoded version of [IMAP4] "mailbox"
enc-search = 1*bchar
; %-encoded version of [IMAPABNF]
; "search-program". Note that IMAP4
; literals may not be used in
; a "search-program", i.e., only
; quoted or non-synchronizing
; literals (if the server supports
; LITERAL+ [LITERAL+]) are allowed.
enc-section = 1*bchar
; %-encoded version of [IMAP4] "section-spec"
enc-user = 1*achar
; %-encoded version of [IMAP4] authorization
; identity or "userid".
imapurl = "imap://" iserver ipath-query
; Defines an absolute IMAP URL
ipath-query = ["/" [ icommand ]]
; Corresponds to "path-abempty [ "?" query ]"
; in [URI-GEN]
; Generic syntax for relative URLs is defined in Section 4.2 of
; [URI-GEN]. For ease of implementation, the relative IMAP URL syntax
; is defined below:
imapurl-rel = inetwork-path
/ iabsolute-path
/ irelative-path
/ ipath-empty
inetwork-path = "//" iserver ipath-query
; Corresponds to '"//" authority path-abempty
; [ "?" query ]' in [URI-GEN]
iabsolute-path = "/" [ icommand ]
; icommand, if present, MUST NOT start with '/'.
;
; Corresponds to 'path-absolute [ "?" query ]'
; in [URI-GEN]
; Melnikov & Newman Standards Track [Page 18]
; RFC 5092 IMAP URL Scheme November 2007
irelative-path = imessagelist /
imsg-or-part
; Corresponds to 'path-noscheme [ "?" query ]'
; in [URI-GEN]
imsg-or-part = ( imailbox-ref "/" iuid-only ["/" isection-only]
["/" ipartial-only] ) /
( iuid-only ["/" isection-only]
["/" ipartial-only] ) /
( isection-only ["/" ipartial-only] ) /
ipartial-only
ipath-empty = 0<pchar>
; Zero characters.
; The same-document reference.
; The following three rules are only used in the presence of the IMAP
; [URLAUTH] extension:
authimapurl = "imap://" iserver "/" imessagepart
; Same as "imapurl" when "[icommand]" is
; "imessagepart"
authimapurlfull = authimapurl iurlauth
; Same as "imapurl" when "[icommand]" is
; "imessagepart iurlauth"
authimapurlrump = authimapurl iurlauth-rump
enc-urlauth = 32*HEXDIG
iurlauth = iurlauth-rump iua-verifier
iua-verifier = ":" uauth-mechanism ":" enc-urlauth
iurlauth-rump = [expire] ";URLAUTH=" access
access = ("submit+" enc-user) / ("user+" enc-user) /
"authuser" / "anonymous"
expire = ";EXPIRE=" date-time
; date-time is defined in [DATETIME]
uauth-mechanism = "INTERNAL" / 1*(ALPHA / DIGIT / "-" / ".")
; Case-insensitive.
; New mechanisms MUST be registered with IANA.
; Melnikov & Newman Standards Track [Page 19]
; RFC 5092 IMAP URL Scheme November 2007
iauth = ";AUTH=" ( "*" / enc-auth-type )
icommand = imessagelist /
imessagepart [iurlauth]
imailbox-ref = enc-mailbox [uidvalidity]
imessagelist = imailbox-ref [ "?" enc-search ]
; "enc-search" is [URI-GEN] "query".
imessagepart = imailbox-ref iuid [isection] [ipartial]
ipartial = "/" ipartial-only
ipartial-only = ";PARTIAL=" partial-range
isection = "/" isection-only
isection-only = ";SECTION=" enc-section
iserver = [iuserinfo "@"] host [ ":" port ]
; This is the same as "authority" defined
; in [URI-GEN]. See [URI-GEN] for "host"
; and "port" definitions.
iuid = "/" iuid-only
iuid-only = ";UID=" nz-number
; See [IMAP4] for "nz-number" definition
iuserinfo = enc-user [iauth] / [enc-user] iauth
; conforms to the generic syntax of
; "userinfo" as defined in [URI-GEN].
partial-range = number ["." nz-number]
; partial FETCH. The first number is
; the offset of the first byte,
; the second number is the length of
; the fragment.
uidvalidity = ";UIDVALIDITY=" nz-number
; See [IMAP4] for "nz-number" definition
; ############################################################################
; Gahrns Standards Track [Page 6]
; RFC 2193 IMAP4 Mailbox Referrals September 1997
;
; ...
;
; 6. Formal Syntax
;
; The following syntax specification uses the augmented Backus-Naur
; Form (BNF) as described in [ABNF].
list_mailbox = <list_mailbox> as defined in [RFC-2060]
mailbox = <mailbox> as defined in [RFC-2060]
mailbox_referral = <tag> SPACE "NO" SPACE
<referral_response_code> (text / text_mime2)
; See [RFC-2060] for <tag>, text and text_mime2 definition
; Gahrns Standards Track [Page 7]
; RFC 2193 IMAP4 Mailbox Referrals September 1997
referral_response_code = "[" "REFERRAL" 1*(SPACE <url>) "]"
; See [RFC-1738] for <url> definition
rlist = "RLIST" SPACE mailbox SPACE list_mailbox
rlsub = "RLSUB" SPACE mailbox SPACE list_mailbox
; ############################################################################
; Gahrns & Newman Standards Track [Page 7]
; RFC 2342 IMAP4 Namespace May 1998
;
; 6. Formal Syntax
;
; The following syntax specification uses the augmented Backus-Naur
; Form (BNF) as described in [ABNF].
atom = <atom>
; <atom> as defined in [RFC-2060]
Namespace = nil / "(" 1*( "(" string SP (<"> QUOTED_CHAR <"> /
nil) *(Namespace_Response_Extension) ")" ) ")"
Namespace_Command = "NAMESPACE"
Namespace_Response_Extension = SP string SP "(" string *(SP string)
")"
Namespace_Response = "*" SP "NAMESPACE" SP Namespace SP Namespace SP
Namespace
; The first Namespace is the Personal Namespace(s)
; The second Namespace is the Other Users' Namespace(s)
; The third Namespace is the Shared Namespace(s)
nil = <nil>
; <nil> as defined in [RFC-2060]
QUOTED_CHAR = <QUOTED_CHAR>
; <QUOTED_CHAR> as defined in [RFC-2060]
string = <string>
; <string> as defined in [RFC-2060]
; Note that the namespace prefix is to a mailbox and following
; IMAP4 convention, any international string in the NAMESPACE
; response MUST be of modified UTF-7 format as described in
; [RFC-2060].
; ############################################################################
; Showalter Standards Track [Page 4]
; RFC 2971 IMAP4 ID extension October 2000
;
;
; 4. Formal Syntax
;
; This syntax is intended to augment the grammar specified in
; [IMAP4rev1] in order to provide for the ID command. This
; specification uses the augmented Backus-Naur Form (BNF) notation as
; used in [IMAP4rev1].
command_any ::= "CAPABILITY" / "LOGOUT" / "NOOP" / x_command / id
;; adds id command to command_any in [IMAP4rev1]
id ::= "ID" SPACE id_params_list
id_response ::= "ID" SPACE id_params_list
id_params_list ::= "(" #(string SPACE nstring) ")" / nil
;; list of field value pairs
response_data ::= "*" SPACE (resp_cond_state / resp_cond_bye /
mailbox_data / message_data / capability_data / id_response)
; ############################################################################
; Crispin Standards Track [Page 3]
; RFC 3502 IMAP MULTIAPPEND March 2003
;
; ...
;
; Modification to IMAP4rev1 Base Protocol Formal Syntax
;
; The following syntax specification uses the Augmented Backus-Naur
; Form (ABNF) notation as specified in [ABNF].
append = "APPEND" SP mailbox 1*append-message
append-message = [SP flag-list] [SP date-time] SP literal
; Crispin Standards Track [Page 4]
; RFC 3502 IMAP MULTIAPPEND March 2003
;
;
; MULTIAPPEND Interaction with UIDPLUS Extension
;
; Servers which support both MULTIAPPEND and [UIDPLUS] will have the
; "resp-code-apnd" rule modified as follows:
resp-code-apnd = "APPENDUID" SP nz-number SP set
; That is, the APPENDUID response code returns as many UIDs as there
; were messages appended in the multiple append. The UIDs returned
; should be in the order the articles where appended. The message set
; may not contain extraneous UIDs or the symbol "*".
; ############################################################################
; Melnikov Standards Track [Page 6]
; RFC 3503 MDN profile for IMAP March 2003
;
; ...
;
; 7. Formal Syntax
;
; The following syntax specification uses the augmented Backus-Naur
; Form (BNF) notation as specified in [RFC-822], as modified by
; [IMAP4]. Non-terminals referenced, but not defined below, are as
; defined by [IMAP4].
;
; Except as noted otherwise, all alphabetic characters are case-
; insensitive. The use of upper or lower case characters to define
; token strings is for editorial clarity only. Implementations MUST
; accept these strings in a case-insensitive fashion.
flag_keyword ::= "$MDNSent" / other_keywords
other_keywords ::= atom
; ############################################################################
; Nerenberg Standards Track [Page 4]
; RFC 3516 IMAP4 Binary Content Extension April 2003
;
; ...
;
; 7. Formal Protocol Syntax
;
; The following syntax specification uses the augmented Backus-Naur
; Form (ABNF) notation as used in [ABNF], and incorporates by reference
; the Core Rules defined in that document.
;
; This syntax augments the grammar specified in [IMAP4rev1].
append =/ "APPEND" SP mailbox [SP flag-list]
[SP date-time] SP literal8
fetch-att =/ "BINARY" [".PEEK"] section-binary [partial]
/ "BINARY.SIZE" section-binary
literal8 = "~{" number "}" CRLF *OCTET
; <number> represents the number of OCTETs
; in the response string.
msg-att-static =/ "BINARY" section-binary SP (nstring / literal8)
/ "BINARY.SIZE" section-binary SP number
partial = "<" number "." nz-number ">"
resp-text-code =/ "UNKNOWN-CTE"
section-binary = "[" [section-part] "]"
; ############################################################################
; Melnikov Standards Track [Page 2]
; RFC 3691 IMAP UNSELECT command February 2004
;
; 4. Formal Syntax
;
; The following syntax specification uses the Augmented Backus-Naur
; Form (ABNF) notation as specified in [ABNF]. Non-terminals
; referenced but not defined below are as defined by [IMAP4].
;
; Except as noted otherwise, all alphabetic characters are case-
; insensitive. The use of upper or lower case characters to define
; token strings is for editorial clarity only. Implementations MUST
; accept these strings in a case-insensitive fashion.
command-select /= "UNSELECT"
; ############################################################################
; Melnikov Standards Track [Page 20]
; RFC 4314 IMAP ACL December 2005
;
; ...
;
; 7. Formal Syntax
;
; Formal syntax is defined using ABNF [ABNF], extending the ABNF rules
; in Section 9 of [IMAP4]. Elements not defined here can be found in
; [ABNF] and [IMAP4].
;
; Except as noted otherwise, all alphabetic characters are case
; insensitive. The use of uppercase or lowercase characters to define
; token strings is for editorial clarity only. Implementations MUST
; accept these strings in a case-insensitive fashion.
LOWER-ALPHA = %x61-7A ;; a-z
acl-data = "ACL" SP mailbox *(SP identifier SP
rights)
capability =/ rights-capa
;;capability is defined in [IMAP4]
command-auth =/ setacl / deleteacl / getacl /
listrights / myrights
;;command-auth is defined in [IMAP4]
deleteacl = "DELETEACL" SP mailbox SP identifier
getacl = "GETACL" SP mailbox
identifier = astring
listrights = "LISTRIGHTS" SP mailbox SP identifier
listrights-data = "LISTRIGHTS" SP mailbox SP identifier
SP rights *(SP rights)
; Melnikov Standards Track [Page 21]
; RFC 4314 IMAP ACL December 2005
mailbox-data =/ acl-data / listrights-data / myrights-data
;;mailbox-data is defined in [IMAP4]
mod-rights = astring
;; +rights to add, -rights to remove
;; rights to replace
myrights = "MYRIGHTS" SP mailbox
myrights-data = "MYRIGHTS" SP mailbox SP rights
new-rights = 1*LOWER-ALPHA
;; MUST include "t", "e", "x", and "k".
;; MUST NOT include standard rights listed
;; in section 2.2
rights = astring
;; only lowercase ASCII letters and digits
;; are allowed.
rights-capa = "RIGHTS=" new-rights
;; RIGHTS=... capability
setacl = "SETACL" SP mailbox SP identifier
SP mod-rights
; ############################################################################
; Crispin Standards Track [Page 4]
; RFC 4315 IMAP - UIDPLUS Extension December 2005
;
; ...
;
; 4. Formal Syntax
;
; Formal syntax is defined using ABNF [ABNF], which extends the ABNF
; rules defined in [IMAP]. The IMAP4 ABNF should be imported before
; attempting to validate these rules.
append-uid = uniqueid
capability =/ "UIDPLUS"
; Crispin Standards Track [Page 5]
; RFC 4315 IMAP - UIDPLUS Extension December 2005
command-select =/ uid-expunge
resp-code-apnd = "APPENDUID" SP nz-number SP append-uid
resp-code-copy = "COPYUID" SP nz-number SP uid-set SP uid-set
resp-text-code =/ resp-code-apnd / resp-code-copy / "UIDNOTSTICKY"
; incorporated before the expansion rule of
; atom [SP 1*<any TEXT-CHAR except "]">]
; that appears in [IMAP]
uid-expunge = "UID" SP "EXPUNGE" SP sequence-set
uid-set = (uniqueid / uid-range) *("," uid-set)
uid-range = (uniqueid ":" uniqueid)
; two uniqueid values and all values
; between these two regards of order.
; Example: 2:4 and 4:2 are equivalent.
; Servers that support [MULTIAPPEND] will have the following extension
; to the above rules:
append-uid =/ uid-set
; only permitted if client uses [MULTIAPPEND]
; to append multiple messages.
; ############################################################################
; Melnikov & Daboo Standards Track [Page 8]
; RFC 4466 Collected Extensions to IMAP4 ABNF April 2006
;
; 3. Formal Syntax
;
; The following syntax specification uses the Augmented Backus-Naur
; Form (ABNF) notation as specified in [ABNF].
;
; Non-terminals referenced but not defined below are as defined by
; [IMAP4].
;
; Except as noted otherwise, all alphabetic characters are case-
; insensitive. The use of uppercase or lowercase characters to define
; token strings is for editorial clarity only. Implementations MUST
; accept these strings in a case-insensitive fashion.
append = "APPEND" SP mailbox 1*append-message
;; only a single append-message may appear
;; if MULTIAPPEND [MULTIAPPEND] capability
;; is not present
append-message = append-opts SP append-data
append-ext = append-ext-name SP append-ext-value
;; This non-terminal define extensions to
;; to message metadata.
append-ext-name = tagged-ext-label
append-ext-value= tagged-ext-val
;; This non-terminal shows recommended syntax
;; for future extensions.
append-data = literal / literal8 / append-data-ext
append-data-ext = tagged-ext
;; This non-terminal shows recommended syntax
;; for future extensions,
;; i.e., a mandatory label followed
;; by parameters.
append-opts = [SP flag-list] [SP date-time] *(SP append-ext)
;; message metadata
charset = atom / quoted
;; Exact syntax is defined in [CHARSET].
create = "CREATE" SP mailbox
[create-params]
;; Use of INBOX gives a NO error.
; Melnikov & Daboo Standards Track [Page 9]
; RFC 4466 Collected Extensions to IMAP4 ABNF April 2006
create-params = SP "(" create-param *( SP create-param) ")"
create-param-name = tagged-ext-label
create-param = create-param-name [SP create-param-value]
create-param-value= tagged-ext-val
;; This non-terminal shows recommended syntax
;; for future extensions.
esearch-response = "ESEARCH" [search-correlator] [SP "UID"]
*(SP search-return-data)
;; Note that SEARCH and ESEARCH responses
;; SHOULD be mutually exclusive,
;; i.e., only one of the response types
;; should be
;; returned as a result of a command.
examine = "EXAMINE" SP mailbox [select-params]
;; modifies the original IMAP EXAMINE command
;; to accept optional parameters
fetch = "FETCH" SP sequence-set SP ("ALL" / "FULL" /
"FAST" / fetch-att /
"(" fetch-att *(SP fetch-att) ")")
[fetch-modifiers]
;; modifies the original IMAP4 FETCH command to
;; accept optional modifiers
fetch-modifiers = SP "(" fetch-modifier *(SP fetch-modifier) ")"
fetch-modifier = fetch-modifier-name [ SP fetch-modif-params ]
fetch-modif-params = tagged-ext-val
;; This non-terminal shows recommended syntax
;; for future extensions.
fetch-modifier-name = tagged-ext-label
literal8 = "~{" number ["+"] "}" CRLF *OCTET
;; A string that might contain NULs.
;; <number> represents the number of OCTETs
;; in the response string.
;; The "+" is only allowed when both LITERAL+ and
;; BINARY extensions are supported by the server.
; Melnikov & Daboo Standards Track [Page 10]
; RFC 4466 Collected Extensions to IMAP4 ABNF April 2006
mailbox-data =/ Namespace-Response /
esearch-response
Namespace = nil / "(" 1*Namespace-Descr ")"
Namespace-Command = "NAMESPACE"
Namespace-Descr = "(" string SP
(DQUOTE QUOTED-CHAR DQUOTE / nil)
*(Namespace-Response-Extension) ")"
Namespace-Response-Extension = SP string SP
"(" string *(SP string) ")"
Namespace-Response = "NAMESPACE" SP Namespace
SP Namespace SP Namespace
;; This response is currently only allowed
;; if the IMAP server supports [NAMESPACE].
;; The first Namespace is the Personal Namespace(s)
;; The second Namespace is the Other Users' Namespace(s)
;; The third Namespace is the Shared Namespace(s)
rename = "RENAME" SP mailbox SP mailbox
[rename-params]
;; Use of INBOX as a destination gives
;; a NO error, unless rename-params
;; is not empty.
rename-params = SP "(" rename-param *( SP rename-param) ")"
rename-param = rename-param-name [SP rename-param-value]
rename-param-name = tagged-ext-label
rename-param-value= tagged-ext-val
;; This non-terminal shows recommended syntax
;; for future extensions.
response-data = "*" SP response-payload CRLF
response-payload= resp-cond-state / resp-cond-bye /
mailbox-data / message-data / capability-data
search = "SEARCH" [search-return-opts]
SP search-program
search-correlator = SP "(" "TAG" SP tag-string ")"
; Melnikov & Daboo Standards Track [Page 11]
; RFC 4466 Collected Extensions to IMAP4 ABNF April 2006
search-program = ["CHARSET" SP charset SP]
search-key *(SP search-key)
;; CHARSET argument to SEARCH MUST be
;; registered with IANA.
search-return-data = search-modifier-name SP search-return-value
;; Note that not every SEARCH return option
;; is required to have the corresponding
;; ESEARCH return data.
search-return-opts = SP "RETURN" SP "(" [search-return-opt
*(SP search-return-opt)] ")"
search-return-opt = search-modifier-name [SP search-mod-params]
search-return-value = tagged-ext-val
;; Data for the returned search option.
;; A single "nz-number"/"number" value
;; can be returned as an atom (i.e., without
;; quoting). A sequence-set can be returned
;; as an atom as well.
search-modifier-name = tagged-ext-label
search-mod-params = tagged-ext-val
;; This non-terminal shows recommended syntax
;; for future extensions.
select = "SELECT" SP mailbox [select-params]
;; modifies the original IMAP SELECT command to
;; accept optional parameters
select-params = SP "(" select-param *(SP select-param) ")"
select-param = select-param-name [SP select-param-value]
;; a parameter to SELECT may contain one or
;; more atoms and/or strings and/or lists.
select-param-name= tagged-ext-label
select-param-value= tagged-ext-val
;; This non-terminal shows recommended syntax
;; for future extensions.
status-att-list = status-att-val *(SP status-att-val)
;; Redefines status-att-list from RFC 3501.
;; status-att-val is defined in RFC 3501 errata
; Melnikov & Daboo Standards Track [Page 12]
; RFC 4466 Collected Extensions to IMAP4 ABNF April 2006
status-att-val = ("MESSAGES" SP number) /
("RECENT" SP number) /
("UIDNEXT" SP nz-number) /
("UIDVALIDITY" SP nz-number) /
("UNSEEN" SP number)
;; Extensions to the STATUS responses
;; should extend this production.
;; Extensions should use the generic
;; syntax defined by tagged-ext.
store = "STORE" SP sequence-set [store-modifiers]
SP store-att-flags
;; extend [IMAP4] STORE command syntax
;; to allow for optional store-modifiers
store-modifiers = SP "(" store-modifier *(SP store-modifier)
")"
store-modifier = store-modifier-name [SP store-modif-params]
store-modif-params = tagged-ext-val
;; This non-terminal shows recommended syntax
;; for future extensions.
store-modifier-name = tagged-ext-label
tag-string = string
;; tag of the command that caused
;; the ESEARCH response, sent as
;; a string.
tagged-ext = tagged-ext-label SP tagged-ext-val
;; recommended overarching syntax for
;; extensions
tagged-ext-label = tagged-label-fchar *tagged-label-char
;; Is a valid RFC 3501 "atom".
tagged-label-fchar = ALPHA / "-" / "_" / "."
tagged-label-char = tagged-label-fchar / DIGIT / ":"
; Melnikov & Daboo Standards Track [Page 13]
; RFC 4466 Collected Extensions to IMAP4 ABNF April 2006
tagged-ext-comp = astring /
tagged-ext-comp *(SP tagged-ext-comp) /
"(" tagged-ext-comp ")"
;; Extensions that follow this general
;; syntax should use nstring instead of
;; astring when appropriate in the context
;; of the extension.
;; Note that a message set or a "number"
;; can always be represented as an "atom".
;; An URL should be represented as
;; a "quoted" string.
tagged-ext-simple = sequence-set / number
tagged-ext-val = tagged-ext-simple /
"(" [tagged-ext-comp] ")"
; ############################################################################
; Crispin Standards Track [Page 12]
; RFC 4467 IMAP - URLAUTH Extension May 2006
;
; ...
;
; 9. Formal Syntax
;
; The following syntax specification uses the Augmented Backus-Naur
; Form (ABNF) notation as specified in [ABNF].
;
; The following modifications are made to the Formal Syntax in [IMAP]:
resetkey = "RESETKEY" [SP mailbox *(SP mechanism)]
capability =/ "URLAUTH"
command-auth =/ resetkey / genurlauth / urlfetch
resp-text-code =/ "URLMECH" SP "INTERNAL" *(SP mechanism ["=" base64])
genurlauth = "GENURLAUTH" 1*(SP url-rump SP mechanism)
genurlauth-data = "*" SP "GENURLAUTH" 1*(SP url-full)
; Crispin Standards Track [Page 13]
; RFC 4467 IMAP - URLAUTH Extension May 2006
url-full = astring
; contains authimapurlfull as defined below
url-rump = astring
; contains authimapurlrump as defined below
urlfetch = "URLFETCH" 1*(SP url-full)
urlfetch-data = "*" SP "URLFETCH" 1*(SP url-full SP nstring)
; The following extensions are made to the Formal Syntax in [IMAPURL]:
authimapurl = "imap://" enc-user [iauth] "@" hostport "/"
imessagepart
; replaces "imapurl" and "iserver" rules for
; URLAUTH authorized URLs
authimapurlfull = authimapurl iurlauth
authimapurlrump = authimapurl iurlauth-rump
enc-urlauth = 32*HEXDIG
enc-user = 1*achar
; same as "enc_user" in RFC 2192
iurlauth = iurlauth-rump ":" mechanism ":" enc-urlauth
iurlauth-rump = [expire] ";URLAUTH=" access
access = ("submit+" enc-user) / ("user+" enc-user) /
"authuser" / "anonymous"
expire = ";EXPIRE=" date-time
; date-time defined in [DATETIME]
mechanism = "INTERNAL" / 1*(ALPHA / DIGIT / "-" / ".")
; case-insensitive
; new mechanisms MUST be registered with IANA
; ############################################################################
; Resnick Standards Track [Page 4]
; RFC 4469 IMAP CATENATE Extension April 2006
;
; ...
;
; 5. Formal Syntax
;
; The following syntax specification uses the Augmented Backus-Naur
; Form (ABNF) [7] notation. Elements not defined here can be found in
; the formal syntax of the ABNF [7], IMAP [1], and IMAP ABNF extensions
; [8] specifications. Note that capability and resp-text-code are
; extended from the IMAP [1] specification and append-data is extended
; from the IMAP ABNF extensions [8] specification.
append-data =/ "CATENATE" SP "(" cat-part *(SP cat-part) ")"
cat-part = text-literal / url
text-literal = "TEXT" SP literal
url = "URL" SP astring
; The astring in the definition of url and the url-resp-text in the
; definition of badurl-response-code each contain an imapurl as defined
; by [2].
resp-text-code =/ toobig-response-code / badurl-response-code
toobig-response-code = "TOOBIG"
badurl-response-code = "BADURL" SP url-resp-text
url-resp-text = 1*(%x01-09 /
%x0B-0C /
%x0E-5B /
%x5D-FE) ; Any TEXT-CHAR except "]"
; The astring in the definition of url and the url-resp-text in the
; definition of badurl-response-code each contain an imapurl as defined
; by [2].
capability =/ "CATENATE"
; ############################################################################
; RFC 4469 Errata
; Source of RFC: lemonade (app)
;
; Errata ID: 2002
; Status: Verified
; Type: Technical
; Publication Format(s) : TEXT
; Reported By: Mike Abbott
; Date Reported: 2010-01-14
; Verifier Name: Alexey Melnikov
; Date Verified: 2010-04-02
; Section 5 says:
url-resp-text = 1*(%x01-09 /
%x0B-0C /
%x0E-5B /
%x5D-FE) ; Any TEXT-CHAR except "]"
; It should say:
url-resp-text = 1*(%x01-09 /
%x0B-0C /
%x0E-5C /
%x5E-FE) ; Any TEXT-CHAR except "]"
; Notes:
;
; The skipped character %x5C is "\" not "]". I think the intent is to omit "]"
; since url-resp-text is used exclusively inside a [BADURL url-resp-text]
; response code, and they want to avoid aliasing the closing "]".
; ############################################################################
; RFC 7162 Obsoletes: 4551 (2006), 5162 (2008)
;
; Melnikov & Cridland Standards Track [Page 43]
; RFC 7162 IMAP CONDSTORE & QRESYNC May 2014
;
; ...
;
; 7. Formal Syntax
;
; The following syntax specification uses the Augmented Backus-Naur
; Form (ABNF) notation as specified in [RFC5234].
;
; Non-terminals referenced but not defined below are as defined by
; [RFC5234], [RFC3501], or [RFC4466].
;
; Except as noted otherwise, all alphabetic characters are case-
; insensitive. The use of upper- or lower-case characters to define
; token strings is for editorial clarity only. Implementations MUST
; accept these strings in a case-insensitive fashion.
capability =/ "CONDSTORE" / "QRESYNC"
status-att =/ "HIGHESTMODSEQ"
;; Extends non-terminal defined in [RFC3501].
status-att-val =/ "HIGHESTMODSEQ" SP mod-sequence-valzer
;; Extends non-terminal defined in [RFC4466].
;; Value 0 denotes that the mailbox doesn't
;; support persistent mod-sequences
;; as described in Section 3.1.2.2.
; Melnikov & Cridland Standards Track [Page 44]
; RFC 7162 IMAP CONDSTORE & QRESYNC May 2014
store-modifier =/ "UNCHANGEDSINCE" SP mod-sequence-valzer
;; Only a single "UNCHANGEDSINCE" may be
;; specified in a STORE operation.
fetch-modifier =/ chgsince-fetch-mod
;; Conforms to the generic "fetch-modifier"
;; syntax defined in [RFC4466].
chgsince-fetch-mod = "CHANGEDSINCE" SP mod-sequence-value
;; CHANGEDSINCE FETCH modifier conforms to
;; the fetch-modifier syntax.
fetch-att =/ fetch-mod-sequence
;; Modifies original IMAP4 fetch-att.
fetch-mod-sequence = "MODSEQ"
fetch-mod-resp = "MODSEQ" SP "(" permsg-modsequence ")"
msg-att-dynamic =/ fetch-mod-resp
search-key =/ search-modsequence
;; Modifies original IMAP4 search-key.
;;
;; This change applies to all commands
;; referencing this non-terminal -- in
;; particular, SEARCH, SORT, and THREAD.
search-modsequence = "MODSEQ" [search-modseq-ext] SP
mod-sequence-valzer
search-modseq-ext = SP entry-name SP entry-type-req
resp-text-code =/ "HIGHESTMODSEQ" SP mod-sequence-value /
"NOMODSEQ" /
"MODIFIED" SP sequence-set
entry-name = entry-flag-name
; Melnikov & Cridland Standards Track [Page 45]
; RFC 7162 IMAP CONDSTORE & QRESYNC May 2014
entry-flag-name = DQUOTE "/flags/" attr-flag DQUOTE
;; Each system or user-defined flag <flag>
;; is mapped to "/flags/<flag>".
;;
;; <entry-flag-name> follows the escape rules
;; used by "quoted" string as described in
;; Section 4.3 of [RFC3501]; e.g., for the
;; flag \Seen, the corresponding <entry-name>
;; is "/flags/\\seen", and for the flag
;; $MDNSent, the corresponding <entry-name>
;; is "/flags/$mdnsent".
entry-type-resp = "priv" / "shared"
;; Metadata item type.
entry-type-req = entry-type-resp / "all"
;; Perform SEARCH operation on a private
;; metadata item, shared metadata item,
;; or both.
permsg-modsequence = mod-sequence-value
;; Per-message mod-sequence.
mod-sequence-value = 1*DIGIT
;; Positive unsigned 63-bit integer
;; (mod-sequence)
;; (1 <= n <= 9,223,372,036,854,775,807).
mod-sequence-valzer = "0" / mod-sequence-value
search-sort-mod-seq = "(" "MODSEQ" SP mod-sequence-value ")"
select-param =/ condstore-param
;; Conforms to the generic "select-param"
;; non-terminal syntax defined in [RFC4466].
condstore-param = "CONDSTORE"
mailbox-data =/ "SEARCH" [1*(SP nz-number) SP
search-sort-mod-seq]
sort-data = "SORT" [1*(SP nz-number) SP
search-sort-mod-seq]
; Updates the SORT response from RFC 5256.
; Melnikov & Cridland Standards Track [Page 46]
; RFC 7162 IMAP CONDSTORE & QRESYNC May 2014
attr-flag = "\\Answered" / "\\Flagged" / "\\Deleted" /
"\\Seen" / "\\Draft" / attr-flag-keyword /
attr-flag-extension
;; Does not include "\\Recent".
attr-flag-extension = "\\" atom
;; Future expansion. Client implementations
;; MUST accept flag-extension flags. Server
;; implementations MUST NOT generate
;; flag-extension flags, except as defined by
;; future standards or Standards Track
;; revisions of [RFC3501].
attr-flag-keyword = atom
select-param =/ "QRESYNC" SP "(" uidvalidity SP
mod-sequence-value [SP known-uids]
[SP seq-match-data] ")"
;; Conforms to the generic select-param
;; syntax defined in [RFC4466].
seq-match-data = "(" known-sequence-set SP known-uid-set ")"
uidvalidity = nz-number
known-uids = sequence-set
;; Sequence of UIDs; "*" is not allowed.
known-sequence-set = sequence-set
;; Set of message numbers corresponding to
;; the UIDs in known-uid-set, in ascending order.
;; * is not allowed.
known-uid-set = sequence-set
;; Set of UIDs corresponding to the messages in
;; known-sequence-set, in ascending order.
;; * is not allowed.
message-data =/ expunged-resp
expunged-resp = "VANISHED" [SP "(EARLIER)"] SP known-uids
; Melnikov & Cridland Standards Track [Page 47]
; RFC 7162 IMAP CONDSTORE & QRESYNC May 2014
rexpunges-fetch-mod = "VANISHED"
;; VANISHED UID FETCH modifier conforms
;; to the fetch-modifier syntax
;; defined in [RFC4466]. It is only
;; allowed in the UID FETCH command.
resp-text-code =/ "CLOSED"
; ############################################################################
; Melnikov & Cridland Standards Track [Page 4]
; RFC 4731 IMAP4 Extension to SEARCH November 2006
;
; ...
;
; 4. Formal Syntax
;
; The following syntax specification uses the Augmented Backus-Naur
; Form (ABNF) notation as specified in [ABNF].
;
; Non-terminals referenced but not defined below are as defined by
; [IMAP4], [CONDSTORE], or [IMAPABNF].
;
; Except as noted otherwise, all alphabetic characters are case-
; insensitive. The use of upper or lowercase characters to define
; token strings is for editorial clarity only. Implementations MUST
; accept these strings in a case-insensitive fashion.
capability =/ "ESEARCH"
search-return-data = "MIN" SP nz-number /
"MAX" SP nz-number /
"ALL" SP sequence-set /
"COUNT" SP number
;; conforms to the generic
;; search-return-data syntax defined
;; in [IMAPABNF]
search-return-opt = "MIN" / "MAX" / "ALL" / "COUNT"
;; conforms to generic search-return-opt
;; syntax defined in [IMAPABNF]
; When the CONDSTORE [CONDSTORE] IMAP extension is also supported,
; the ABNF is updated as follows:
search-return-data =/ "MODSEQ" SP mod-sequence-value
;; mod-sequence-value is defined
;; in [CONDSTORE]
; ############################################################################
; Siemborski & Gulbrandsen Standards Track [Page 4]
; RFC 4959 IMAP Ext for SASL Initial Client Response September 2007
;
;
; 7. Formal Syntax
;
; The following syntax specification uses the Augmented Backus-Naur
; Form [RFC4234] notation. [RFC3501] defines the non-terminals
; capability, auth-type, and base64.
capability =/ "SASL-IR"
authenticate = "AUTHENTICATE" SP auth-type [SP (base64 / "=")]
*(CRLF base64)
;;redefine AUTHENTICATE from [RFC3501]
; ############################################################################
; Gulbrandsen Standards Track [Page 5]
; RFC 4978 The IMAP COMPRESS Extension August 2007
;
; ...
;
; 5. Formal Syntax
;
; The following syntax specification uses the Augmented Backus-Naur
; Form (ABNF) notation as specified in [RFC4234]. This syntax augments
; the grammar specified in [RFC3501]. [RFC4234] defines SP and
; [RFC3501] defines command-auth, capability, and resp-text-code.
;
; Except as noted otherwise, all alphabetic characters are case-
; insensitive. The use of upper or lower case characters to define
; token strings is for editorial clarity only. Implementations MUST
; accept these strings in a case-insensitive fashion.
command-auth =/ compress
compress = "COMPRESS" SP algorithm
capability =/ "COMPRESS=" algorithm
;; multiple COMPRESS capabilities allowed
algorithm = "DEFLATE"
resp-text-code =/ "COMPRESSIONACTIVE"
; Note that due the syntax of capability names, future algorithm names
; must be atoms.
; ############################################################################
; Burger Standards Track [Page 1]
; RFC 5032 Search Within September 2007
;
; ...
;
; 3. Formal Syntax
;
; The following syntax specification uses the Augmented Backus-Naur
; Form (ABNF) notation. Elements not defined here can be found in the
; formal syntax of ABNF [RFC4234] and IMAP [RFC3501].
;
; This document extends RFC 3501 [RFC3501] with two new search keys:
; OLDER <interval> and YOUNGER <interval>.
search-key =/ ( "OLDER" / "YOUNGER" ) SP nz-number
; search-key defined in RFC 3501
; ############################################################################
; Gulbrandsen & Melnikov Standards Track [Page 3]
; RFC 5161 The IMAP ENABLE Extension March 2008
;
; ...
;
; 4. Formal Syntax
;
; The following syntax specification uses the Augmented Backus-Naur
; Form (ABNF) notation as specified in [RFC5234] including the core
; rules in Appendix B.1. [RFC3501] defines the non-terminals
; "capability" and "command-any".
;
; Except as noted otherwise, all alphabetic characters are
; case-insensitive. The use of upper or lower case characters to
; define token strings is for editorial clarity only. Implementations
; MUST accept these strings in a case-insensitive fashion.
capability =/ "ENABLE"
command-any =/ "ENABLE" 1*(SP capability)
response-data =/ "*" SP enable-data CRLF
enable-data = "ENABLED" *(SP capability)
; ############################################################################
; Melnikov Standards Track [Page 9]
; RFC 5182 Last SEARCH Result Reference March 2008
;
;
; 3. Formal Syntax
;
; The following syntax specification uses the Augmented Backus-Naur
; Form (ABNF) notation as specified in [ABNF]. Non-terminals
; referenced but not defined below are as defined in [IMAP4] or
; [IMAPABNF].
;
; Except as noted otherwise, all alphabetic characters are
; case-insensitive. The use of upper- or lower-case characters to
; define token strings is for editorial clarity only. Implementations
; MUST accept these strings in a case-insensitive fashion.
capability =/ "SEARCHRES"
;; capability is defined in [IMAP4]
sequence-set =/ seq-last-command
;; extends sequence-set to allow for
;; "result of the last command" indicator.
seq-last-command = "$"
search-return-opt = "SAVE"
;; conforms to generic search-return-opt
;; syntax defined in [IMAPABNF]
resp-text-code =/ "NOTSAVED"
;; <resp-text-code> from [IMAP4]
; ############################################################################
; Newman, et al. Standards Track [Page 7]
; RFC 5255 IMAP Internationalization June 2008
;
;
; 3.5. Formal Syntax
;
; The following syntax specification inherits ABNF [RFC5234] rules from
; IMAP4rev1 [RFC3501], IMAP4 Namespace [RFC2342], Tags for the
; Identifying Languages [RFC4646], UTF-8 [RFC3629], and Collected
; Extensions to IMAP4 ABNF [RFC4466].
command-any =/ language-cmd
; LANGUAGE command is valid in all states
language-cmd = "LANGUAGE" *(SP lang-range-quoted)
response-payload =/ language-data
language-data = "LANGUAGE" SP "(" lang-tag-quoted *(SP
lang-tag-quoted) ")"
namespace-trans = SP DQUOTE "TRANSLATION" DQUOTE SP "(" string ")"
; the string is encoded in Modified UTF-7.
; this is a subset of the syntax permitted by
; the Namespace-Response-Extension rule in [RFC4466]
lang-range-quoted = astring
; Once any literal wrapper or quoting is removed, this
; follows the language-range rule in [RFC4647]
lang-tag-quoted = astring
; Once any literal wrapper or quoting is removed, this follows
; the Language-Tag rule in [RFC4646]
resp-text = ["[" resp-text-code "]" SP ] UTF8-TEXT-CHAR
*(UTF8-TEXT-CHAR / "[")
; After the server is changed to a language other than
; i-default, this resp-text rule replaces the resp-text
; rule from [RFC3501].
UTF8-TEXT-CHAR = %x20-5A / %x5C-7E / UTF8-2 / UTF8-3 / UTF8-4
; UTF-8 excluding 7-bit control characters and "["
; ...
;
; Newman, et al. Standards Track [Page 13]
; RFC 5255 IMAP Internationalization June 2008
;
; ...
;
; 4.10. Formal Syntax
;
; The following syntax specification inherits ABNF [RFC5234] rules from
; IMAP4rev1 [RFC3501] and the Internet Application Protocol Comparator
; Registry [RFC4790].
command-auth =/ comparator-cmd
resp-text-code =/ "BADCOMPARATOR"
comparator-cmd = "COMPARATOR" *(SP comp-order-quoted)
response-payload =/ comparator-data
comparator-data = "COMPARATOR" SP comp-sel-quoted [SP "("
comp-id-quoted *(SP comp-id-quoted) ")"]
comp-id-quoted = astring
; Once any literal wrapper or quoting is removed, this
; follows the collation-id rule from [RFC4790]
comp-order-quoted = astring
; Once any literal wrapper or quoting is removed, this
; follows the collation-order rule from [RFC4790]
; Newman, et al. Standards Track [Page 14]
; RFC 5255 IMAP Internationalization June 2008
comp-sel-quoted = astring
; Once any literal wrapper or quoting is removed, this
; follows the collation-selected rule from [RFC4790]
; ############################################################################
; RFC 5255 Errata
; Source of RFC: imapext (app)
;
; Errata ID: 4092
; Status: Verified
; Type: Technical
; Publication Format(s) : TEXT
; Reported By: Chris Newman
; Date Reported: 2014-08-26
; Verifier Name: Barry Leiba
; Date Verified: 2014-08-26
;
; Section 3.5 says:
lang-range-quoted = astring
; Once any literal wrapper or quoting is removed, this
; follows the language-range rule in [RFC4647]
; It should say:
lang-range-quoted = astring
; Once any literal wrapper or quoting is removed, this
; follows the language-range rule in [RFC4647],
; or is the 7-character string "default"
; Notes:
;
; This change makes the ABNF comment match the prose and example in section 3.2.
; ############################################################################
; Crispin & Murchison Standards Track [Page 13]
; RFC 5256 IMAP Sort June 2008
;
; ...
;
; 5. Formal Syntax of SORT and THREAD Commands and Responses
;
; The following syntax specification uses the Augmented Backus-Naur
; Form (ABNF) notation as specified in [ABNF]. It also uses [ABNF]
; rules defined in [IMAP].
sort = ["UID" SP] "SORT" SP sort-criteria SP search-criteria
sort-criteria = "(" sort-criterion *(SP sort-criterion) ")"
sort-criterion = ["REVERSE" SP] sort-key
sort-key = "ARRIVAL" / "CC" / "DATE" / "FROM" / "SIZE" /
"SUBJECT" / "TO"
thread = ["UID" SP] "THREAD" SP thread-alg SP search-criteria
thread-alg = "ORDEREDSUBJECT" / "REFERENCES" / thread-alg-ext
thread-alg-ext = atom
; New algorithms MUST be registered with IANA
search-criteria = charset 1*(SP search-key)
charset = atom / quoted
; CHARSET values MUST be registered with IANA
sort-data = "SORT" *(SP nz-number)
thread-data = "THREAD" [SP 1*thread-list]
; Crispin & Murchison Standards Track [Page 14]
; RFC 5256 IMAP Sort June 2008
thread-list = "(" (thread-members / thread-nested) ")"
thread-members = nz-number *(SP nz-number) [SP thread-nested]
thread-nested = 2*thread-list
; The following syntax describes base subject extraction rules (2)-(6):
subject = *subj-leader [subj-middle] *subj-trailer
subj-refwd = ("re" / ("fw" ["d"])) *WSP [subj-blob] ":"
subj-blob = "[" *BLOBCHAR "]" *WSP
subj-fwd = subj-fwd-hdr subject subj-fwd-trl
subj-fwd-hdr = "[fwd:"
subj-fwd-trl = "]"
subj-leader = (*subj-blob subj-refwd) / WSP
subj-middle = *subj-blob (subj-base / subj-fwd)
; last subj-blob is subj-base if subj-base would
; otherwise be empty
subj-trailer = "(fwd)" / WSP
subj-base = NONWSP *(*WSP NONWSP)
; can be a subj-blob
BLOBCHAR = %x01-5a / %x5c / %x5e-ff
; any CHAR8 except '[' and ']'.
; SHOULD comply with [UTF-8]
NONWSP = %x01-08 / %x0a-1f / %x21-ff
; any CHAR8 other than WSP.
; SHOULD comply with [UTF-8]
; ############################################################################
; Leiba & Melnikov Standards Track [Page 18]
; RFC 5258 IMAP4 LIST Command Extensions June 2008
;
; ...
;
; 6. Formal Syntax
;
; The following syntax specification uses the Augmented Backus-Naur
; Form (ABNF) as described in [ABNF]. Terms not defined here are taken
; from [IMAP4]. In particular, note that the version of "mailbox-list"
; below, which defines the payload of the LIST response, updates the
; version defined in the IMAP specification. It is pointed to by
; "mailbox-data", which is defined in [IMAP4].
;
; "vendor-token" is defined in [ACAP]. Note that this normative
; reference to ACAP will be an issue in moving this spec forward, since
; it introduces a dependency on ACAP. The definitions of
; "vendor-token" and of the IANA registry must eventually go somewhere
; else, in a document that can be moved forward on the standards track
; independently of ACAP.
;
;
; Leiba & Melnikov Standards Track [Page 19]
; RFC 5258 IMAP4 LIST Command Extensions June 2008
childinfo-extended-item = "CHILDINFO" SP "("
list-select-base-opt-quoted
*(SP list-select-base-opt-quoted) ")"
; Extended data item (mbox-list-extended-item)
; returned when the RECURSIVEMATCH
; selection option is specified.
; Note 1: the CHILDINFO tag can be returned
; with and without surrounding quotes, as per
; mbox-list-extended-item-tag production.
; Note 2: The selection options are always returned
; quoted, unlike their specification in
; the extended LIST command.
child-mbox-flag = "\HasChildren" / "\HasNoChildren"
; attributes for CHILDREN return option, at most one
; possible per LIST response
eitem-standard-tag = atom
; a tag for extended list data defined in a Standard
; Track or Experimental RFC.
eitem-vendor-tag = vendor-token "-" atom
; a vendor-specific tag for extended list data
list = "LIST" [SP list-select-opts] SP mailbox SP mbox-or-pat
[SP list-return-opts]
list-return-opts = "RETURN" SP
"(" [return-option *(SP return-option)] ")"
; list return options, e.g., CHILDREN
list-select-base-opt = "SUBSCRIBED" / option-extension
; options that can be used by themselves
list-select-base-opt-quoted = DQUOTE list-select-base-opt DQUOTE
list-select-independent-opt = "REMOTE" / option-extension
; options that do not syntactically interact with
; other options
list-select-mod-opt = "RECURSIVEMATCH" / option-extension
; options that require a list-select-base-opt
; to also be present
list-select-opt = list-select-base-opt / list-select-independent-opt
/ list-select-mod-opt
; An option registration template is described in
; Section 9.3 of this document.
; Leiba & Melnikov Standards Track [Page 20]
; RFC 5258 IMAP4 LIST Command Extensions June 2008
list-select-opts = "(" [
(*(list-select-opt SP) list-select-base-opt
*(SP list-select-opt))
/ (list-select-independent-opt
*(SP list-select-independent-opt))
] ")"
; Any number of options may be in any order.
; If a list-select-mod-opt appears, then a
; list-select-base-opt must also appear.
; This allows these:
; ()
; (REMOTE)
; (SUBSCRIBED)
; (SUBSCRIBED REMOTE)
; (SUBSCRIBED RECURSIVEMATCH)
; (SUBSCRIBED REMOTE RECURSIVEMATCH)
; But does NOT allow these:
; (RECURSIVEMATCH)
; (REMOTE RECURSIVEMATCH)
mailbox-list = "(" [mbx-list-flags] ")" SP
(DQUOTE QUOTED-CHAR DQUOTE / nil) SP mailbox
[SP mbox-list-extended]
; This is the list information pointed to by the ABNF
; item "mailbox-data", which is defined in [IMAP4]
mbox-list-extended = "(" [mbox-list-extended-item
*(SP mbox-list-extended-item)] ")"
mbox-list-extended-item = mbox-list-extended-item-tag SP
tagged-ext-val
mbox-list-extended-item-tag = astring
; The content MUST conform to either "eitem-vendor-tag"
; or "eitem-standard-tag" ABNF productions.
; A tag registration template is described in this
; document in Section 9.5.
mbx-list-oflag =/ child-mbox-flag / "\Subscribed" / "\Remote"
mbx-list-sflag =/ "\NonExistent"
mbox-or-pat = list-mailbox / patterns
option-extension = (option-standard-tag / option-vendor-tag)
[SP option-value]
; Leiba & Melnikov Standards Track [Page 21]
; RFC 5258 IMAP4 LIST Command Extensions June 2008
option-standard-tag = atom
; an option defined in a Standards Track or
; Experimental RFC
option-val-comp = astring /
option-val-comp *(SP option-val-comp) /
"(" option-val-comp ")"
option-value = "(" option-val-comp ")"
option-vendor-tag = vendor-token "-" atom
; a vendor-specific option, non-standard
patterns = "(" list-mailbox *(SP list-mailbox) ")"
return-option = "SUBSCRIBED" / "CHILDREN" / option-extension
tagged-ext-comp = astring /
tagged-ext-comp *(SP tagged-ext-comp) /
"(" tagged-ext-comp ")"
; Extensions that follow this general
; syntax should use nstring instead of
; astring when appropriate in the context
; of the extension.
; Note that a message set or a "number"
; can always be represented as an "atom".
; A URL should be represented as
; a "quoted" string.
tagged-ext-simple = sequence-set / number
tagged-ext-val = tagged-ext-simple /
"(" [tagged-ext-comp] ")"
; ############################################################################
; Melnikov & Coates Standards Track [Page 19]
; RFC 5259 IMAP CONVERT extension July 2008
;
; ...
;
; 10. Formal Syntax
;
; The following syntax specification uses the augmented Backus-Naur
; Form (ABNF) notation as used in [ABNF], and incorporates by reference
; the core rules defined in that document.
;
; This syntax augments the grammar specified in [RFC3501] and
; [RFC3516]. Non-terminals not defined in this document can be found
; in [RFC3501], [RFC3516], [IMAPABNF], [MIME-MTSRP], and
; [MEDIAFEAT-REG].
command-select =/ convert
uid =/ "UID" SP convert
; Unique identifiers used instead of message
; sequence numbers
convert = "CONVERT" SP sequence-set SP convert-params SP
( convert-att /
"(" convert-att *(SP convert-att) ")" )
convert-att = "UID" /
"BODYPARTSTRUCTURE" section-convert /
"BINARY" section-convert [partial] /
"BINARY.SIZE" section-convert /
"BODY[HEADER]" /
"BODY[" section-part ".HEADER]" /
"BODY[" section-part ".MIME]" /
"AVAILABLECONVERSIONS" section-convert
; <partial> is defined in [RFC3516].
; <section-part> is defined in [RFC3501].
; Melnikov & Coates Standards Track [Page 20]
; RFC 5259 IMAP CONVERT extension July 2008
convert-params = "(" (quoted-to-mime-type / default-conversion)
[SP "(" transcoding-params ")"] ")"
quoted-to-mime-type = DQUOTE to-mime-type DQUOTE
transcoding-params = transcoding-param
*(SP transcoding-param)
transcoding-param-names = transcoding-param-name
*(SP transcoding-param-name)
transcoding-param = transcoding-param-name SP
transcoding-param-value
transcoding-param-name = astring
; <transcod-param-name-nq> represented as a quoted,
; literal or atom. Note that
; <transcod-param-name-nq> allows for "%", which is
; not allowed in atoms. Such values must be
; represented as quoted or literal.
transcod-param-name-nq = Feature-tag
; <Feature-tag> is defined in [MEDIAFEAT-REG].
transcoding-param-value = astring
default-conversion = "NIL"
message-data =/ nz-number SP "CONVERTED" SP convert-correlator
SP convert-msg-attrs
convert-correlator = "(" "TAG" SP tag-string ")"
tag-string = string
; tag of the command that caused
; the CONVERTED response, sent as
; a string.
convert-msg-attrs = "(" convert-msg-att *(SP convert-msg-att) ")"
; "UID" MUST be the first data item, if present.
convert-msg-att = msg-att-semistat / msg-att-conv-static
msg-att-conv-static = "UID" SP uniqueid
; MUST NOT change for a message
; Melnikov & Coates Standards Track [Page 21]
; RFC 5259 IMAP CONVERT extension July 2008
msg-att-semistat =
( "BINARY" section-convert ["<" number ">"] SP
(nstring / literal8 / converterror-phrase) ) /
( "BINARY.SIZE" section-convert SP
(number / converterror-phrase) ) /
( "BODYPARTSTRUCTURE" section-convert SP
(body / converterror-phrase) ) /
( "AVAILABLECONVERSIONS" section-convert SP
(mimetype-list / converterror-phrase) )
; MUST NOT change during an IMAP "session",
; but not necessarily static in the long term.
section-convert = section-binary
; <section-binary> is defined in [RFC3516].
;
; Note that unlike [RFC3516], conversion
; of a top level multipart/* is allowed.
resp-text-code =/ "TEMPFAIL" /
"MAXCONVERTMESSAGES" SP nz-number /
"MAXCONVERTPARTS" SP nz-number
; <resp-text-code> is defined in [RFC3501].
mimetype-and-params = quoted-to-mime-type
[SP "(" transcoding-params ")"]
; always includes a specific MIME type
mimetype-list = "(" "(" [quoted-to-mime-type
*(SP quoted-to-mime-type)] ")" ")"
; Unordered list of MIME types. It can be empty.
;
; Two levels of parenthesis is needed to distinguish this
; data from <converterror-phrase>.
converterror-phrase = "(" "ERROR" SP
convert-err-descript SP convert-error-code ")"
convert-error-code = "TEMPFAIL" [SP nz-number]
/ bad-params
/ missing-params
convert-err-descript = string
; Human-readable text explaining the conversion error.
; The default charset is US-ASCII, unless
; the LANGUAGE command [IMAP-I18N] is called, when
; the charset changes to UTF-8.
quoted-from-mime-type = DQUOTE from-concrete-mime-type DQUOTE
; Melnikov & Coates Standards Track [Page 22]
; RFC 5259 IMAP CONVERT extension July 2008
bad-params = "BADPARAMETERS"
1*(SP (quoted-from-mime-type / nil)
SP mimetype-and-params)
; nil is only returned when the body part doesn't exist.
missing-params = "MISSINGPARAMETERS"
1*(SP quoted-from-mime-type SP
mimetype-and-missing-params)
mimetype-and-missing-params = quoted-to-mime-type
"(" transcoding-param-names ")"
; always includes a specific MIME type
concrete-mime-type = type-name "/" subtype-name
; i.e., "type/subtype".
; type-name and subtype-name
; are defined in [MIME-MTSRP].
from-concrete-mime-type = concrete-mime-type
to-mime-type = concrete-mime-type
command-auth =/ conversions-cmd
conversions-cmd = "CONVERSIONS" SP from-mime-type-req SP
to-mime-type-req
from-mime-type-req = astring
; "mime-type-req" represented as IMAP <atom>,
; <quoted> or <literal>
to-mime-type-req = astring
; <mime-type-req> represented as IMAP <atom>,
; <quoted> or <literal>.
; Note that <mime-type-req> allows for "*",
; which is not allowed in <atom>. Such values must
; be represented as <quoted> or <literal>.
any-mime-type = "*"
mime-type-req = any-mime-type /
(type-name "/" any-mime-type) /
concrete-mime-type
; '*', 'type/*' or 'type/subtype'.
; type-name is defined in [MIME-MTSRP].
response-payload =/ conversion-data
; Melnikov & Coates Standards Track [Page 23]
; RFC 5259 IMAP CONVERT extension July 2008
conversion-data = "CONVERSION" SP quoted-from-mime-type SP
quoted-to-mime-type
[SP "(" transcoding-param-name
*(SP transcoding-param-name) ")"]
; ############################################################################
; Cridland & King Standards Track [Page 11]
; RFC 5267 IMAP CONTEXT July 2008
;
;
; 5. Formal Syntax
;
; The collected formal syntax. This uses ABNF as defined in [ABNF].
; It includes definitions from [IMAP], [IMAP-ABNF], and [SORT].
capability =/ "CONTEXT=SEARCH" / "CONTEXT=SORT" / "ESORT"
;; <capability> from [IMAP]
command-select =/ "CANCELUPDATE" 1*(SP quoted)
;; <command-select> from [IMAP]
context-position = number
;; Context position may be 0 for SEARCH result additions.
;; <number> from [IMAP]
modifier-context = "CONTEXT"
modifier-partial = "PARTIAL" SP partial-range
partial-range = nz-number ":" nz-number
;; A range 500:400 is the same as 400:500.
;; This is similar to <seq-range> from [IMAP],
;; but cannot contain "*".
modifier-update = "UPDATE"
search-return-opt =/ modifier-context / modifier-partial /
modifier-update
;; All conform to <search-return-opt>, from [IMAP-ABNF]
resp-text-code =/ "NOUPDATE" SP quoted
;; <resp-text-code> from [IMAP]
ret-data-addto = "ADDTO"
SP "(" context-position SP sequence-set
*(SP context-position SP sequence-set)
")"
;; <sequence-set> from [IMAP]
ret-data-partial = "PARTIAL"
SP "(" partial-range SP partial-results ")"
;; <partial-range> is the requested range.
partial-results = sequence-set / "NIL"
;; <sequence-set> from [IMAP]
;; NIL indicates no results correspond to the requested range.
; Cridland & King Standards Track [Page 12]
; RFC 5267 IMAP CONTEXT July 2008
ret-data-removefrom = "REMOVEFROM"
SP "(" context-position SP sequence-set
*(SP context-position SP sequence-set)
")"
;; <sequence-set> from [IMAP]
search-return-data =/ ret-data-partial / ret-data-addto /
ret-data-removefrom
;; All conform to <search-return-data>, from [IMAP-ABNF]
sort =/ extended-sort
;; <sort> from [SORT]
extended-sort = ["UID" SP] "SORT" search-return-opts
SP sort-criteria SP search-criteria
;; <search-return-opts> from [IMAP-ABNF]
;; <sort-criteria> and <search-criteria> from [SORT]
; ############################################################################
; Daboo Standards Track [Page 13]
; RFC 5464 The IMAP METADATA Extension February 2009
;
; ...
;
; 5. Formal Syntax
;
; The following syntax specification uses the Augmented Backus-Naur
; Form (ABNF) notation as specified in [RFC5234].
;
; Non-terminals referenced but not defined below are as defined by
; [RFC3501], with the new definitions in [RFC4466] superseding those in
; [RFC3501].
;
; Except as noted otherwise, all alphabetic characters are case-
; insensitive. The use of upper or lower case characters to define
; token strings is for editorial clarity only. Implementations MUST
; accept these strings in a case-insensitive fashion.
capability =/ "METADATA" / "METADATA-SERVER"
; defines the capabilities for this extension.
command-auth =/ setmetadata / getmetadata
; adds to original IMAP command
entries = entry /
"(" entry *(SP entry) ")"
; entry specifiers
entry = astring
; slash-separated path to entry
; MUST NOT contain "*" or "%"
entry-value = entry SP value
entry-values = "(" entry-value *(SP entry-value) ")"
; Daboo Standards Track [Page 14]
; RFC 5464 The IMAP METADATA Extension February 2009
entry-list = entry *(SP entry)
; list of entries used in unsolicited
; METADATA response
getmetadata = "GETMETADATA" [SP getmetadata-options]
SP mailbox SP entries
; empty string for mailbox implies
; server annotation.
getmetadata-options = "(" getmetadata-option
*(SP getmetadata-option) ")"
getmetadata-option = tagged-ext-label [SP tagged-ext-val]
; tagged-ext-label and tagged-ext-val
; are defined in [RFC4466].
maxsize-opt = "MAXSIZE" SP number
; Used as a getmetadata-option
metadata-resp = "METADATA" SP mailbox SP
(entry-values / entry-list)
; empty string for mailbox implies
; server annotation.
response-payload =/ metadata-resp
; adds to original IMAP data responses
resp-text-code =/ "METADATA" SP "LONGENTRIES" SP number
; new response codes for GETMETADATA
resp-text-code =/ "METADATA" SP ("MAXSIZE" SP number /
"TOOMANY" / "NOPRIVATE")
; new response codes for SETMETADATA
; failures
scope-opt = "DEPTH" SP ("0" / "1" / "infinity")
; Used as a getmetadata-option
setmetadata = "SETMETADATA" SP mailbox
SP entry-values
; empty string for mailbox implies
; server annotation.
value = nstring / literal8
; ############################################################################
; Gulbrandsen, et al. Standards Track [Page 16]
; RFC 5465 IMAP NOTIFY Extension February 2009
;
;
; 8. Formal Syntax
;
; The following syntax specification uses the Augmented Backus-Naur
; Form (ABNF) notation as specified in [RFC5234]. [RFC3501] defines
; the non-terminals "capability", "command-auth", "mailbox", "mailbox-
; data", "resp-text-code", and "search-key". The "modifier-update"
; non-terminal is defined in [RFC5267]. "mbx-list-oflag" is defined in
; [RFC3501] and updated by [RFC5258].
;
; Except as noted otherwise, all alphabetic characters are case-
; insensitive. The use of upper or lower case characters to define
; token strings is for editorial clarity only. Implementations MUST
; accept these strings in a case-insensitive fashion. For example, the
; <filter-mailboxes-selected> non-terminal value "SELECTED" must be
; treated in the same way as "Selected" or "selected".
capability =/ "NOTIFY"
command-auth =/ notify
notify = "NOTIFY" SP
(notify-set / notify-none)
notify-set = "SET" [status-indicator] SP event-groups
; Replace registered notification events
; with the specified list of events
notify-none = "NONE"
; Cancel all registered notification
; events. The client is not interested
; in receiving any events.
status-indicator = SP "STATUS"
one-or-more-mailbox = mailbox / many-mailboxes
many-mailboxes = "(" mailbox *(SP mailbox) ")"
event-groups = event-group *(SP event-group)
event-group = "(" filter-mailboxes SP events ")"
;; Only <message-event>s are allowed in <events>
;; when <filter-mailboxes-selected> is used.
filter-mailboxes = filter-mailboxes-selected /
filter-mailboxes-other
; Gulbrandsen, et al. Standards Track [Page 17]
; RFC 5465 IMAP NOTIFY Extension February 2009
filter-mailboxes-other = "inboxes" / "personal" / "subscribed" /
( "subtree" SP one-or-more-mailbox ) /
( "mailboxes" SP one-or-more-mailbox )
filter-mailboxes-selected = "selected" / "selected-delayed"
;; Apply to the currently selected mailbox only.
;; Only one of them can be specified in a NOTIFY
;; command.
events = ( "(" event *(SP event) ")" ) / "NONE"
;; As in [MSGEVENT].
;; "NONE" means that the client does not wish
;; to receive any events for the specified
;; mailboxes.
event = message-event /
mailbox-event / user-event / event-ext
message-event = ( "MessageNew" [SP
"(" fetch-att *(SP fetch-att) ")" ] )
/ "MessageExpunge"
/ "FlagChange"
/ "AnnotationChange"
;; "MessageNew" includes "MessageAppend" from
;; [MSGEVENT]. "FlagChange" is any of
;; "MessageRead", "MessageTrash", "FlagsSet",
;; "FlagsClear" [MSGEVENT]. "MessageExpunge"
;; includes "MessageExpire" [MSGEVENT].
;; MessageNew and MessageExpunge MUST always
;; be specified together. If FlagChange is
;; specified, then MessageNew and MessageExpunge
;; MUST be specified as well.
;; The fett-att list may only be present for the
;; SELECTED/SELECTED-DELAYED mailbox filter
;; (<filter-mailboxes>).
mailbox-event = "MailboxName" /
"SubscriptionChange" / "MailboxMetadataChange"
; "SubscriptionChange" includes
; MailboxSubscribe and MailboxUnSubscribe.
; "MailboxName" includes MailboxCreate,
; "MailboxDelete" and "MailboxRename".
user-event = "ServerMetadataChange"
event-ext = atom
;; For future extensions
; Gulbrandsen, et al.