Интернет-протокол доступа к сообщениям (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, приведены в таблице.
Команда | Действие |
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, чтобы мягко закрыть соединение.