![](http://cho.justos.org:9119/counter.gif)
Некоторое время назад в Яндекс.Почте появились сборщики писем по IMAP. В этом посте мы немного расскажем о двух важных почтовых протоколах — POP3 и IMAP — и о том, как они появились и используются в современных почтовых системах. Не всегда это так просто и очевидно, как ожидаешь от технологий, развивающихся уже почти 30 лет.
Начнём наш экскурс в историю протоколов, через которые вы каждый день получаете свою сотню писем.
![](http://img-fotki.yandex.ru/get/5639/125326533.2/0_8c072_adc30058_L.png.jpg)
Когда общаешься в Сети много месяцев и лет, обрастаешь множеством писем, а это сотни мегабайт и гигабайт переписки и файлов. Часто это не просто полезные файлы, по ним можно вспомнить и восстановить вехи жизни. Эти данные бывают ценнее чем содержимое локального диска компьютера.
Иногда встаёт задача перейти на новую и более удобную почтовую систему, но мешают накопленные архивы писем. Бросить их на прежнем месте? Жалко. Пароли забываются. Бывает, утрачиваются номера мобильных и email-адреса, введённые для их восстановления. Однажды можно потерять архивы навсегда. Скачать на локальный жесткий диск? Переписать на болванку или флешку? Но они ненадёжны: ломаются, теряются, портятся.
Самое логичное решение — импортировать архив почты в новый ящик. Но недостаточно это сделать один раз, ведь в старый ящик могут продолжать приходить важные письма. Можно настроить безусловное перенаправление всей входящей почты на другой адрес, и с технической точки зрения это — самый предпочтительный вариант. Но мы не роботы, и далеко не всегда технически экономное решение удобно использовать.
Долгое время единственным способом переноса архива почты между почтовыми системами с постоянной фоновой синхронизацией новых писем был протокол POP3. Возможность собирать почту с внешних POP3-серверов реализована везде и хорошо. Во всяком случае, настолько хорошо, насколько это позволяет протокол, а он имеет массу неприятных ограничений.
POP3 ведёт свою историю с 1984 года, когда одна из сотрудниц Института Информатики в составе Университета Южной Калифорнии, Джойс Рейнольдс, опубликовала RFC 918 — предложение стандартного протокола для получения электронной почты (POP — Post Office Protocol). Через 4 года появилась третья редакция протокола POP, а текущая, современная версия стандарта на POP3 опубликована весной 1996 года, почти 17 лет назад.
Важным принципом POP3 является оптимизация под короткие подключения к почтовому серверу в условиях дорогой и медленной связи. Изначально в рамках каждого подключения предполагалось скачивание всех писем из ящика на локальный диск, а затем очистка всего содержимого ящика. Точно так же работает ваш почтовый ящик для писем и газет в подъезде многоквартирного дома. В первой версии POP даже не было команд для чтения отдельных писем, только для полной выгрузки всего.
Сейчас уже сложно представить, что электронные письма не хранили на серверах. Их перекачивали на локальный компьютер при первой возможности и читали, сортировали по адресатам, темам и важности локально.
Интересно, что в протоколе POP2 была предусмотрена возможность работы с несколькими папками на сервере, но она оказалась невостребована, да и сам протокол распространения не получил. Поэтому в POP3 команду FOLD, которая реализовала эту возможность, убрали. POP2 обогнал время.
Сейчас в POP3 нет возможности скачивать с сервера структуру папок, только «плоский» список писем, состоящий, как правило, либо из входящих писем, либо из объединения пользовательских папок. Невозможно учитывать флажки прочтённости и важности. Несмотря на эти ограничения, протокол всё ещё широко используется, в основном из-за своей простоты и очень широкой поддержки в любых устройствах.
Было много попыток улучшить POP3, но ни одна из них не достигла такого успеха, как протокол IMAP, почти параллельно разивавшийся с 1985 года. История IMAP тоже весьма интересна. Например, первая реализация была сделана на Lisp-е, и его наследие навсегда осталось в протоколе в виде S-выражений, которыми кодируются сложные ответы сервера, такие как BODYSTRUCTURE.
Автор и идеолог IMAP Марк Криспин заложил в него принцип постоянного хранения писем на почтовом сервере. IMAP оказался одним из ранних «облачных» протоколов Интернета, рассчитанных на то, что локальное хранилище на персональном компьютере ненадёжно. Кроме того, персональных компьютеров и других терминалов для работы с почтой у человека может быть несколько — базовые вещи для нас теперешних.
Последняя версия IMAP — 4rev1 — описана в документе RFC 3501, увидевшем свет в 2003 году. Несмотря на кажущийся возраст, протокол получился живым благодаря предусмотренному на ранних этапах механизму расширений. Этот механизм, конечно, тоже не без недостатков, но тем не менее, он позволил различным людям выпустить более пятидесяти публичных расширений, многие из которых были разработаны совсем недавно и нашли широкое применение.
Современная почтовая система без поддержки доступа по IMAP — нонсенс. На протяжении нескольких лет Яндекс.Почта поддерживает IMAP в качестве сервера для работы из таких популярных клиентских программ, как Outlook, Thunderbird, Apple Mail, а также многочисленных мобильных клиентов. Кстати, именно благодаря смартфонам IMAP получил вторую волну развития. Если на персональных компьютерах уже довольно давно подавляющее большинство пользователей сделали выбор в пользу веб-интерфейса к своей почте, то с мобильными устройствами ситуация совсем не такая. Быстрые и красивые IMAP-клиенты, например в iOS, заставляют пересматривать подход к IMAP как к выбору исключительно профессиональных и «продвинутых» пользователей.
Недавно в Яндекс.Почте появилась и функция IMAP-клиента — сборщика почты с внешних серверов по IMAP — в дополнение к POP3-сборщику.
Функция не требует практически никакой настройки и рассчитана на фоновую работу после первого включения. При сборе почты через IMAP из-за описанных выше особенностей работы протокола в вашем почтовом ящике вы увидите ту структуру папок, к которой привыкли, когда пользовались предыдущей почтовой системой. Все прочтённые письма останутся прочтёнными, а непрочитанные — непрочитанными.
![](http://img-fotki.yandex.ru/get/5625/125326533.2/0_8c075_ae9d3e08_XL.png.jpg)
Включить сбор с папками в Яндекс.Почте можно со всех почтовых систем, поддерживающих протокол IMAP. Протокол непростой, у каждой реализации IMAP-сервера есть свои закидоны, и нам было важно в первую очередь обработать самый массовый вариант перехода со старой почты на новую.
По-прежнему кроме самих писем импортируются контакты из адресных книг самых распространённых почтовых сервисов.
Протокол IMAP заметно сложнее чем POP3 и просто по набору возможностей и команд, и по некоторых базовым принципам функционирования. Например, в IMAP используется тегирование команд клиента и ответов сервера на эти команды, что позволяет серверу отвечать на команды в произвольном порядке.
Каждая команда должна быть предварена некоторым идентификатором — тегом, который затем будет использован сервером при генерации ответа на эту команду. Это позволяет «беседе» клиента с сервером быть абсолютно асинхронной — сервер вправе отвечать на команды клиента в любом порядке, так как теги позволяют однозначно сопоставить ответ ранее поданной команде. Более того, сервер может выполнять такие команды одновременно, ускоряя скорость работы с почтой, и Яндекс.Почта умеет это использовать. Одновременно это требует особого подхода к программированию как клиента, так и сервера. Если вам в этом месте вспомнился механизм sequence numbers в TCP, то запишите себе +1 в geek cred :)
Для реализации IMAP-сборщика внутри Яндекс.Почты мы использовали наш асинхронный фреймворк для написания любых высокопроизводительных сетевых сервисов, который называется yplatform. Пока его исходный код закрыт, хотя мы рассматриваем возможность опубликовать его. Следите за новостями.
Переходите на Яндекс.Почту, настраивайте сборщик по IMAP — и вы всегда сможете найти любое старое письмо. Уж что-что, а искать Яндекс умеет.