Телекоммуникационные технологии. Том 1

Формальный синтаксис


Последующая синтаксическая спецификация использует нотацию Бакуса-Наура (BNF - Backus-Naur Form), как это описано в [RFC-822] с одним исключением, разделителем, используемым в конструкции "#", служит одиночный пробел (SPACE), а не одна или более запятых.

В случае альтернативных или опционных правил, в которых последующее правило перекрывается с более ранним, более приоритетным считается правило, встретившееся первым. Некоторые, но не все случаи таких правил представлены ниже. Если не указано обратного, все буквенные символы не зависят от использования строчных или прописных букв. Конкретные программные реализации должны воспринимать такие строки при любом написании.

address ::= "(" addr_name SPACE addr_adl SPACE addr_mailbox SPACE addr_host ")"

addr_adl ::= nstring

;; Хранит маршрут из route-addr [RFC-822], если не равно нулю

addr_host ::= nstring

;; NIL указывает на синтаксис группы [RFC-822].

;; В противном случае, содержит имя домена [RFC-822]

addr_mailbox ::= nstring

;; NIL индицирует конец группы [RFC-822]; если не NIL, а addr_host равно NIL,

;; содержит имя группы ;; [RFC-822].

;; В противном случае, содержит локальную часть [RFC-822]

addr_name ::= nstring



;; Содержит фразу из почтового ящика [RFC-822], если не NIL

alpha ::= "A" / "B" / "C" / "D" / "E" / "F" / "G" / "H" /

"I" / "J" / "K" / "L" / "M" / "N" / "O" / "P" /

"Q" / "R" / "S" / "T" / "U" / "V" / "W" / "X" /

"Y" / "Z" /

"a" / "b" / "c" / "d" / "e" / "f" / "g" / "h" /

"i" / "j" / "k" / "l" / "m" / "n" / "o" / "p" /

"q" / "r" / "s" / "t" / "u" / "v" / "w" / "x" /



"y" / "z"

;; Чувствительно к набору строчными или прописными буквами

append ::= "APPEND" SPACE mailbox [SPACE flag_list]

[SPACE date_time] SPACE literal

astring ::= atom / string

atom ::= 1*ATOM_CHAR

ATOM_CHAR ::=

atom_specials ::= "(" / ")" / "{" / SPACE / CTL / list_wildcards /

quoted_specials

authenticate ::= "AUTHENTICATE" SPACE auth_type *(CRLF base64)

auth_type ::= atom

;; Определено в [IMAP-AUTH]

base64 ::= *(4base64_char) [base64_terminal]

base64_char ::= alpha / digit / "+" / "/"

base64_terminal ::= (2base64_char "==") / (3base64_char "=")

body ::= "(" body_type_1part / body_type_mpart ")"

body_extension ::= nstring / number / "(" 1#body_extension ")"

;; Будущее расширение. Реализации клиента должны воспринимать поля

;; body_extension. Реализации сервера не должны генерировать

;; поля body_extension, за исключением случаев, закрепленных в будущих

;; стандартах или зарегистрированных модификациях уже существующих норм.

body_ext_1part ::= body_fld_md5 [SPACE body_fld_dsp

[SPACE body_fld_lang

[SPACE 1#body_extension]]]

;; не должны присылаться при non-extensible доставке "BODY"

body_ext_mpart ::= body_fld_param

[SPACE body_fld_dsp SPACE body_fld_lang

[SPACE 1#body_extension]]

;; MUST NOT be returned on non-extensible "BODY" fetch

body_fields ::= body_fld_param SPACE body_fld_id SPACE

body_fld_desc SPACE body_fld_enc SPACE

body_fld_octets

body_fld_desc ::= nstring

body_fld_dsp ::= "(" string SPACE body_fld_param ")" / nil

body_fld_enc ::= ( ("7BIT" / "8BIT" / "BINARY" / "BASE64"/

"QUOTED-PRINTABLE") ) / string

body_fld_id ::= nstring

body_fld_lang ::= nstring / "(" 1#string ")"

body_fld_lines ::= number

body_fld_md5 ::= nstring

body_fld_octets ::= number

body_fld_param ::= "(" 1#(string SPACE string) ")" / nil



body_type_1part ::= (body_type_basic / body_type_msg / body_type_text)

[SPACE body_ext_1part]

body_type_basic ::= media_basic SPACE body_fields

;; субтип MESSAGE не должен следовать "RFC822"

body_type_mpart ::= 1*body SPACE media_subtype

[SPACE body_ext_mpart]

body_type_msg ::= media_message SPACE body_fields SPACE envelope

SPACE body SPACE body_fld_lines

body_type_text ::= media_text SPACE body_fields SPACE body_fld_lines

capability ::= "AUTH=" auth_type / atom

;; Новая возможность должна начинаться с "X" или быть зарегистрирована

;; IANA в качестве стандарта или являться усовершенствованием

;; существующего стандарта

capability_data ::= "CAPABILITY" SPACE [1#capability SPACE] "IMAP4rev1"

[SPACE 1#capability]

;; серверы IMAP 4.1, которые предлагают совместимость с RFC 1730

;; должны включать "IMAP4" в список возможностей этой реализации

CHAR ::=

0x01 - 0x7f>

CHAR8 ::=

command ::= tag SPACE (command_any / command_auth /

command_nonauth / command_select) CRLF

;; Modal based on state

command_any ::= "CAPABILITY" / "LOGOUT" / "NOOP" / x_command

;; Справедливо для всех состояний

command_auth ::= append / create / delete / examine / list / lsub /

rename / select / status / subscribe / unsubscribe

;; Работает только в состояниях Authenticated или Selected

command_nonauth ::= login / authenticate

;; Работает только в состоянии Non-Authenticated

command_select ::= "CHECK" / "CLOSE" / "EXPUNGE" /

copy / fetch / store / uid / search

;; Работает только в состоянии Selected

continue_req ::= "+" SPACE (resp_text / base64)

copy ::= "COPY" SPACE set SPACE mailbox

CR ::=

create ::= "CREATE" SPACE mailbox

;; Использование INBOX не приводит к ошибке

CRLF ::= CR LF

CTL ::=

0x00 - 0x1f, 0x7f>

date ::= date_text / date_text

date_day ::= 1*2digit

;; День месяца

date_day_fixed ::= (SPACE digit) / 2digit



;; Версия с фиксированным форматом date_day

date_month ::= "Jan" / "Feb" / "Mar" / "Apr" / "May" / "Jun" /

"Jul" / "Aug" / "Sep" / "Oct" / "Nov" / "Dec"

date_text ::= date_day "-" date_month "-" date_year

date_year ::= 4digit

date_time ::= date_day_fixed "-" date_month "-" date_year

SPACE time SPACE zone

delete ::= "DELETE" SPACE mailbox

;; Использование INBOX не приводит к ошибке

digit ::= "0" / digit_nz

digit_nz ::= "1" / "2" / "3" / "4" / "5" / "6" / "7" / "8" / "9"

envelope ::= "(" env_date SPACE env_subject SPACE env_from

SPACE env_sender SPACE env_reply_to SPACE env_to

SPACE env_cc SPACE env_bcc SPACE env_in_reply_to

SPACE 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" SPACE mailbox

fetch ::= "FETCH" SPACE set SPACE ("ALL" / "FULL" /

"FAST" / fetch_att / "(" 1#fetch_att ")")

fetch_att ::= "ENVELOPE" / "FLAGS" / "INTERNALDATE" /

"RFC822" [".HEADER" / ".SIZE" / ".TEXT"] /

"BODY" ["STRUCTURE"] / "UID" /

"BODY" [".PEEK"] section

[""]

flag ::= "\Answered" / "\Flagged" / "\Deleted" /

"\Seen" / "\Draft" / flag_keyword / flag_extension



flag_extension ::= "\" atom

;; Будущее расширение. Реализации клиента должны воспринимать

;; флаги flag_extension. Реализации сервера не должны генерировать

;; флаги flag_extension, за исключением случаев, определенных в

;; будущих стандартах или зарегистрированных модификациях

;; данной спецификации.

flag_keyword ::= atom

flag_list ::= "(" #flag ")"

greeting ::= "*" SPACE (resp_cond_auth / resp_cond_bye) CRLF

header_fld_name ::= astring

header_list ::= "(" 1#header_fld_name ")"

LF ::=

list ::= "LIST" SPACE mailbox SPACE list_mailbox

list_mailbox ::= 1*(ATOM_CHAR / list_wildcards) / string

list_wildcards ::= "%" / "*"

literal ::= "{" number "}" CRLF *CHAR8

;; Число характеризует количество октетов CHAR8

login ::= "LOGIN" SPACE userid SPACE password

lsub ::= "LSUB" SPACE mailbox SPACE list_mailbox

mailbox ::= "INBOX" / astring

;; INBOX не чувствителен к использованию строчных или прописных букв.

;; все версии написания INBOX (напр., "iNbOx") должны

;; интерпретироваться как INBOX, а не как строку.

mailbox_data ::= "FLAGS" SPACE flag_list /

"LIST" SPACE mailbox_list /

"LSUB" SPACE mailbox_list /

"MAILBOX" SPACE text /

"SEARCH" [SPACE 1#nz_number] /

"STATUS" SPACE mailbox SPACE

"(" #

number SPACE "EXISTS" / number SPACE "RECENT"

mailbox_list ::= "(" #("\Marked" / "\Noinferiors" /

"\Noselect" / "\Unmarked" / flag_extension) ")"

SPACE ( QUOTED_CHAR / nil) SPACE mailbox

media_basic ::= ( ("APPLICATION" / "AUDIO" / "IMAGE" /

"MESSAGE" / "VIDEO") ) / string)

SPACE media_subtype

;; Определено в [MIME-IMT]

media_message ::= "MESSAGE" SPACE

"RFC822"

;; Определено в [MIME-IMT]



media_subtype ::= string

;; Определено в [MIME-IMT]

media_text ::= "TEXT" SPACE media_subtype

;; Определено в [MIME-IMT]

message_data ::= nz_number SPACE ("EXPUNGE" /

("FETCH" SPACE msg_att))

msg_att ::= "(" 1#("ENVELOPE" SPACE envelope /

"FLAGS" SPACE "(" #(flag / "\Recent") ")" /

"INTERNALDATE" SPACE date_time /

"RFC822" [".HEADER" / ".TEXT"] SPACE nstring /

"RFC822.SIZE" SPACE number /

"BODY" ["STRUCTURE"] SPACE body /

"BODY" section [""] SPACE nstring /

"UID" SPACE uniqueid) ")"

nil ::= "NIL"

nstring ::= string / nil

number ::= 1*digit

;; 32- битное целое число без знака

;; (0

nz_number ::= digit_nz *digit

;; 32-битное не равное нулю целое число без знака

;; (0 < n < 4,294,967,296)

password ::= astring

quoted ::= *QUOTED_CHAR

QUOTED_CHAR ::= /

"\" quoted_specials

quoted_specials ::= / "\"

rename ::= "RENAME" SPACE mailbox SPACE mailbox

;; Использование INBOX в качестве места назначения не дает ошибки

response ::= *(continue_req / response_data) response_done

response_data ::= "*" SPACE (resp_cond_state / resp_cond_bye /

mailbox_data / message_data / capability_data)

CRLF

response_done ::= response_tagged / response_fatal

response_fatal ::= "*" SPACE resp_cond_bye CRLF

;; Сервер закрывает соединение немедленно

response_tagged ::= tag SPACE resp_cond_state CRLF

resp_cond_auth ::= ("OK" / "PREAUTH") SPACE resp_text

;; Условие аутентификации

resp_cond_bye ::= "BYE" SPACE resp_text

resp_cond_state ::= ("OK" / "NO" / "BAD") SPACE resp_text

;; Условие состояния

resp_text ::= ["[" resp_text_code "]" SPACE] (text_mime2 / text)

;; текст не должен начинаться с "[" или "="



resp_text_code ::= "ALERT" / "PARSE" /

"PERMANENTFLAGS" SPACE "(" #(flag / "\*") ")" /

"READ-ONLY" / "READ-WRITE" / "TRYCREATE" /

"UIDVALIDITY" SPACE nz_number /

"UNSEEN" SPACE nz_number /

atom [SPACE 1*]

search ::= "SEARCH" SPACE ["CHARSET" SPACE astring SPACE]

1#search_key

;; Символьный набор [CHARSET] должен быть зарегистрирован IANA

search_key ::= "ALL" / "ANSWERED" / "BCC" SPACE astring /

"BEFORE" SPACE date / "BODY" SPACE astring /

"CC" SPACE astring / "DELETED" / "FLAGGED" /

"FROM" SPACE astring /

"KEYWORD" SPACE flag_keyword / "NEW" / "OLD" /

"ON" SPACE date / "RECENT" / "SEEN" /

"SINCE" SPACE date / "SUBJECT" SPACE astring /

"TEXT" SPACE astring / "TO" SPACE astring /

"UNANSWERED" / "UNDELETED" / "UNFLAGGED" /

"UNKEYWORD" SPACE flag_keyword / "UNSEEN" /

;; Выше этой строки все в [IMAP2]

"DRAFT" /

"HEADER" SPACE header_fld_name SPACE astring /

"LARGER" SPACE number / "NOT" SPACE search_key /

"OR" SPACE search_key SPACE search_key /

"SENTBEFORE" SPACE date / "SENTON" SPACE date /

"SENTSINCE" SPACE date / "SMALLER" SPACE number /

"UID" SPACE set / "UNDRAFT" / set /

"(" 1#search_key ")"

section ::= "[" [section_text / (nz_number *["." nz_number]

["." (section_text / "MIME")])] "]"

section_text ::= "HEADER" / "HEADER.FIELDS" [".NOT"]

SPACE header_list / "TEXT"

select ::= "SELECT" SPACE mailbox

sequence_num ::= nz_number / "*"

;; * является наибольшим используемым числом.


Для порядковых номеров

;; сообщений оно равно количеству сообщений в почтовом ящике.

;; Для уникальных идентификаторов оно равно уникальному

;; идентификатору последнего сообщения в почтовом ящике./p>

set ::= sequence_num / (sequence_num ":" sequence_num) /

(set "," set)

;; Идентифицирует набор сообщений. Для порядковых номеров

;; сообщений это последовательность чисел с 1 до числа

;; сообщений в почтовом ящике.

;; Запятая разграничивает индивидуальные номера, двоеточие

;; указывает на диапазон чисел включительно.

;; Пример для почтового ящика с 15 сообщениями: 2,4:7,9,12:*

;; эквивалентно 2,4,5,6,7,9,12,13,14,15.

SPACE ::=

status ::= "STATUS" SPACE mailbox SPACE "(" 1#status_att ")"

status_att ::= "MESSAGES" / "RECENT" / "UIDNEXT" / "UIDVALIDITY" /

"UNSEEN"

store ::= "STORE" SPACE set SPACE store_att_flags

store_att_flags ::= (["+" / "-"] "FLAGS" [".SILENT"]) SPACE

(flag_list / #flag)

string ::= quoted / literal

subscribe ::= "SUBSCRIBE" SPACE mailbox

tag ::= 1*

text ::= 1*TEXT_CHAR

text_mime2 ::= "=?" "?" "?"

"?="

;; Синтаксис определен в [MIME-HDRS]

TEXT_CHAR ::=

time ::= 2digit ":" 2digit ":" 2digit

;; Часы, минуты, секунды

uid ::= "UID" SPACE (copy / fetch / search / store)

;; Уникальные идентификаторы используются вместо

;; последовательных номеров сообщения.

uniqueid ::= nz_number

;; В возрастающем порядке

unsubscribe ::= "UNSUBSCRIBE" SPACE mailbox

userid ::= astring

x_command ::= "X" atom

zone ::= ("+" / "-") 4digit

;; Число из 4 цифр со знаком hhmm, представляющее часы и минуты к западу от Гринвича

;; (Это число отличается от Universal Time). Вычитая временную зону из данного времени, можно получить

;; форму UT. Зона Universal Time равна "+0000".


Содержание раздела