Какой протокол позволяет выборочно копировать пришедшие письма с почтового сервера на компьютер
Обновлено: 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 -->
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 -->
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 -->
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 -->
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 -->
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 -->
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 -->
Другой недостаток вызван тем, что все почтовые письма всех пользователей хранятся на сервере, если пользователей много, то серверу требуется большое количество дискового пространства. Однако сейчас, когда жесткие диски стали большими и относительно дешевыми, это уже не является такой большой проблемой.
Читайте также: