Найти в Дзене
300к в секунду

Сервис временной почты на Golang своими руками

Оглавление

Такой сервис также известен как "почта на 10 минут". Он позволяет получить временную почту для использования на ресурсах, которые требуют почту для регистрации или других процедур. Это бывает нужно, когда не хочется раскрывать настоящий почтовый адрес, чтобы обезопасить себя от спама и деанонимизации.

Как работает почта?

Основой почтового обмена является протокол SMTP. По этому протоколу происходит отправка писем от клиента на почтовый сервер, а также доставка писем от почтового сервера отправителя на почтовый сервер адресата.

Для доставки писем клиенту в основном используются протоколы POP3 и IMAP, а также веб-почта.

Давайте рассмотрим отправку и доставку письма пользователем Yandex-почты пользователю Gmail, изображенной на рис. 1.

Рис. 1. Схема отправки и доставки письма
Рис. 1. Схема отправки и доставки письма
  1. Отправку письма инициирует пользователь в интерфейсе почтового клиента или веб-почты.
  2. Письмо доставляется до инфраструктуры Yandex по протоколу SMTP в случае почтового клиента или по протоколу HTTP в случае веб-почты. В конечном итоге, письмо оказывается в SMTP-сервере Yandex-почты.
  3. SMTP-сервер Yandex-почты определяет доменное имя SMTP-сервера получателя, соединяется с ним и доставляет письмо.
  4. Инфраструктура google обеспечивает доступность полученного письма для разных серверов: IMAP-сервера, POP3-сервера и HTTP-сервера .
  5. Пользователь Gmail, используя один из возможных клиентов, получает письмо.

Как определяется SMTP-сервер получателя?

Важно упомянуть, каким образом SMTP-сервер отправителя определяет, к какому серверу подключаться при доставке письма. Для этого задействуется DNS. В записях домена получателя есть специальные типы записи MX, в которых записываются адреса SMTP-серверов получателя.

Давайте рассмотрим это на примере почтового адреса example@gmail.com. SMTP-сервер Yandex-почты получает домен gmail.com из почтового адреса и, используя DNS, достает соответствующую домену MX-записи.

Для gmail.com записаны следующие smtp-сервера:

  • 20 alt2.gmail-smtp-in.l.google.com.
  • 10 alt1.gmail-smtp-in.l.google.com.
  • 40 alt4.gmail-smtp-in.l.google.com.
  • 30 alt3.gmail-smtp-in.l.google.com.
  • 5 gmail-smtp-in.l.google.com.

Числа перед доменным именем обозначают приоритет: чем ниже, тем выше приоритет. При неудачном подключении к очередному серверу, выполняется подключение к менее приоритетному серверу.

Как работает временная почта?

Сервис временной почты состоит из четырех основных компонентов:

  • база данных (далее БД);
  • урезанный SMTP-сервер (далее SMTP-сервер);
  • урезанная веб-почта (далее веб-интерфейс);
  • HTTP-сервер.

Рассмотрим компоненты системы подробнее.

База данных

Временно хранит почтовые адреса и письма. Соответственно, она должна обеспечивать удаление почтовых адресов и писем по окончанию времени жизни.

Для простоты в нашей реализации был выбран Redis.

SMTP-сервер

  • получает доставляемые письма;
  • проверяет соответствие адреса получателя существующему адресу временной почты в БД;
  • сохраняет письмо в БД.

В нашей реализации написан на базе пакета github.com/mhale/smtpd.

Веб-интерфейс

Представлен на рис. 2.

Рис. 2. Вид веб-интерфейса.
Рис. 2. Вид веб-интерфейса.
  • взаимодействует с HTTP-сервером для создания временного почтового адреса;
  • отображает адрес временной почты;
  • позволяет удалить или сменить адрес временной почты;
  • опрашивает HTTP-сервер для получения новых писем;
  • позволяет читать полученные письма.

В нашей реализации используются фреймворки Vue.js (версии 3) и TailwindCSS.

HTTP-сервер

  • предоставляет REST API для создания и смены временной почты и получения новых писем;
  • обслуживает статичные файлы веб-интерфейса.

Написан на стандартном net/http.Server и с использованием пакета github.com/julienschmidt/httprouter.

Дополнительные компоненты

  • используется пакет golang.org/x/crypto/acme/autocert, который отвечает за получение и обновление сертификатов шифрования.

Алгоритм работы

  1. Пользователь в браузере заходит на веб-интерфейс.
  2. Веб-интерфейс делает запрос на HTTP-сервер для создания временной почты.
  3. Временная почта создается и её адрес отображается на веб-интерфейсе.
  4. Пользователь использует адрес временной почты на стороннем сервере и ожидает получения письма.
  5. Письмо доставляется до SMTP-сервера.
  6. SMTP-сервер проверяет адрес получателя и сохраняет его в БД.
  7. Веб-интерфейс путем периодического опроса HTTP-сервера получает новое письмо и отображает его.

Исходный код

Доступен по адресу https://github.com/dimuls/tmpmail.

Где можно увидеть вживую?

Сервис временно запущен по адресу https://tmp-mail.ru.