IMAP4

Up SMTP x400 pop3 IMAP4

Протокол IMAP4

Протокол IМАР4 (Internet Message Access Protocol, Version 4, Протокол доступа к электронной почте Internet, версия 4) позволяет клиентам получать Доступ и манипулировать сообщениями электронной почты на сервере.

Существенным отличием протокола IMAP4 от протокола РОРЗ является то, что IMAP4 поддерживает работу с системой каталогов (или папок) сообщений. IMAP4 позволяет управлять каталогами (папками) удаленных сообщений так же, как если бы они располагались на локальном компьютере. IMAP4 позволяет клиенту создавать, удалять и переименовывать почтовые ящики, проверять наличие новых сообщений и удалять старые. Благодаря тому что IMAP4 поддерживает механизм уникальной идентификации каждого сообщения в почтовой папке клиента, он позволяет читать из почтового ящика только сообщения, удовлетворяющие определенным условиям или их части, менять атрибуты сообщений и перемещать отдельные сообщения.

Структура папок в значительной степени зависит от типа почтовой системы, но в любой системе у клиента есть специальный каталог INBOX, куда попадают поступающие клиенту сообщения.

Принципы работы

Протокол IMAP4 работает поверх транспортного протокола, который обеспечивает надежный и достоверный канал передачи данных между клиентом и сервером IMAP4. При работе по TCP, IMAP4 использует 143-й порт. Команды и данные IMAP4 передаются по транспортному протоколу в том виде, в каком их отправляет сервер или пользователь.

Принцип передачи данных IMAP4 такой же, как и у других подобных протоколов. Сначала клиент и сервер обмениваются приветствиями. Затем клиент отправляет на сервер команды и данные. Сервер, соответственно, передает клиенту ответы на обработку команд и данных. После завершения обмена канал закрывается.

Если сервер использует таймер контроля времени соединения, он должен быть установлен не менее чем на 30-минутный промежуток "неактивности" клиента, т. е. если сервер в течение 30 минут получает хотя бы одну команду, таймер сбрасывается.

Весь обмен данными между клиентом и сервером организован в виде строк, завершающихся символами <CRLF>, либо в виде последовательности байт заданной длины. Каждая команда клиента начинается с идентификатора или тега команды. Тег, как правило, представляет собой короткую строку, состоящую из букв и цифр, (например, А0001, А0002 и т. д.). Тег является уникальным идентификатором данной команды клиента. Ответы сервера или следующие команды клиента могут ссылаться на данную команду по ее тегу.

Каждая команда клиента начинается с новой линии. В тех случаях, когда команда передает поток данных заданной длины или когда команда требует ответа с сервера, для того чтобы продолжить работу (например, при аутентификации), она может занимать несколько строк.

Строки данных, передаваемые с сервера в ответ на команду клиента, могут не содержать тег, а содержать символ "*". Это означает, что они являются

промежуточными строками потока данных ответа, а идентификатор их команды содержится в последней строке потока. В такой поток данных не может вклиниться другая команда.

Если сервер обнаружил ошибку в команде, он отправляет уведомление BAD клиенту с тегом неправильной команды. Если команда успешно обработана — возвращается уведомление ОК с тегом команды. Если команда вернула отрицательный результат, например, в случае невозможности выполнить данную команду — возвращается уведомление NO с тегом невыполненной команды.

Важной особенностью протокола IMAP является то, что взаимодействие клиента с сервером не строится по принципу "запрос-ответ", в котором каждая из сторон "ходит" по очереди. Клиент может отправить новую команду на сервер, не дожидаясь ответа на предыдущую, естественно, когда эти команды не взаимосвязаны или ответ одной не повлияет на результат другой. Сервер может обрабатывать несколько команд одновременно и отвечать на каждую из них по ее окончанию. При этом ответ на более позднюю команду может поступить раньше, поэтому ответ сервера всегда содержит тег той команды, к которой он относится.

Для работы в таком режиме, клиент и сервер должны фиксировать весь поток данных обмена, поскольку как сервер так и клиент в своих запросах и ответах могут ссылаться на команды и данные, введенные на предыдущих стадиях сессии обмена.

Для того чтобы обеспечить гибкость и многофункциональность операций работы с сообщениями, почтовые системы IMAP присваивают сообщениям определенные атрибуты.

Атрибуты сообщений системы IMAP

Каждое сообщение в почтовой системе для работы с IMAP имеет уникальный идентификатор, по которому можно получить доступ к этому сообщению. Уникальный идентификатор UID представляет собой 32-битное число, которое идентифицирует сообщение в данной папке. Каждому сообщению, попавшему в папку, присваивается максимальное число из UID-сообщений, попавших в данную папку ранее. Уникальные идентификаторы сообщений сохраняются от сессии к сессии и могут использоваться, например, для синхронизации каталогов мобильных пользователей.

Каждая папка в системе также имеет уникальный действительный идентификатор (UIDVALIDITY). Вместе с UID-сообщение эта пара образует 64-битное число, идентифицирующее каждое сообщение. Если UID-сообщение сохраняется постоянным, то UIDVALIDITY данной папки в текущей сессии Должен быть больше, чем в предыдущей сессии.

Кроме уникального идентификатора, сообщение в системе IMAP имеет порядковый номер, т. е. все сообщения в данном почтовом ящике последовательно нумеруются. Если в почтовый ящик добавляется новое сообщение, ему присваивается номер на 1 больше количества сообщении в почтовом ящике. При удалении какого-либо сообщения из данной папки порядковые номера всех сообщений пересчитываются, поэтому порядковый номер сообщения может меняться во время сессии. Большинство команд IMAP4 работают с порядковыми номерами сообщений, а не с UID.

Помимо числовых идентификаторов, сообщениям назначаются флаги. Одни флаги могут быть действительны для данного сообщения постоянно от сессии к сессии, другие — только в данной сессии. Наиболее употребительные из них:

"\Seen" — обозначает, что данное сообщение было прочитано
"\Answered" — на сообщение был дан ответ
"\Deleted" — сообщение помечено на удаление
"\Draft" — формирование данного сообщения еще не завершено
"\Recent" — сообщение "только что" поступило в почтовый ящик, т. е. данная сессия — первая, которая может прочитать это сообщение.

"\Recent" — пример флага, который не сохранится в следующей сессии

Кроме того, на сервере IMAP хранятся дата и время получения сообщения сервером. Например, если сообщение получено по SMTP, то фиксируется дата и время доставки по адресу назначения, общий размер сообщения, состав конверта (заголовка) сообщения (не путать с конвертом SMTP), структура сообщения (MIME-структура).

Основные команды

IMAP4 — гибкий и многофункциональный протокол с широкими возможностями. Он обслуживает более 20 различных команд клиента по управлению состоянием своей почты. Подробное описание всех команд и ответов IМАР4-сервера вы можете найти, в RFC-2060. Далее будут описаны только некоторые из клиентских команд, и на примерах их обработки показана общая схема взаимодействия клиента и сервера IMAP4.

IMAP4 поддерживает текстовые команды и ответы сервера, т. е. ASCII-последовательности символов. Строка команды или данных завершается последовательностью <CRLF>. 8-битные данные, в соответствии с спецификацией MIME, не могут передаваться по IMAP4 в "открытом" виде. Как правило, реализации IMAP4 перед передачей двоичных данных кодируют их base64.

Так же как и РОРЗ-сервер, 1МАР4-сервер обрабатывает команды в зависимости от одного из четырех состояний, в котором он находится:

  1. Состояние вне аутентификации, в котором клиент должен для начала работы зарегистрироваться в сервере.
  2. Состояние аутентификации, в котором клиент может выбрать для работы папку с сообщениями.
  3. Состояние работы с почтовой папкой, в котором клиент производит основную работу с сообщениями.
  4. Состояние отсоединения, в котором сервер завершает транзакцию работы клиента.

Далее при описании команд, символом "S:" будет обозначаться поток данных от сервера IMAP4, а символом "С:" — поток данных от клиента.

Команда LOGIN. После того как по транспортному протоколу (например, TCP), было установлено соединение, и от сервера пришла строка приветствия, клиент должен зарегистрироваться в системе. Для этого чаще всего используется команда LOGIN. Аргументом команды является строка с идентификатором и паролем клиента:

S: * OK IMAP4revl Service Ready

С: aOOl login ali sesaro

S: aOOl OK LOGIN completed

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

S: * OK KerberosV4 IMAP4revl Server

С: AOOl AUTHENTICATE KERBEROS_V4

S: + AmFYig==

С: BAcAQU5EUkVXLkNNVS5FRFUAOCAsho84kLN3/IJmrMG+25a4DT

+nZImJjnTNHJOtxAA+oOKPKfHEcAFs9a3CL50ebe/ydHJUwYFd

WwuQlMWiy6IesKvjL5rL9WjXUb9MwT9bpObYLGOKilQh

S: + or//EoAADZI=

C: DiAF5A4gA+oOIALuBkAAmw==

S: AOOl OK Kerberos V4 authentication successful

После регистрации в системе клиент должен выбрать каталог (папку) сообщений, с которым он будет работать. Выбор каталога осуществляется командой SELECT. Аргументом команды является имя почтового каталога:

С А142 SELECT INBOX

S * 172 EXISTS

S * 1 RECENT

S * OK [UNSEEN 12] Message 12 is first unseen

S * OK [UIDVALIDITY 3857529045] UIDs valid

S * FLAGS (\Answered \Flagged \Deleted \Seen \Draft)

S * OK [PERMANENT FLAGS (\Deleted \Seen \*)] Limited

S А142 OK [READ-WRITE] SELECT completed

Сервер IМАР4, прежде чем подтвердить завершение обработки команды, передает клиенту атрибуты данного каталога. В показанном выше примере:

1. В папке "INBOX" — 172 сообщения (строка "* 172 EXISTS").

2. Из них одно только что поступившее (строка "* 1 RECENT").

3. В папке есть непрочитанные сообщения, минимальный порядковый номер непрочитанного сообщения — 12 (строка "* OK [UNSEEN 12] Message 12 is first unseen").

4. Уникальный временный идентификатор папки INBOX в данной сессии - 3857529045 (строка "* OK [UIDVALIDITY 3857529045J UIDs valid").

5. Сообщения в данной папке могут иметь флаги, указанные в строке FLAGS (строка "* FLAGS (\Answered \Flagged \Deleted \Seen \Draft)").

6. Клиент может менять у сообщений флаги "\Deleted" и "\Seen" (строка "* OK [PERMANENTFLAGS (\Deleted \Seen \*)] Limited ").

7. Клиент имеет права на запись и чтение сообщений из INBOX (строка "А142 OK [READ-WRITE] SELECT completed").

Команда SELECT устанавливает текущий каталог для работы клиента. Если пользователю необходимо получить информацию о состоянии какого-либо каталога, достаточно воспользоваться командой EXAMINE с именем каталога в качестве аргумента команды, например:

С: А932 EXAMINE bloop

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 (XNoinferiors ) "/" WasteBox

S: А004 OK LIST completed

Ответ сервера содержит список папок в соответствии с их положением в иерархии и флаги данных папок (флаг "\Noinferiors" означает, что внутри данной папки нет и не может быть построена иерархия).

После получения информации на каталог, пользователь может прочитать любое сообщение или определенную группу сообщений, часть сообщения или определенные атрибуты сообщения. Для этого используется команда FETCH. Аргументами данной команды являются порядковый номер сообщения и критерии запроса. Критерии содержат описание вида возвращаемой информации. Например, можно запросить части заголовков или UID-сообщений в папке, или сообщения, имеющие или не имеющие определенные флаги. Так запрос заголовков сообщений, находящихся в INBOX с порядковыми номерами от 10 до 12, будет выглядеть так:

С: А654 FETCH 10:12 BODY[HEADER]

S: * 10 FETCH (BODY[HEADER] (350)

S: Date: Wed, 17 Jul 1996 02:23:25 -0700 (PDT)

S: From: manSglobe.com

S: Subject: Hi

S: To: imapSworld.edu

S: Message-Id: <[email protected]>

S: MIME-Version: 1.0

S: Content-Type: TEXT/PLAIN; CHARSET=US-ASCII

S:

S: )

S: *11 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 l-Mar-1996

S: * SEARCH 2 84 882

S: А282 OK SEARCH completed

Результатом поиска будут сообщения с последовательными номерами 2, 84 и 882.

IMAP4 позволяет не только искать и читать сообщения в каталогах, этот протокол позволяет добавлять, копировать и перемещать сообщения в каталоги. Добавление сообщения в папку можно осуществить командой APPEND:

С: АООЗ APPEND saved-messages (\Seen) {310}

С : Date: Mon, 7 Feb 1997 21:52:25 -0800 (PST)

С: From: Fred Foobar <[email protected]>

С: Subject: afternoon meeting

С: То: [email protected]

С: Message-Id: <[email protected]>

С: MIME-Version: 1.0

С: Content-Type: TEXT/PLAIN; CHARSET=US-ASCII

С:

С: Hello Joe, do you think we can meet at 3:30 tomorrow

С : S АООЗ OK APPEND completed

Отметим, что команда APPEND не осуществляет доставку сообщения по указанному адресу, она только размещает в данном каталоге набор строк в виде сообщения.

Если сервер IMAP4 поддерживает 8-битовые данные, можно добавлять тексты сообщений в 8-битной кодировке, иначе текст должен быть закодирован в одну из 7-битных кодировок.

Команда COPY копирует сообщения с заданными порядковыми номерами в указанный каталог, например:

С: АООЗ COPY 2:4 MEETING

S: АООЗ OK COPY completed

Более подробное описание этих и других команд управления каталогами и сообщениями вы можете найти, например, в RFC-2060.

Пример сценария

Далее приведен простейший сценарий сессии работы IМАР4-клиента с сервером.

S: * OK IMAP4revl Service Ready

С: aOOl login alladin sesam

S: aOOl OK LOGIN completed

C: a002 select inbox

S: * 18 EXISTS

S: * FLAGS (\Answered \Flagged \Deleted \Seen \Draft)

S: * 2 RECENT

S: * OK [UNSEEN 17] Message 17 is the first unseen message

S: * OK [UIDVALIDITY 3857529045] UIDs valid

S: a002 OK [READ-WRITE] SELECT completed

С: аООЗ fetch 12 body[header]

S: * 12 FETCH (BODY[HEADER] {350}

S: Date: Wed, 17 Jul 1996 02:23:25 -0700 (PDT)

S: From: [email protected]

S: Subject: IMAP4revl WG mtg summary and minutes

S: To: [email protected]

S: Message-Id: <[email protected]>

S: MIME-Version: 1.0

S: Content-Type: TEXT/PLAIN; CHARSET=US-ASCII

S:

S: )

S: аООЗ OK FETCH completed

С: а004 store 12 +flags \deleted

S: * 12 FETCH (FLAGS (\Seen \Deleted))

S: а004 OK +FLAGS completed

С: а005 logout

S: * BYE IMAP4revl server terminating connection

S: а005 OK LOGOUT completed