Imap приложение как работает
Вы можете настроить для работы с Почтой любую программу, которая поддерживает стандартные протоколы IMAP, POP3 и SMTP.
Настроить программу по протоколу IMAP
При использовании протокола IMAP почтовая программа синхронизируется с сервером и сохраняет структуру папок вашего ящика. Отправляемые вами через почтовую программу письма будут храниться не только на компьютере, но и на сервере, и вы сможете иметь к ним доступ с различных устройств.
Шаг 1. Настройте ящик
Примечание. Если вы хотите, чтобы письма сохранялись некоторое время после их удаления в почтовой программе, выберите опцию Отключить автоматическое удаление писем, помеченных в IMAP как удаленные . Учтите, что они будут безвозвратно удалены из ящика сразу после перезапуска почтовой программы.Шаг 2. Создайте пароль приложения
В разделе Пароли и авторизация выберите Включить пароли приложений . Подтвердите действие и нажмите Создать новый пароль .Если вы включили двухфакторную аутентификацию, просто нажмите Создать пароль приложения .
Придумайте название пароля, например укажите название приложения, для которого вы создаете пароль. С этим названием пароль будет отображаться в списке. Ограничение. Созданный пароль можно увидеть только один раз. Если вы ввели его неправильно и закрыли окно, удалите текущий пароль и создайте новый.Шаг 3. Настройте программу
Для доступа к почтовому серверу укажите ваш логин и пароль приложения. Используйте тот пароль, который вы создали для почтового приложения на предыдущем шаге. Если вы настраиваете получение почты с ящика вида «login@yandex. ru » , логином является часть адреса до знака «@» . Если вы используете Яндекс 360 для бизнеса, в качестве логина необходимо указывать полный адрес почтового ящика.
Внимание. Не рекомендуется использовать почтовый сервер вашего провайдера для отправки почты от вашего имени на Яндексе.Поддержка протокола IMAP включится автоматически при первой авторизации в почтовой программе.
Настроить программу по протоколу POP3
Шаг 1. Настройте ящик
Примечание. При скачивании писем с сервера по протоколу POP3 Яндекс.Почта автоматически сохраняет копии писем на сервере, но вы можете удалять письма вручную с помощью веб-интерфейса. Если вы хотите удалять письма с помощью почтовой программы, используйте протокол IMAP.Шаг 2. Создайте пароль приложения
В разделе Пароли и авторизация выберите Включить пароли приложений . Подтвердите действие и нажмите Создать новый пароль .Если вы включили двухфакторную аутентификацию, просто нажмите Создать пароль приложения .
Придумайте название пароля, например укажите название приложения, для которого вы создаете пароль. С этим названием пароль будет отображаться в списке. Ограничение. Созданный пароль можно увидеть только один раз. Если вы ввели его неправильно и закрыли окно, удалите текущий пароль и создайте новый.Шаг 3. Настройте программу
Для доступа к почтовому серверу укажите ваш логин и пароль приложения. Используйте тот пароль, который вы создали для почтового приложения на предыдущем шаге. Если вы настраиваете получение почты с ящика вида «login@yandex. ru » , логином является часть адреса до знака «@» . Если вы используете Яндекс 360 для бизнеса, в качестве логина необходимо указывать полный адрес почтового ящика.
Внимание. Не рекомендуется использовать почтовый сервер вашего провайдера для отправки почты от вашего имени на Яндексе.Вы можете настроить получение писем по протоколу POP3 из любой папки, включая Спам . Для этого откройте меню Настройка → Почтовые программы и отметьте нужные папки.
При скачивании содержимого ящика почтовыми программами письма по умолчанию не помечаются как прочитанные. Если вы хотите помечать полученные письма прочитанными, включите соответствующую опцию.
Настроить только отправку по протоколу SMTP
Настройка одного протокола SMTP обычно требуется на устройствах, которые только отправляют письма, но не принимают их.
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 -->
Пример сеанса 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 -->
p, blockquote 87,0,0,0,0 --> p, blockquote 88,0,0,0,1 -->
Другой недостаток вызван тем, что все почтовые письма всех пользователей хранятся на сервере, если пользователей много, то серверу требуется большое количество дискового пространства. Однако сейчас, когда жесткие диски стали большими и относительно дешевыми, это уже не является такой большой проблемой.
За подробностями — добро пожаловать под кат.
Нынешний запуск IMAP — наш второй подход к снаряду. В прошлый раз мы взяли сервер Dovecot и попробовали заточить его под себя. Результат нас не устроил: с нашими нагрузками и нашей инфраструктурой он сочетался плохо. В этот раз мы решили выбрать другой путь, и написали собственное решение.
IMAP мы запустили в мае, но анонсировали только в июне. Фактически, майская аудитория — это наши сотрудники и те пользователи, у которых клиенты автоматически определили наличие IMAP в нашей Почте и подключили к нему новые добавленные аккаунты.
Трудности, специфичные для протокола IMAP
1. Громоздкость самого протокола
Первая версия протокола IMAP появилась в 1986 году. В данный момент актуален стандарт IMAP версии 4rev1, который был обновлен в 2003 году. За такой долгий срок стандарт существенно разросся: его текущая версия насчитывает порядка 200 страниц.
Сейчас многие моменты, описанные в стандарте, устарели — в сегодняшних условиях они уже не являются необходимостью. Например, в протоколе предусмотрен возврат количества строк и MD5-суммы частей письма — функционал, который фактически не используется в современных клиентах.
Кроме того, существует множество опциональных расширений протокола. Некоторые из них, по сути, являются необходимыми для удобной работы с почтовым ящиком.
Чтобы побороть историческое наследие, нам пришлось реализовать несколько расширений. Одно из них — UID+: когда мы копируем или добавляем письмо, мы возвращаем ID нового письма, которое появилось на сервере в результате копирования или добавления. Это позволяет нам сэкономить на ресурсоемкой операции поиска, которую приходилось проводить клиенту, чтобы распознать, какое именно письмо было добавлено.
2. Отсутствие стандартного паттерна работы с сервером
IMAP предоставляет множество способов решить одну и ту же задачу и, как следствие, практически у всех клиентов паттерн работы различен. Также важно, что паттерны работы существенно отличаются от того, как работает веб-почта или POP3.
Более половины приходится на долю клиентов под устройства Apple: причина в том, что у них хорошо работает автоопределение IMAP. Outloook же, напротив, по умолчанию работает по POP3, и настраивать IMAP нужно руками.
Здесь можно выделить 2 основные категории: десктопные клиенты, которые сразу запрашивают информацию обо всех письмах в ящике или папке, и мобильные клиенты, которые изначально запрашивают информацию только о самых новых письмах. Далее нам оставалось изучить запросы, которые они делают, чтобы обновить состояние, как именно они вытягивают информацию о письмах.
Почему для нас это было необходимым шагом? При скромных нагрузках (например, если сервер обслуживает корпоративную почту небольшой компании) вопрос оптимальности стоит не так остро. Однако при наших объемах оптимальность становится критичной: следовательно, нам нужно было изучить паттерны работы всего зоопарка почтовых клиентов, обращающихся к хранилищу.
3. Количество одновременных сессий
По стандарту, минимальный таймаут сервера — 30 минут. Кроме того, один клиент может держать сразу несколько соединений к серверу (в протоколе не указано максимальное количество разрешенных соединений). Фактически, в нашем масштабе, это означает, что один сервер должен оптимально работать с десятками тысяч одновременных соединений. При работе в синхронном режиме такое количество соединений просто поглотило бы все ресурсы.
Для решения этой проблемы я написал библиотеку для асинхронной работы, построенную на базе edge-triggered epoll. Изначально я ставил перед собой задачу сделать библиотеку, при помощи которой можно было бы в будущем за пару дней написать свой асинхронный сервер для решения других задач, помимо IMAP; в результате практически весь код можно использовать для написания других сервисов.
4. Невозможность однозначно идентифицировать клиент
Наш сервер поддерживает расширение ID, которое позволяет нам идентифицировать примерно половину клиентов. К сожалению, другая половина об этом расширении не знает (из популярных можно назвать, например, Outlook).
Понимание того, с каким клиентом мы работаем, позволяет обойти его характерные баги, а также предсказать, каким будет паттерн работы в рамках данной сессии и, соответственно, оптимизировать работу. Для нас это критично, поэтому, если клиент не называет ID, мы стараемся идентифицировать его другими путями (в случае Outlook — по тегам).
В клиентах перемещение реализовано через копирование+удаление. Нам, разумеется, хочется, чтобы при этом копия письма помещалась в нужную папку, а оригинал удалялся и не захламлял корзину. С другой стороны, иногда сам пользователь копирует письмо в новую папку, а затем удаляет оригинал: в этом случае удаленное письмо должно помещаться в корзину.
Чтобы различать эти два кейса, после копирования мы в этой же сессии помечаем письмо специальным внутренним флажком. Когда сам пользователь копирует письмо и удаляет оригинал, клиент, как правило, обновляет список писем. При обновлении флажок автоматически сбрасывается, а удаленное письмо оказывается в корзине. Если же письмо (в рамках перемещения) удаляет клиент, обновления не происходит, и письмо, помеченное флажком, удаляется окончательно.
Трудности, связанные с адаптацией текущего хранилища писем и индексов
2. Необходимость оптимально возвращать информацию о MIME-структуре письма
Практически все клиенты запрашивают информацию о структуре письма. Часто в рамках первой сессии они запрашивают такую информацию сразу обо всех письмах в папке. Парсить письмо на каждый такой запрос было бы крайне неоптимально.
Вместо этого мы сделали кэш MIME-структур. Наличие кэша помогло нам побороть сразу несколько трудностей, связанных с особенностями IMAP — в частности, отсутствие стандартного паттерна работы с сервером: поскольку часть информации хранится в кэше, это помогает нивелировать нагрузку, связанную с разными паттернами работы клиентов.
3. Оптимальная отдача частей письма
Для экономии места в наших хранилищах base64-части хранятся в декодированном виде внутри письма: при работе с веб-почтой это позволяет отдавать аттачи без лишнего перекодирования. Нужно было сделать схему отдачи частей с учетом этого перекодирования. Мы написали потоковое перекодирование на IMAP-сервере. Здесь также помог кэш — благодаря ему мы без перечитывания структуры можем понять, в каком виде (бинарном или нет) хранится тот или иной фрагмент.
4. Особенности работы некоторых клиентов
Некоторые клиенты не полностью соответствуют стандарту RFC: например, стандартные клиенты Android версий 2.2 — 2.3 не могут корректно отображать письма без возврата некоторых необязательных полей. Основная трудность заключалась в том, чтобы определить, какие именно поля каждый из таких клиентов считает для себя обязательными: приходилось решать это методом перебора.
Выше уже упоминалось о том, что у клиентов могут быть различные подходы к удалению писем: одни перемещают их в корзину, другие — удаляют сразу и безвозвратно. При этом некоторые клиенты не понимают стандартное расширение XLIST, которое мы поддерживаем, позволяющее определить, какая именно папка является корзиной. Вместо этого они используют в качестве корзины свою папку (так себя ведет, например, Sparrow).
Интересно ведет себя Outlook: по команде удаления письма не перемещаются в корзину, а помечаются как перечеркнутые, и затем удаляются позже. Выяснилось, что для пользователей это выглядит, как баг — многие просто не понимают, что делать дальше и как добиться того, чтобы клиент вел себя привычным образом и письма оказались в корзине.
В условиях такого разнообразия нам также было необходимо эмпирически понять, как ведет себя каждый из клиентов, и подстроиться под эти варианты — причем таким образом, чтобы пользователь мог быть уверен: независимо от того, в каком клиенте он работает, почта отреагирует на его действия привычно и предсказуемо (в данном случае — удаленное письмо окажется к корзине). Решали мы это, пробуя различные ответы через тестовый прокси-сервер и отслеживая реакцию клиента на каждый из вариантов.
То, что мы вынесли для себя: IMAP — достаточно «развесистая» штука, с множеством исторических особенностей, нажитых за 26 лет, которые умножаются на разнообразие почтовых клиентов. При наших нагрузках это выливается в то, что брать готовое решение и пытаться заточить его под себя нерационально: в лучшем случае объем работы будет таким же, как при самостоятельной разработке решения. Этим путем мы и пошли :)
Протокол IMAP (Internet Mail Access Protocol) описывается в RFC 2060.
В отличии от POP3, который просто скачивает входящие письма и сохраняет их локально, с IMAP вы работаете с почтой непосредственно на сервере
Каждая команда, выдаваемая клиентом, предваряется уникальным идентификатором. Сервер может затем использовать этот идентификатор в своих ответах, что позволяет клиенту определить, к какой команде относится ответ сервера. Это особенно важно при выполнении сервером нескольких команд за сеанс. Идентификатор обычно представляет собой короткую строку алфавитно-цифровых символов, которая генерируется клиентом. Так, в строке 6 листинга 7.1 клиентом был выбран идентификатор a001. Если бы клиенту потребовалось задавать и другие команды, то следующим идентификатором был бы a002 и т.д. Часто для упрощения идентификаторы команд в течение сеанса IMAP просто последовательно увеличивают один из своих разрядов.
Методы проверки подлинности пользователя в IMAP
Команда LOGIN
Команда LOGIN позволяет клиенту при регистрации на сервере IMAP использовать идентификатор пользователя и пароль в обычном текстовом виде.
Команда AUTHENTICATE
С помощью команды AUTHENTICATE клиент может использовать при регистрации на сервере IMAP альтернативные методы проверки подлинности. Индивидуальная проверка подлинности пользователей не является обязательной и поддерживается не всеми серверами IMAP. К тому же реализации такой проверки могут различаться в зависимости от сервера. Когда клиент выдает команду AUTHENTICATE, сервер отвечает на нее строкой вызова в кодировке base64. Далее в обязанности клиента входит ответ на вызов сервера о проверке подлинности, также закодированный base64. Если на сервере не поддерживается метод проверки подлинности, предложенный клиентом, он включает в свой ответ отрицательное слово NO. После этого клиент должен продолжить переговоры по согласованию метода проверки подлинности. Если все попытки определить метод проверки подлинности потерпели неудачу, то клиент предпринимает попытку зарегистрироваться на сервере посредством команды LOGIN. Пример сеанса с применением AUTHENTICATE:
В строках 6–9 показаны попытки клиента согласовать с сервером IMAP метод проверки подлинности. Как видите, все они не увенчались успехом. А в строке 10 показано, что метод проверки, приемлемый и для клиента, и для сервера, найден. Отвечая, сервер в строке 11 выдает кодированную строку с вызовом в кодировке base64. Однако в строке 12 клиент отвергает попытку регистрации и возобновляет ее лишь в строке 14 с помощью команды LOGIN.
Клиентская часть протокола IMAP
В следующем разделе описываются команды IMAP, которые клиент может задавать серверу.
Сервер должен отвечать соответствующим образом на заданные команды или отвечать отрицательно, если команда задана неправильно либо не поддерживается.
Команда SELECT
Здесь mailbox — это название почтового ящика, к которому обращается клиент. Во время одного сеанса IMAP может быть активен только один почтовый ящик. Если ящик существует и у клиента имеется соответствующий доступ к нему, то сервер дает многострочный ответ, где описывается состояние почтового ящика.
Команда CREATE
Команда CREATE используется для создания нового почтового ящика на сервере IMAP. Имя и местоположение новых почтовых ящиков определяются в соответствии с общими спецификациями ОС Linux. В рабочем каталоге пользователя создается новый почтовый ящик с именем, но без задания местоположения, так как оно известно каталогу $HOME клиента. Например, если рабочий каталог клиента находится в /home/riley и клиент задает команду CREATE для создания нового почтового ящика stuff/junk, то вновь созданный ящик на почтовом сервере под управлением ОС Linux будет иметь путь /home/riley/stuff/junk. В этом примере вы видите, как используется знак разделителя /. Однако это не является общим для всех серверов IMAP.
Некоторые программы IMAP-клиенты используют термин папка по отношению к новым почтовым ящикам. Многие из них позволяют пользователям также создавать их с определенным уровнем вложенности, так что будьте осторожны при создании новых папок (почтовых ящиков). С ростом длины пути к почтовому ящику становится все трудней обслуживать его.Команда DELETE
Команда RENAME
С помощью команды RENAME клиент может изменить имя почтового ящика. При этом возможно применение двух параметров. Первый параметр — собственно имя почтового ящика, который требуется переименовать. И второй параметр — новое имя почтового ящика.
Переименование не влияет на содержимое почтового ящика.Команда LIST
Команда LIST используется для получения списка всех почтовых ящиков клиента. С ней используются два параметра. Формат команды LIST приведен ниже:
Здесь reference — каталог, где находятся почтовые ящики. Если задается пустая строка вместо этого параметра (""), то почтовые ящики находятся в рабочем каталоге пользователя $HOME. Второй параметр mailbox является именем почтового ящика, который нужно просмотреть. Здесь допускается использование специальных символов, так же, как и при получении обычного списка каталогов, например группового символа (*). Если именем почтового ящика задана пустая строка (""), то сервер будет возвращать в качестве ответа иерархический разделитель (для Linux /) и имя корневого параметра.
Команда LSUB
Команда LSUB используется для устранения проблемы, которая описана для команды LIST. В отличие от команды LIST, с помощью которой отображается все содержимое рабочего каталога пользователя, с помощью команды LSUB отображаются лишь активизированные ранее описанной командой SUBSCRIBE почтовые ящики клиента. Параметры команды LSUB точно такие же, что и для команды LIST, т.е. ссылка (reference) и имя почтового ящика. Подобно команде LIST, параметр ссылки указывает путь к каталогу, в котором находятся почтовые ящики с соответствующими именами (каталог $HOME, если указано ""). Соответственно, под именем почтового ящика понимается имя ящика или имена ящиков, которые требуется вывести в списке (допускается групповой символ (*).
Почтовые ящики могут затем добавляться в список активных ящиков с помощью команды SUBSCRIBE, а удаляться из списка с помощью команды UNSUBSCRIBE. С помощью этих команд можно реализовать на базе клиента IMAP чтение групп новостей. При этом каждая группа новостей реализована как отдельный почтовый ящик на сервере, на которую затем можно подписаться. Сегодня большинство программ для работы с электронной почтой включают функцию чтения групп новостей, так что выполнение этих операций в IMAP не требуется.
Команда APPEND
Команда CHECK
Команда CHECK используется для установки контрольной точки в почтовом ящике. Любые операции, такие, например, как запись данных из памяти сервера на его жесткий диск, должны выполняться при соответствующем состоянии почтового ящика. Именно для проверки целостности почтового ящика после дисковых и других подобных им операций и применяется команда CHECK. Эта команда используется без параметров.
Команда CLOSE
Команда CLOSE полностью соответствует своему названию — она закрывает почтовый ящик.
Действие команды CLOSE четко прослеживается на только что открытом новом почтовом ящике. Открытый почтовый ящик закрывается также с помощью команды LOGOUT. Команда CLOSE не имеет параметров.
Команда EXPUNGE
Ответ сервера на команду EXPUNGE представляет собой отчет о новом состоянии почтового ящика.
Команда SEARCH
Здесь CHARSET specification состоит из служебного слова CHARSET, за которым следует обозначение набора символов. Набор символов по умолчанию — ASCII , так что, как правило, этот параметр опускается. Параметр search criteria определяет ключевые критерии поиска и их значения. Критерии поиска описаны в табл. 7.3.
Таблица. Критерии поиска для команды SEARCH
Команда FETCH
Команда STORE
Команда COPY
Команда CAPABILITY
С помощью команды CAPABILITY клиент может запрашивать у сервера IMAP информацию о его возможностях.
Команда NOOP
Команда LOGOUT
Читайте также: