IMAP расшифровывается, как Internet Message Access Protocol это протокол доступа к электронной почте. IMAP и протокол РОР3 возникли в одно тоже время .
Первая версия появилась в 1986 году, тогда протокол расшифровывался, как Interim Mail Access Protocol. Вторая версия вышла в 1988 году, название протокола было изменено на Interactive Mail Access Protocol. В 1991 году появилась третья версия, и в 1994 году четвертая версия протокола IMAP4, которую мы используем до сих пор. Спецификация чертой версии протокола IMAP была обновлена в 2003 году, после этого вышли дополнительные расширения протокола IMAP4.
Архитектура электронной почты
Протокол IMAP, также как и протокол РОР3 используется для чтения электронной почты, которая уже пришла в почтовый ящик пользователя. Для передачи почты используется протокол SMTP, а не IMAP.
Протокол IMAP
В отличие от протокола РОР3 в котором почтовые клиенты загружают все письма к себе и сразу их удаляют с сервера, в протоколе IMAP письма постоянно сохраняются на сервере. Клиенты загружают не все письма сразу а только те, которые пользователи явно запросил, кроме этого есть возможность синхронизации, при которой почтовый клиент, переписывает все письма с сервера но не удаляет их. IMAP сервер в отличие от РОР3 сервера, может выполнять с письмами вполне сложные действия, например выполнять поиск писем по заданному шаблону.
Преимущества протокола IMAP заключается в том, что с почтовым ящиком может одновременно работать несколько клиентов, и это соответствует современной модели работы с электронной почтой. У нас у всех есть несколько устройств, некоторые из них мобильные и мы хотим видеть единое состояние почтового ящика с помощью всех этих устройств.
С другой стороны, для того чтобы это обеспечить требуется протокол гораздо более сложный, чем РОР3. Повышенная сложность является существенным недостатком протокола IMAP. Другой недостаток заключается в том, что дисковая пространство на сервере, как правило ограничено, таким образом приходиться удалять письма из почтового ящика, чтобы он не переполнился.
Место в стеке TCP/IP
В стеке протоколов TCP/IP протокол IMAP находится на прикладном уровне.
IMAP использует протокол транспортного уровня TCP. Сервер IMAP работает на 143 порту.
Папки (mailbox)
В отличие от протокола РОР3, протокол IMAP позволяет использовать несколько почтовых ящиков (mailbox) или по-русски папки.
Папки хранятся на сервере, они могут быть вложены в друг друга и письма можно перемещать между разными папками.
В протоколе РОР3 создания папок и фильтрация сообщений используется локально с помощью почтовых клиентов. В IMAP есть папка специального типа INBOX, это почтовый ящик пользователя по умолчанию, именно туда записываются все входящие письма. Затем можно выполнять их сортировку с помощью почтовых клиентов, либо с помощью специальных программ.
Флаги
Другое отличие протокола IMAP от РОР3, это использование флагов. Именно благодаря флагам, протокол IMAP позволяет узнать прочитанное это сообщение или нет, а также много другой полезной информации.
Флаги в IMAP это небольшая метка (token) которая добавляется к письму. Письмо может иметь несколько меток или не иметь ни одной. Флаги в IMAP бывают двух типов: Системные и Пользовательские.
Системные флаги и их назначения заданы в стандарте IMAP и они начинаются с обратного слеша (\).
- \Seen – означает, что сообщение было просмотрено.
- \Answered – на сообщение был отправлен ответ
- \Flagged – у сообщения повышенная важность или на него нужно ответь, как можно быстрее
- \Draft – письмо не закончено и является черновиком
- \Deleted – используется для пометки сообщения на удаление
- \Recent – сообщение новое, при предыдущих подключениях клиента того сообщения не было.
Также могут создаваться Пользовательские флаги. Они не могут начинаться с символа \.
Состояния сеанса IMAP
При работе по протоколу IMAP клиент проходит через четыре состояния.
- Клиент не аутентифицирован (Not Authenticated) – клиент только что подключился к серверу IMAP и ему необходимо ввести свой логин и пароль, либо пройти аутентификацию каким-либо другим способом.
- Клиент аутентифицирован (Authenticated) – это означает, что клиент прошел успешную аутентификацию, подтвердил что он именно тот, за кого себя выдает, но пока не выбрал папку с которой он будет работать. При выборе папки происходит переход в следующее состояние.
- Папка выбрана (Selected) – после этого можно читать сообщения, которое находится в этой папке, и выполнять с ними требуемые действия.
- Выход (Logout) – разрыв соединения.
Протокол IMAP, также как и другие почтовые протоколы работают в текстовом режиме и использует взаимодействие запрос-ответ. Однако существенным отличием является то, что IMAP позволяет выполнять одновременно несколько команд. Некоторые команды IMAP могут работать достаточно долго, например, поиск какого-то письма в большом почтовом ящике, где много писем, массовое обновление писем или другие подобные операции. Клиент может не дожидаться выполнения текущей команды, а запустить другую команду.
Для того чтобы отличать разные команды и ответы на них, в протоколе IMAP используются идентификаторы или теги команд. Это просто алфавитно-цифровая строка (А0001,А0002). Каждая команда клиента должна начинаться с тега. Сервер включает этот тег в ответ на команду, для того чтобы можно было определить к какой именно команде этот ответ относится.
Ответы IMAP
Ответ IMAP также как и других почтовых протоколов состоит из двух частей: Статус и Поясняющее сообщение.
В Статусе в ответов IMAP всего лишь три:
- OK- означает, что команда выполнена успешна;
- NO – при выполнении команды произошла ошибка;
- BAD — означает, что клиент запустил неправильную команду или указал неправильные или недостаточные аргументы.
Пример сеанса IMAP
Команд в протоколе IMAP очень много, поэтому мы не будем перечислять их все.
Рассмотрим пример сеанса чтение писем. Подключаемся к серверу IMAP с использованием соединения TCP порт 143.
* OK Cyrus IMAP 4 server ready //сервер выдает сообщения со статусом ОК, сервер готов. Сеанс находится в состоянии preautentificated.
A0001 LOGIN username password // клиенту необходимо пройти аутентификацию, для этого используется команда LOGIN, в отличие от протокола РОР3 в команде LOGIN указываются одновременно имя пользователя и его пароль. Обратите внимание, что перед началом команды клиент указывает метку А0001
A0001 OK User logged in // в ответ сервер выдает сообщение тоже самой меткой, статус сообщения ОК команда выполнена успешна, поясняющее сообщение USER прошел аутентификацию.
Сейчас мы находимся в состоянии «аутентификация пройдена» и нам необходимо выбрать папку, с которой мы хотим работать.
A0002 LIST “” “*” // для того чтобы получить список всех папок используется команда LIST.
* LIST (\ HasChildren) “/” “INBOX” // Основная папка INBOX именно она считается основным почтовым ящиком пользователя и в нее доставляются все письма. В этой папке есть вложенные папки (\ HasChildren)
* LIST (\ HasChildren) “/” “INBOX/Drafts” // папка Draft черновики
* LIST (\ HasChildren) “/” “INBOX/Junk” // папка Junk спам
* LIST (\ HasChildren) “/” “INBOX/Sent” // папка Sent отправленные письма
* LIST (\ HasChildren) “/” “INBOX/Trash” //папка Trash корзина
A0002 OK Completed //завершается вывод ответом сервера ОК и номером метки А0002 указывающее, к какой команде относится ответ.
Выбор папки
Следующий этап сеанса IMAP это выбор папки из которой мы хотим читать письма.
A0003 SELECT INBOX //для этого используется команда SELECT, выбираем папку INBOX
* FLAGS (\Answered \Flagged \Draft \Deleted \Seen $Forwarded Junk NonJunk) // сервер показывает нам возможные флаги, кроме знакомых нам системных флагов, есть флаг $Forwarded, который говорит, что сообщение кому-то переслали. А флаги Junk NonJunk сообщения является спамом или не является.
* 177 EXISTS
* 41 RECENT
* OK [UNSEEN 1]
* OK [UIDVALIDITY 1340776425]
* OK [UNIDNEXT 29048]
A0003 OK [READ-WRITE] Completed
Просмотр списка писем
А0004 FETCH 1: * FLAGS // для того чтобы посмотреть какие сообщения есть на сервере используется команда FETCH ей необходимо указать номер письма, с которым мы хотим работать, либо диапазон через двоеточия. Диапазон от 1:* говорит от том, что мы хотим получить информацию обо всех письмах, затем указывается именно информацию мы хотим получить.
С начала мы хотим посмотреть флаги, в ответ сервер выдает перечень писем с флагами.
* 1 FETCH (FLAGS (\Seen)) // некоторые письма мы смотрели
* 2 FETCH (FLAGS (\Seen))
* 3 FETCH (FLAGS (\Answered \Seen)) // на некоторые мы отправили ответ
…
* 177 FETCH (FLAGS ()) // мы к нему подключались, но мы его не посмотрели.
* 178 FETCH (FLAGS (\Recent))
* 179 FETCH (FLAGS (\Recent)) // эти 3 письма мы видим в первый раз
* 180 FETCH (FLAGS (\Recent))
A0004 OK Completed (0.00 sec)
Чтение письма и установка флагов
A0005 FETICH 180 BODY [] // для того чтобы посмотреть письмо используется команда FETCH, указываем номер письма 180 последнее письмо, которое пришло, и что именно мы хотим посмотреть тело сообщения полностью BODY []
* 180 FETICH (FLAGS (\Recent \Seen) BODY [] {7077} //Сначала показываются флаги сообщения (FLAGS (\Recent \Seen), сервер автоматический установил у сообщения флаг Seen, означает то, что оно было просмотрено
…
Передача тела письма // а после этого выводиться само сообщение
,,,
Мы посмотрели сообщение или передали его на клиент, предположим, что мы решили, что в сообщение нет ничего интересного и его нужно удалить.
А0005 OK Completed (0.000 sec)
A0006 STORE 180 +FLAGS \Deleted // для этого необходимо установить флаг Deleted и это делается с помощью команды STORE, нужно указать номер сообщения 180, что именно мы хотим сохранить, хотим установить флаг +FLAGS и какой именно флаг хотим установить Deleted
* 180 FETICH (FLAGS (\Recent \Deleted \Seen)) // результат выполнение команды у сообщения номер 180 установлен флаг Deleted в дополнение к двум флагам, которые уже были установлены Recent и Seen
A0006 OK Completed
Удаление писем и выход
В IMAP также как в РОР3 сообщения не удаляются сразу после того, как они были помечены на удаление.
A0007 EXPUNGE // В IMAP для этого используется специальная команда EXPUNGE. После того как это команда запущена, из папки удаляются все сообщения, которые были помечены на удаление. Если не запустить эту команду, а просто разорвать соединение, то в отличие от протокола РОР3 сообщения удалены не будут.
* 179 EXPUNGE
A0007 OK Completed
A0008 LOGOUT //для разрыва соединений используется команда LOGOUT
* BYE LOGOUT received //сервер отвечает, что полученная команда LOGOUT говорит нам пока.
A0008 OK Completed //и выдает ответ ОК команда выполнена.
После этого соединение разрывается.
Другие команды IMAP
В протоколе IMAP имеется больше количество других команд.
- команда «Работа с папками» которая позволяет создавать новые папки, удалять их, переименовывать, получать статус.
Команда Перемещение писем:
- команда COPY которая является частью стандарта протокола IMAP4, которая позволяет копировать письмо из одной папки в другую.
- и новая команда MOVE, которая является расширением стандарта IMAP принятая в 2013 году, позволяет перемещать сообщения из одной папки в другую.
С помощью команды SEARCH можно искать письма на сервере по требуемую шаблону.
Команда CLOSE выполняет закрытие папки, удаление в папке всех сообщений, которые помечены на удаление и переход в состояние authenticated. В этом состоянии клиент может выбрать другую папку и продолжить работу с ней.
Эти команды, а также те же команды, которые мы перед этим рассматривали могут использовать большое количество разных аргументов, для того чтобы разобраться с ними подробно вам придется изучать документацию или стандарт протокола IMAP.
Заключение
И так мы рассмотрели протокол IMAP. Он используется для чтения писем из почтового ящика пользователя.
Все письма хранятся на сервере, и с почтовым ящиком можно одновременно работать с нескольких устройств. Все эти устройства будут видеть согласованное состояние писем на сервере. Для отслеживание статуса сообщений в IMAP используются флаги, также в IMAP для удобства организации сообщений позволяет создавать на сервере папки.
Недостатком протокола — он очень сложный, с одной стороны это обусловлено тем, что задача, которую пытались решить разработчики протокола действительно является сложной, нужно обеспечить одновременную работу с почтовым ящиком нескольких клиентов, при чем эти клиенты могут выполнять запросы одновременно. В том числе конфликтующие между собой. С другой стороны протокол разрабатывался достаточно давно в конце 90-х в начале 2000-х готов и тогда у разработчиков протоколов не было достаточно опыта.
Другой недостаток вызван тем, что все почтовые письма всех пользователей хранятся на сервере, если пользователей много, то серверу требуется большое количество дискового пространства. Однако сейчас, когда жесткие диски стали большими и относительно дешевыми, это уже не является такой большой проблемой.