Интернет-протокол доступа к сообщениям (Internet Message Access Protocol, IMAP) является альтернативой протоколу POP. Он содержит те же базовые средства, что и POP, но обладает также функциями для синхронизации почтовых ящиков, то есть реализует чтение отдельных сообщений как на клиентской машине, так и прямо на сервере, обеспечивая при этом актуальность почтовых ящиков и той и другой системы. IMAP позволяет работать с отдельными сообщениями на клиенте и на сервере, отображая внесенные изменения в почтовых ящиках обеих систем.

Для надежной, последовательной передачи данных IMAP использует TCP. Порт протокола IMAP - TCP 143. Подобно протоколу POP, IMAP работает по модели запрос/ответ и содержит небольшое число команд. Набор команд IMAP более сложен, чем применяемый в POP, поскольку IMAP обладает более совершенной функциональностью. При этом число команд IMAP не превышает двадцати пяти. Основные команды IMAP, определенные документом RFC 2060 , Internet Message Access Protocol - Version 4revl, приведены в таблице.

Таблица команд IMAP4
Команда Действие
CAPABILITY
Перечисляет возможности, поддерживаемые сервером
NOOP
Буквально означает «нет действия»
LOGOUT
Закрывает соединение
AUTHENTICATE
Запрашивает альтернативный метод проверки аутентичности
LOGIN Указывает имя пользователя и пароль для аутентификации с передачей открытым текстом
SELECT
Открывает почтовый ящик
EXAMINE
Открывает почтовый ящик в режиме «только для чтения»
CREATE
Создает новый почтовый ящик
DELETE
Удаляет почтовый ящик
RENAME
Изменяет имя почтового ящика
SUBSCRIBE
Добавляет почтовый ящик в перечень активных
UNSUBSCRIBE
Удаляет почтовый ящик из перечня активных
LIST Отображает указанные имена почтовых ящиков, выбирая из полного набора имен
LSUB
Отображает указанные имена почтовых ящиков, выбирая из набора активных
STATUS
Отображает состояние почтового ящика
APPEND
Добавляет сообщение в конец указанного почтового ящика
CHECK
Принудительное создание контрольной точки для текущего почтового ящика
CLOSE
Закрывает почтовый ящик и стирает все сообщения, отмеченные для удаления
EXPUNGE
Стирает из текущего почтового ящика все сообщения, отмеченные для удаления
SEARCH
Отображает все сообщения почтового ящика, соответствующие критерию поиска
FETCH Извлекает сообщение из почтового ящика
STORE
Изменяет сообщение в почтовом ящике
COPY
Копирует указанные сообщения в конец указанного почтового ящика
UID Находит сообщение по уникальному идентификатору

Приведенный набор команд четко отражает ориентированность протокола IMAP на работу с почтовыми ящиками. Протокол проектировался в качестве средства удаленного доступа к почтовым ящикам, хранимым на сервере, что видно по командам протокола. Несмотря на возросшую сложность протокола работу сервера IMAP все так же можно проверить при помощи telnet и небольшого числа команд.

$ telnet localhost 143
Trying 127.0.0.1...
Connected to rodent.wrotethebook.com.
Escape character is '^]'.
*    OK rodent.wrotethebook.com IMAP4rev1 v12.252 server ready
a0001 LOGIN craig Wats?Watt?
a0001 OK LOGIN completed
a0002 SELECT inbox
* 3 EXISTS
*    0 RECENT
*    OK [UIDVALIOITY 965125671] UIO validity status
*    OK [UIDNEXT 5] Predicted next UID
*    FLAGS (\Answered \Flagged \0eleted \Draft \Seen)
*    OK [PERMANENTFLAGS (\* \Answered \Flagged \0eleted \0raft \Seen)] Permanent flags
» OK [UNSEEN 1] first unseen message in /var/spool/mail/craig
a0002 OK [READ-WRITE] SELECT completed
a0003 FETCH 1 BODY[TEXT]
*    1 FETCH (BODY[TEXT] {1440}
... an e-mail message that is 1440 bytes long ...
*    1 FETCH (FLAGS (\Seen))
a0003 OK FETCH completed
a0004 STORE 1 +FLAGS \DELETED
» 1 FETCH (FLAGS (\Seen \Deleted))
a0004 OK STORE completed
a0005 CLOSE
a0005 OK CLOSE completed
a0006 LOGOUT
*    BYE rodent.wrotethebook.com IHAP4rev1 server terminating connection
a0006 OK LOGOUT completed
Connection closed by foreign host.

Первые три и последняя строки исходят от программы telnet; все прочие сообщения принадлежат IMAP. Первая введенная пользователем команда IMAP - это LOGIN; она указывает имя пользователя и пароль из файла /etc/ passwd для его аутентификации. Обратите внимание, команду предваряет строка А0001. Это тег, представляющий собой уникальный идентификатор, создаваемый клиентом для каждой команды. Каждая команда должна начинаться с тега. При ручном вводе команд вы сами являетесь источником тегов.


Протокол IMAP ориентирован на работу с почтовыми ящиками. Команда SELECT выбирает почтовый ящик, с которым происходит работа. В данном примере пользователь выбрал почтовый ящик с именем «inbox». Сервер IMAP отображает состояние ящика. Можно видеть, что ящик содержит три сообщения, с каждым из которых связан ряд флагов. Флаги позволяют управлять сообщениями в почтовом ящике, помечая их в качестве прочитанных (Seen), непрочитанных (Unseen), удаленных (Deleted) и т.д.

Команда FETCH позволяет получить сообщение из почтового ящика. В данном примере пользователь принимает текст сообщения, то есть его юдержательную часть. Однако можно загрузить только заголовки сообщений или флаги. Приняв сообщение, пользователь удаляет его, записывая флаг Deleted при помощи команды STORE. Команда DELETE используется не для удаления сообщений, а для удаления почтовых ящиков. Отдельные сообщения отмечаются для удаления установкой флага Delete. Сообщения с флагом Delete не удаляются, пока не будет выполнена команда EXPUNGE либо почтовый ящик не будет закрыт явным образом посредством команды CLOSE, как в приведенном примере. Сеанс завершается командой LOGOUT.

Очевидно, протокол IMAP сложнее протокола POP и вплотную подошел к той границе, за которой набор команд вручную становится неэффективным. Разумеется, на практике редко применяется ручной набор. Рабочие станции и серверы обмениваются командами автоматически. Приведенный пример призван лишь проиллюстрировать работу протокола IMAP. Скорее всего, единственной проверкой IMAP, выполняемой вручную, для вас станет проверка факта работоспособности демона imapd. Чтобы выполнить такую проверку, нет необходимости даже регистрироваться на сервере; достаточно увидеть, что сервер реагирует на соединение, установленное при помощи telnet. Затем остается лишь набрать команду LOGOUT, чтобы мягко закрыть соединение.