В Linagora мы разрабатываем программное обеспечение для обмена сообщениями для совместной работы более 10 лет. Все началось с OBM, полнофункционального программного обеспечения для совместной работы, в основном разработанного на PHP и Java, и продолжилось OpenPaas, открытой платформой для совместной работы, написанной почти исключительно на Javascript. Мы используем Node.js для внутреннего интерфейса и Angular.js (версия 1) для внешнего интерфейса.
В OBM мы используем Roundcube (одна из самых известных веб-почтовых служб) для управления электронной почтой через Интернет. Roundcube работает довольно хорошо, используя комбинацию внешнего интерфейса HTML + Javascript и внутреннего интерфейса PHP. Типичный сценарий выглядит следующим образом:
- Интерфейс отправляет «команду» бэкэнду PHP (например, «открыть папку INBOX пользователя» или «отправить« Привет, Джон, как дела? »На адрес [email protected]»)
- Серверная часть переводит команду в запрос IMAP (например, «ВЫБРАТЬ ВХОДЯЩИЙ ЯЩИК») или запрос SMTP и отправляет его в фактическую внутреннюю часть IMAP.
- Бэкэнд получает ответ IMAP или SMTP, анализирует и анализирует его и отправляет обратно данные во внешний интерфейс (например, список сообщений электронной почты).
Еще в 2015 году, когда мы впервые обсуждали архитектуру OpenPaas, нам нужно было выбрать один из двух вариантов:
- Понравится Roundcube и многие другие программы веб-почты; иметь серверную часть Node.js, выполняющую тяжелую работу с IMAP и SMTP, и предоставлять легкий API для внешнего интерфейса. Затем интерфейс использует облегченный API для управления почтовыми ящиками пользователей, отправки электронных писем и т. Д. → Простой, но не очень интересный с технической точки зрения :)
- Найдите другое решение, которое позволяет нам полностью разрабатывать приложение веб-почты на Angular.js и полностью запускать его в браузере, вообще без серверной части. → Технически интересно, но сложно реализовать по очень простой причине: вы не можете открывать сокеты TCP из браузера, поэтому вы не можете использовать IMAP, и вы не можете использовать SMTP. Все, что вы можете делать, это отправлять HTTP-запросы.
Вариант 2 интересен по ряду причин, не говоря уже о возможности стать для нас первой веб-почтой на Angular.js с открытым исходным кодом без серверной части :)
- Это устраняет нагрузку на серверную часть приложения, позволяя браузеру напрямую подключаться к почтовому серверу.
- Он перемещает логику приложения в браузер пользователя (на мобильный телефон, планшет или настольный компьютер) и позволяет нам добиться естественной масштабируемости за счет использования растущей мощности устройств.
- Он упрощает код, необходимый для «заставить его работать», за счет того, что не нужно преобразовывать вызовы внешнего интерфейса в команды IMAP туда и обратно.
- Это круто!
Вы поняли, мы выбрали вариант 2. Важное техническое замечание: в OpenPaas мы разрабатываем и интерфейс, и почтовый сервер (поверх Apache James), поэтому мы можем реализовать практически все на почтовом сервере :)
Пришло время решить, как реализовать это решение. И мы обнаружили JMAP, черновик спецификации протокола, который особенно хорошо подходил для того, что мы намеревались сделать:
- Протокол не имеет состояния.
- Он работает через HTTP, что хорошо для нас (вы же помните, что мы внутри браузера, верно?) И использует JSON в качестве формата обмена, который является надежным и встроенным в браузер.
- Он использует тот же набор API-интерфейсов для эквивалента IMAP и SMTP, что еще больше упрощает реализацию, устраняя необходимость понимания специфики нескольких протоколов. Он даже поддерживает синхронизацию календарей и контактов, хотя мы этим не пользуемся.
- Он поддерживает пакетирование операций, что означает меньшее количество обращений к почтовому серверу, что означает меньшее использование сети и батареи (что, кстати, означает довольных клиентов!)
Итак, мы двинулись дальше и использовали это, реализовав как бэкэнд, так и фронтенд. И, стремясь собрать сообщество вокруг нашего продукта, мы разработали связанный с JMAP код во внешней библиотеке Javascript, выпущенной по лицензии MIT.
Следите за обновлениями в следующем выпуске, в котором я расскажу, как легко разработать JMAP-совместимый код с ES2015!
Заинтересованы в том, чтобы присоединиться к нам и написать отличный код? Свяжитесь с нами на Github, в Twitter или подайте заявку на предложение о работе на нашем сайте.