IMAP Server Facade - как это сделать?

Я внедрил собственный почтовый сервер и веб-клиент. Сервер - это просто REST API (аналогично API gmail Google), который использует стороннюю (sendgrid) для отправки и получения. Письма хранятся в базе данных. Веб-клиент просто разговаривает с клиентом REST для отправки и получения.

Проблема с этим подходом заключается в том, что он не реализует IMAP в любом месте, что делает невозможным подключение стандартных клиентов (Outlook, iphone и т.д.) к API-интерфейсу электронной почты и его использование. Это ограничивает клиентов использованием только нашего клиента для электронной почты.

Мне нужен какой-то "фасад" IMAP-сервера, который будет управлять подключениями к клиентам и совершать вызовы в мой REST API для фактической обработки запросов (получать электронную почту, отправлять электронную почту и т.д.).

Как можно реализовать фасад IMAP? Может быть, есть способ взять существующий MailServer и вытолкнуть его и указать все его "события" на вызовы моего API?

Ответ 1

(Это в основном мой комментарий снова, но выработал довольно много.)

Некоторые IMAP-серверы, в первую очередь Dovecot, структурированы таким образом, что доступ к файлам находится в отдельном модуле с определенным интерфейсом. Dovecot - не единственный, но, безусловно, самый популярный и его интерфейсный интерфейс, как известно, уместен, поэтому я бы взял на себя такие конкретные проблемы.

Уже существуют нефайловые модули, такие как imapc, что доказывает, что это можно сделать. Когда клиент открывает почтовый ящик, поддерживаемый imapc, Dovecot анализирует команды IMAP, вызывает функции доступа к сообщениям в imapc, imapc выдает новые команды IMAP, анализирует ответы сервера, возвращает C-структуры в Dovecot, Dovecot изменяет новые ответы IMAP и возвращает их клиенту.

Я предлагаю вам взять источник dovecot, посмотреть src/lib-storage/inbox/index/imapc, а остальные бэкэнды в этот каталог и реализовать тот, который говорит ваш REST API как клиент.

Ответ 2

ТЛ: д-р; напишите свой шлюз в Perl; используйте Net:: IMAP:: Server; переопределить Net:: IMAP:: Server:: Mailbox; и используйте один из многих клиентов Perl REST, чтобы поговорить с вашим сервером.

Лучше всего сделать это быстро, сохраняя при этом разумную степень безопасности кода, с помощью Perl. Вам понадобятся два модуля Perl. Первый - Net:: IMAP:: Server и здесь - это репозиторий Github для этого модуля. Это стандарт-совместимый сервер RFC 3501, специально предназначенный для конфигурируемого почтового хранилища. Вы переопределите стандартную реализацию Net:: IMAP:: Server:: Mailbox с помощью своего собственного кода, который будет ссылаться на ваш собственный почтовый сервер.

Для вашего второго модуля выберите свой любимый модуль Perl, чтобы использовать его для вашего сервера REST. Ваш выбор зависит от того, насколько мелкозернистый контроль вы хотите иметь над строительством и доставкой сообщений REST.

К счастью, здесь у вас много вариантов. Одна из возможностей - Eixo:: REST, где есть репозиторий Github здесь. Eixo:: REST, похоже, хорошо справляется с асинхронными или синхронными вызовами REST API, но не обеспечивает большого контроля над управлением ключами X509. В зависимости от того, насколько googley ваш API, есть также REST:: Google. Интересно, что в этом семействе также есть модуль REST::Google::Apps::EmailSettings, специально для настройки funkiness, специфичного для Gmail, как ярлыки и языки. Наконец, модуль REST::Consumer, как представляется, инкапсулирует множество специфичных для https вещей, таких как тайм-аут и аутентификация, в качестве параметров для создания объектов Perl.

Если вы используете эти существующие фреймворки, то для вас уже должно быть сделано около 90% необходимого кода.

Не делайте этого, взломав Dovecot или любой другой почтовый сервер, написанный на C или С++. Если вы быстро взломаете почтовый сервер, используя скомпилированный язык, ваш сервер рано или поздно испытает всю радость переполнения буфера и разбиение стека и все остальное, что Интернет делает, чтобы трахаться над почтовыми серверами. Сначала убедитесь, что он работает безопасно, затем оптимизируйте его позже.

Ответ 3

Поскольку вы знакомы с .NET, я бы предложил взломать любую из следующих реализаций серверов IMAPv4 по вашему вкусу:

  • Lumisoft Mail Server - действительно очень старый проект (позвольте назвать его "зрелым", да?). Не быть слишком отключенным на десятилетнем веб-сайте и отсутствием ссылки github - источник предоставляется в разделе "Другие загрузки".
  • McNNTP - также более старый проект и основное внимание уделяется NNTP (как говорится в названии), но очень близко к тому, что вы "пытаюсь добиться с точки зрения компонента IMAP. Взгляните, вы, вероятно, найдете это хорошей отправной точкой.