В 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 или подайте заявку на предложение о работе на нашем сайте.