
- •7.1 Формат почтовых сообщений, мiме
- •7.2 Модель работы smtp
- •Пользователь
- •7.3 Ретрансляция сообщений
- •7.4 Расширения smtp-сервиса для передачи 8-битных данных
- •7.5 Взаимодействие smtp с транспортным протоколом tcp
- •7.6 Принципы работы
- •7.7 Протокол iмар4
- •7.8 Атрибуты сообщений системы (map)
- •Основные команды
7.8 Атрибуты сообщений системы (map)
Каждое сообщение в почтовой системе для работы с 1МАРимеет уникальный идентификатор, по которому можно получить доступ к этому сообщению. Уникальный идентификаторUIDпредставляет собой 32-битное число, которое идентифицирует сообщение в данной папке. Каждому сообщению, попавшему в папку, присваивается максимальное число из UID-сообщений, попавших в данную папку ранее. Уникальные идентификаторы сообщений сохраняются от сессии к сессии и могут использоваться, например, для синхронизации каталогов мобильных пользователей.
Каждая папка в системе также имеет уникальный действительный идентификатор (UIDVALIDITY). Вместе с UID-сообщениеэта пара образует 64-битное число, идентифицирующее каждое сообщение. Если UID-сообщение сохраняется постоянным, тоUIDVALIDITYданной папки в текущей сессии должен быть больше, чем в предыдущей сессии.
Кроме уникального идентификатора, сообщение в системе IМАРимеет порядковый номер, т. е. все сообщения в данном почтовом ящике последовательно нумеруются. Если в почтовый ящик добавляется новое сообщение, ему присваивается номер на 1больше количества сообщений в почтовом ящике. При удалении какого-либо сообщения из данной папки порядковые номера всех сообщений пересчитываются, поэтому порядковый номер сообщения может меняться во время сессии. Большинство командIМАР4 работают с порядковыми номерами сообщений, а не сUID.
Помимо числовых идентификаторов, сообщениям назначаются флаги. Одни флаги могут быть действительны для данного сообщения постоянно' от сессии к сессии, другие —только в данной сессии. Наиболее употребительные из них:
"\Seen" —обозначает, что данное сообщение было прочитано
"\Answered" —на сообщение был дан ответ
"\Deleted" —сообщение помечено на удаление
"\Draft" —формирование данного сообщения еще не завершено
"\Recent" —сообщение "только что" поступило в почтовый ящик, т. е. данная сессия —первая, которая может прочитать это сообщение."\Recent" —пример флага, который не сохранится в следующей сессии
Кроме того, на сервере IМАР хранятся дата и время получения сообщения сервером. Например, если сообщение получено поSMTP, то фиксируется дата и время доставки по адресу назначения, общий размер сообщения, состав конверта (заголовка) сообщения (не путать с конвертомSMTP), структура сообщения (МIMЕ-структура).
Основные команды
Как уже было отмечено, IМАР4 —гибкий и многофункциональный протокол с широкими возможностями. Он обслуживает более 20различных команд клиента по управлению состоянием своей почты. Подробное описание всех команд и ответов 1МАР4-сервера вы можете найти, например, вRFC-2060.Далее будут описаны только некоторые из клиентских команд, и на примерах их обработки показана общая схема взаимодействия клиента и сервера IМАР4.
IМАР4поддерживает текстовые команды и ответы сервера, т. е.ASCII-последовательности символов. Строка команды или данных завершается последовательностью <CRLF>. 8-битные данные, в соответствии с спецификациейMIME, не могут передаваться по 1МАР4в "открытом" виде. Как правило, реализацииIМАР4 перед передачей двоичных данных кодируют ихbase64.
Так же как и РОРЗ-сервер, IМАР4-сервер обрабатывает команды в зависимости от одного из четырех состояний, в котором он находится:
Состояние вне аутентификации, в котором клиент должен для начала работы зарегистрироваться в сервере.
Состояние аутентификации, в котором клиент может выбрать для работы папку с сообщениями.
Состояние работы с почтовой папкой, в котором клиент производит основную работу с сообщениями.
Состояние отсоединения, в котором сервер завершает транзакцию работы клиента.
Далее при описании команд, символом "S:" будет обозначаться поток данных от сервера IМАР4,а символом "С:" —поток данных от клиента.
Команда LOGIN. После того как по транспортному протоколу (например,TCP), было установлено соединение, и от сервера пришла строка приветствия, клиент должен зарегистрироваться в системе. Для этого чаще всего используется командаLOGIN. Аргументом команды является строка с идентификатором и паролем клиента:
S: * OK IMAP4revl Service Ready
С: aOOl login ali зезат
S: aOOl OK LOGIN completed
Команда LOGINпередает пароль и идентификатор пользователя по сети в открытом виде. Если пользователю необходима защита информации своей почты, он может пользоваться командойAUTHENTICATE. Аргументом команды является строка, указывающая механизм аутентификации, которым желает воспользоваться данный пользователь. В зависимости от выбранного типа аутентификации строится дальнейший обмен между сервером и клиентом. Например, при использовании механизма шифрованияKERBEROS, аутентификация выглядит следующим образом:
S: * OK KerberosV4 JMAP4revl Server
С: AOOl AUTHENTICATE KERBEROS_V4
S: + ArnFYig ==
BAcAQU5EUkVXLkNNVS5FRFUAOCAsho84kLN3/IJmrMG+25a4DT+nZlmJjnTNHJUtxAA+o OKPKfHEcAFs9a3CL50ebe/ydHJUwYFdWwuQIMWiy61esKvjL5rL9WjXUb9MwT9bpObYLGOKilQh
S: + or//EoAAD21=
C: DiAF5A4gA+oOIALuBkAAinw ==
S: AOOl OK Kerberos V4 authentication successful
После регистрации в системе клиент должен выбрать каталог (папку) сообщений, с которым он будет работать. Выбор каталога осуществляется командой SELECT. Аргументом команды является имя почтового каталога:
С: А142 SELECT INBOX
S: * 172 EXISTS
S: * I RECENT
S: * OK [UNSEEN 12] Message 12 is first unseen
S: * OK IUIDVALIDITY 3857529045] UIDs valid
S: * FLAGS (\answered \Flagged \Deleted \Seen \Draft)
S: * OK [PERMANENTFLAGS (\Deleted \Seen \*)] Limited
S: А142 OK (READ-WRITE] SELECT completed
Сервер IMAP4, прежде чем подтвердить завершение обработки команды, передает клиенту атрибуты данного каталога. В показанном выше примере:
В папке "INBOX" — 172сообщения (строка "* 172EXISTS").
Из них одно только что поступившее (строка "*IRECENT").
Впапке есть непрочитанные сообщения, минимальный порядковый номер непрочитанного сообщения — 12(строка "*OK[UNSEEN12JMessage 12isfirstunseen").
Уникальный временный идентификатор папки INBOXв данной сессии - 3857529045(строка "*OK[UlDVALIDITY 3857529045]UIDsvalid").
Сообщения в данной папке могут иметь флаги, указанные в строке FLAGS(строка "*FLAGS(\Answered \Flagged \Deleted \Seen \Dmft)").
Клиент может менять у сообщений флаги "\Deleted"и "\Seen" (строка "*OK[PERMANENTFLAGS(\Deleted\Seen \*))Limited ").
Клиент имеет права на запись и чтение сообщений из INBOX (строка "А142OK[READ-WRITE]SELECTcompleted").
Команда SELECTустанавливает текущий каталог для работы клиента. Если пользователю необходимо получить информацию о состоянии какого-либо каталога, достаточно воспользоваться командойEXAMINEс именем каталога в качестве аргумента команды, например:
С: А932 EXAMINE blоор
S: * 17 EXISTS
Команда EXAMINEвозвращает те же параметры, что и командаSELECT, а отличается от командыSELECTтолько тем, что открывает заданный почтовый ящик исключительно на чтение.
Если необходимо запросить статус какой-либо папки, не меняя текущий каталог, можно воспользоваться командой STATUS. В качестве параметров данной команде придаются: имя папки и тип запрашиваемой информации. В зависимости от указанного типа, команда может возвращать: количество сообщений в папке, количество новых сообщений, количество непрочитанных сообщений,UIDVALIDITYкаталога,UIDследующего сообщения, которое будет добавлено в данную папку, например:
С: А042 STATUS blob (MESSAGES UNSEEN)
S: STATUS blob (MESSAGES 231 UNSEEN 12)
S: А042 OK STATUS completed
Чтобы получить список папок (подкаталогов), находящихся в определенной папке и доступных клиенту, можно воспользоваться командой LIST. Аргументами команды являются: имя каталога, список подкаталогов которого хотим получить (пустая строка — " "означает текущий каталог) и маска имен подкаталогов. Имена каталогов и маски имен подкаталогов могут интерпретироваться по-разному, в зависимости от реализации почтовой системы и структуры описания иерархии папок. Например, список папок, находящихся в корне, можно получить так:
С: А004 LIST "/" *
S: * LIST (\Noinferiors ) "/" INBOX
S: * LIST (\Noinferiors ) "/" OUTBOX
S: * LIST (\Noinferior3 ) "/" WasteBox
S: А004 OK LIST completed
Ответ сервера содержит список папок в соответствии с их положением в иерархии и флаги данных папок (флаг "\Noinferiors" означает, что внутри данной папки нет и не может быть построена иерархия).
После получения информации на каталог, пользователь может прочитать любое сообщение или определенную группу сообщений, часть сообщения или определенные атрибуты сообщения. Для этого используется команда FETCH. Аргументами данной команды являются порядковый номер сообщения и критерии запроса. Критерии содержат описание вида возвращаемой информации. Например, можно запросить части заголовков или UID-сообщенийв папке, или сообщения, имеющие или не имеющие определенные флаги. Так запрос заголовков сообщений, находящихся в INBOXс порядковыми номерами от 10до 12, будет выглядеть так:
С: А654 FETCH 10:12 BODY [HEADER]
S: * 10 FETCH (BODY[HEAEER] (350}
S: Date: Wed, 17 Jul 1996 02:23:25 -0700 (PDT)
S: From: man@globe .corn
S: Subject: Hi
S: To: imapSworld.edu
S: Message-Id; <B27397-0100000@world.edu>
S: МIМЕ-Уегsion: 1.0
S: Content-Type: TEXT/PLAIN; CHARSET-OS-ASCII
S:
S: )
S: * II FETCH ....
S: * 12 FETCH .. ..
S: A654 OK FETCH completed
После просмотра сообщения, пользователь может сохранить его с другими флагами, добавить или удалить флаги сообщения (например, пометить данное сообщение на удаление). Для этого используется команда STORE. Аргументами команды являются: номера сообщений, идентификатор операции и перечень флагов. Например, операция добавления флага удаления ("\Deleted") трем сообщениям выглядит следующим образом:
С: АООЗ STORE 2:4 +FLAGS (\Deleted)
S: * 2 FETCH FLAGS (\Deleted \Seen)
S: * 3 FETCH FLAGS (\Deleted)
S: * 4 FETCH FLAGS (\Deleted \Flagged \Seen)
S: АООЗ OK STORE completed
Ответом на выполнение команды будут переданы строки новых флагов указанных сообщений.
Пользователь также может организовать поиск сообщений по определенным критериям. Для этого используется команда SEARCH. Критерий поиска состоит из комбинации нескольких условий поиска, а результатом поиска будет множество сообщений, находящихся в пересечении указанных условий. Условия могут налагаться на состав, структуру тела или (и) заголовка сообщений, а также на флаги, размер, идентификаторы, периоды дат сообщений. Результатом работы команды является строка, состоящая из последовательных номеров сообщений, удовлетворяющих критерию поиска. Например, поиск всех непрочитанных сообщений, поступивших от "Smith" с 1-03-96будет выглядеть так:
С: А282 SEARCH UNSEEN FROM “Smith” SINCE 1-Mar-1996
S: * SEARCH 2 84 982
S: А282 OK SEARCH completed
Результатом поиска будут сообщения с последовательными номерами 2 84и 882.
IМАР4 позволяет не только искать и читать сообщения в каталогах, этот протокол позволяет добавлять, копировать и перемещать сообщения в каталоги. Добавление сообщения в папку можно осуществить командойAPPEND:
C: АООЗ APPEND saved-messages (\Seen) (310)
C: Date: Mon, 7 Fob 1997 21:52:25 -0800 (PST)
C: From: Fred Foobar <foobar@Blurdybloop.COM>
C: Subject: afternoon meeting
C: To: mooch@owatagu.siam.edu
C: Message-Id: <B27397-0100000@Blurdybloop.COM>
C: MIME-Version.: 1.0
C: Content-Type: TEXT/PLAIN; CHARSET-US-ASCII
C:
C: Hello Joe, do you think we can meet at 3:30 tomorrow?
S: АООЗ OK APPEND completed
Отметим, что команда APPENDне осуществляет доставку сообщения по указанному адресу, она только размещает в данном каталоге набор строк в виде сообщения.
Если сервер IМАР4поддерживает 8-битовые данные, можно добавлять тексты сообщений в 8-битной кодировке, иначе текст должен быть закодирован в одну из 7-битных кодировок.
Команда COPYкопирует сообщения с заданными порядковыми номерами в указанный каталог, например:
С: АООЗ COPY 2:4 MEETING
S: АООЗ OK COPY completed
Более подробное описание этих и других команд управления каталогами и сообщениями вы можете найти, например, в RFC-2060.
Пример сценария
Далее приведен простейший сценарий сессии работы 1МАР4-клиента с сервером.
S: * ОК 1МАР4 revl Service Ready
С: aООl login alladin sesam
S: aООl OK LOGIN completed
C: aОО2 select inbox
S: * 18 EXISTS