Какой протокол позволяет выборочно копировать пришедшие письма с почтового сервера на компьютер

Обновлено: 16.05.2024

IMAP расшифровывается, как Internet Message Access Protocol это протокол доступа к электронной почте. IMAP и протокол РОР3 возникли в одно тоже время .

p, blockquote 1,0,0,0,0 -->


p, blockquote 2,0,0,0,0 -->

Первая версия появилась в 1986 году, тогда протокол расшифровывался, как Interim Mail Access Protocol. Вторая версия вышла в 1988 году, название протокола было изменено на Interactive Mail Access Protocol. В 1991 году появилась третья версия, и в 1994 году четвертая версия протокола IMAP4, которую мы используем до сих пор. Спецификация чертой версии протокола IMAP была обновлена в 2003 году, после этого вышли дополнительные расширения протокола IMAP4.

p, blockquote 3,0,0,0,0 -->

Архитектура электронной почты

Протокол IMAP, также как и протокол РОР3 используется для чтения электронной почты, которая уже пришла в почтовый ящик пользователя. Для передачи почты используется протокол SMTP, а не IMAP.

p, blockquote 4,0,0,0,0 -->

Архитектура электронной почты

p, blockquote 5,0,0,0,0 -->

Протокол IMAP

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

p, blockquote 6,0,0,0,0 -->

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

p, blockquote 7,0,0,0,0 -->

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

p, blockquote 8,0,0,0,0 -->

Место в стеке TCP/IP

В стеке протоколов TCP/IP протокол IMAP находится на прикладном уровне.

p, blockquote 9,0,0,0,0 -->

Место протокола imap в стеке tcp

p, blockquote 10,0,0,0,0 -->

IMAP использует протокол транспортного уровня TCP. Сервер IMAP работает на 143 порту.

p, blockquote 11,0,0,0,0 -->

Папки (mailbox)

В отличие от протокола РОР3, протокол IMAP позволяет использовать несколько почтовых ящиков (mailbox) или по-русски папки.

p, blockquote 12,0,0,0,0 -->

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

p, blockquote 13,0,0,0,0 -->

p, blockquote 14,0,0,0,0 -->

Флаги

p, blockquote 15,0,0,0,0 -->

Флаги в IMAP это небольшая метка (token) которая добавляется к письму. Письмо может иметь несколько меток или не иметь ни одной. Флаги в IMAP бывают двух типов: Системные и Пользовательские.

p, blockquote 16,0,0,0,0 -->

Системные флаги и их назначения заданы в стандарте IMAP и они начинаются с обратного слеша (\).

Также могут создаваться Пользовательские флаги. Они не могут начинаться с символа \.

p, blockquote 18,0,0,0,0 -->

Состояния сеанса IMAP

При работе по протоколу IMAP клиент проходит через четыре состояния.

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

p, blockquote 20,0,0,0,0 -->

Для того чтобы отличать разные команды и ответы на них, в протоколе IMAP используются идентификаторы или теги команд. Это просто алфавитно-цифровая строка (А0001,А0002). Каждая команда клиента должна начинаться с тега. Сервер включает этот тег в ответ на команду, для того чтобы можно было определить к какой именно команде этот ответ относится.

p, blockquote 21,0,0,0,0 -->

Ответы IMAP

p, blockquote 22,0,1,0,0 -->

  • OK- означает, что команда выполнена успешна;
  • NO – при выполнении команды произошла ошибка;
  • BAD — означает, что клиент запустил неправильную команду или указал неправильные или недостаточные аргументы.

Пример сеанса IMAP

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

p, blockquote 24,0,0,0,0 -->

пример кода imap

p, blockquote 25,0,0,0,0 -->

p, blockquote 26,0,0,0,0 -->

A0001 LOGIN username password // клиенту необходимо пройти аутентификацию, для этого используется команда LOGIN, в отличие от протокола РОР3 в команде LOGIN указываются одновременно имя пользователя и его пароль. Обратите внимание, что перед началом команды клиент указывает метку А0001

p, blockquote 27,0,0,0,0 -->

p, blockquote 28,0,0,0,0 -->

p, blockquote 29,0,0,0,0 -->

A0002 LIST “” “*” // для того чтобы получить список всех папок используется команда LIST.

p, blockquote 30,0,0,0,0 -->

* LIST (\ HasChildren) “/” “INBOX” // Основная папка INBOX именно она считается основным почтовым ящиком пользователя и в нее доставляются все письма. В этой папке есть вложенные папки (\ HasChildren)

p, blockquote 31,0,0,0,0 -->

* LIST (\ HasChildren) “/” “INBOX/Drafts” // папка Draft черновики

p, blockquote 32,0,0,0,0 -->

* LIST (\ HasChildren) “/” “INBOX/Junk” // папка Junk спам

p, blockquote 33,0,0,0,0 -->

* LIST (\ HasChildren) “/” “INBOX/Sent” // папка Sent отправленные письма

p, blockquote 34,0,0,0,0 -->

* LIST (\ HasChildren) “/” “INBOX/Trash” //папка Trash корзина

p, blockquote 35,0,0,0,0 -->

A0002 OK Completed //завершается вывод ответом сервера ОК и номером метки А0002 указывающее, к какой команде относится ответ.

p, blockquote 36,0,0,0,0 -->

Выбор папки

Следующий этап сеанса IMAP это выбор папки из которой мы хотим читать письма.

p, blockquote 37,0,0,0,0 -->

выбор папки в протоколе imap

p, blockquote 38,0,0,0,0 -->

A0003 SELECT INBOX //для этого используется команда SELECT, выбираем папку INBOX

p, blockquote 39,0,0,0,0 -->

p, blockquote 40,0,0,0,0 -->

p, blockquote 41,0,0,0,0 -->

p, blockquote 42,0,0,0,0 -->

p, blockquote 43,0,0,0,0 -->

* OK [UIDVALIDITY 1340776425]

p, blockquote 44,1,0,0,0 -->

* OK [UNIDNEXT 29048]

p, blockquote 45,0,0,0,0 -->

A0003 OK [READ-WRITE] Completed

p, blockquote 46,0,0,0,0 -->

Просмотр списка писем

p, blockquote 47,0,0,0,0 -->

Просмотр папки imap

p, blockquote 48,0,0,0,0 -->

С начала мы хотим посмотреть флаги, в ответ сервер выдает перечень писем с флагами.

p, blockquote 49,0,0,0,0 -->

* 1 FETCH (FLAGS (\Seen)) // некоторые письма мы смотрели

p, blockquote 50,0,0,0,0 -->

* 2 FETCH (FLAGS (\Seen))

p, blockquote 51,0,0,0,0 -->

* 3 FETCH (FLAGS (\Answered \Seen)) // на некоторые мы отправили ответ

p, blockquote 52,0,0,0,0 -->

p, blockquote 53,0,0,0,0 -->

* 177 FETCH (FLAGS ()) // мы к нему подключались, но мы его не посмотрели.

p, blockquote 54,0,0,0,0 -->

* 178 FETCH (FLAGS (\Recent))

p, blockquote 55,0,0,0,0 -->

* 179 FETCH (FLAGS (\Recent)) // эти 3 письма мы видим в первый раз

p, blockquote 56,0,0,0,0 -->

* 180 FETCH (FLAGS (\Recent))

p, blockquote 57,0,0,0,0 -->

A0004 OK Completed (0.00 sec)

p, blockquote 58,0,0,0,0 -->

Чтение письма и установка флагов

p, blockquote 59,0,0,0,0 -->

Чтение письма imap

p, blockquote 60,0,0,0,0 -->

p, blockquote 61,0,0,0,0 -->

p, blockquote 62,0,0,0,0 -->

p, blockquote 63,0,0,0,0 -->

p, blockquote 64,0,0,0,0 -->

p, blockquote 65,0,0,0,0 -->

А0005 OK Completed (0.000 sec)

p, blockquote 66,0,0,1,0 -->

p, blockquote 67,0,0,0,0 -->

p, blockquote 68,0,0,0,0 -->

A0006 OK Completed

p, blockquote 69,0,0,0,0 -->

Удаление писем и выход

p, blockquote 70,0,0,0,0 -->

Удаление писем в imap

p, blockquote 71,0,0,0,0 -->

p, blockquote 72,0,0,0,0 -->

p, blockquote 73,0,0,0,0 -->

A0007 OK Completed

p, blockquote 74,0,0,0,0 -->

A0008 LOGOUT //для разрыва соединений используется команда LOGOUT

p, blockquote 75,0,0,0,0 -->

* BYE LOGOUT received //сервер отвечает, что полученная команда LOGOUT говорит нам пока.

p, blockquote 76,0,0,0,0 -->

A0008 OK Completed //и выдает ответ ОК команда выполнена.

p, blockquote 77,0,0,0,0 -->

После этого соединение разрывается.

p, blockquote 78,0,0,0,0 -->

Другие команды IMAP

В протоколе IMAP имеется больше количество других команд.

Команда Перемещение писем:

С помощью команды SEARCH можно искать письма на сервере по требуемую шаблону.

p, blockquote 81,0,0,0,0 -->

p, blockquote 82,0,0,0,0 -->

Эти команды, а также те же команды, которые мы перед этим рассматривали могут использовать большое количество разных аргументов, для того чтобы разобраться с ними подробно вам придется изучать документацию или стандарт протокола IMAP.

p, blockquote 83,0,0,0,0 -->

p, blockquote 84,0,0,0,0 -->

Заключение

И так мы рассмотрели протокол IMAP. Он используется для чтения писем из почтового ящика пользователя.

p, blockquote 85,0,0,0,0 -->

p, blockquote 86,0,0,0,0 -->

Недостатком протокола — он очень сложный, с одной стороны это обусловлено тем, что задача, которую пытались решить разработчики протокола действительно является сложной, нужно обеспечить одновременную работу с почтовым ящиком нескольких клиентов, при чем эти клиенты могут выполнять запросы одновременно. В том числе конфликтующие между собой. С другой стороны протокол разрабатывался достаточно давно в конце 90-х в начале 2000-х готов и тогда у разработчиков протоколов не было достаточно опыта.

p, blockquote 87,0,0,0,0 --> p, blockquote 88,0,0,0,1 -->

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

Читайте также: