как я разрабатывал собственную временную почту

от автора

мне нужно написать скрипт авторега аккаунтов для одного популярного сервиса. для регистрации аккаунтов нужна электронная почта. логичным решением было использовать временные почты.

ранее (~1.5 года назад) я уже использовал для таких задач python-библиотеку tempmail, но она перестала работать.

в моей issue к tempmail предложили альтернативу.

но в связи с устаревшими решениями по коду я решил форкнуть либу. оказалось, что механизм библиотеки достаточно прост — она использует открытые api mail.tm.

проведя небольшой ресёрч в интернете я нашел mail.gw, который выглядит/работает также, как mail.tm и с которым, как оказалось, уже может работать мой форк.

но, есть проблема: при регистрации аккаунта сервис легко обнаруживает временные почты (предположительно, по черному списку доменов, но у меня есть решение, расскажу в конце).

значит нам предстоит развернуть собственный сервер временной электронной почты на собственном домене.

исходный код сервера mail.tm и mail.gw (предположительно) был опубликован на GitHub. по крайней мере так было с документацией, но с 2022 года или ранее недоступен (определил по архивным копиям).

запрос на почты поддержки (support@mail.tm, support@mail.qw), в дс/тг не дал результатов (мне не ответили).

из этого можно сделать вывод: исходный код серверной части можно считать закрытым, а значит нам нужно написать свой.

проводя ресёрч решений по поднятию собственной python-совместимой почты, я наткнулся на старенькую статью на habr о библиотеке inbox.py, которая позиционирует себя как простой почтовый smtp-сервер для людей.

интересный факт: в контрибьюторах библиотеки числится создатель requests (популярной библиотеки для парсинга).

когда я попытался развернуть сервер на inbox.py, оказалось, что она давно не поддерживается и не может работать с python версии 3.12 и выше.

логичным решением было форкнуть библиотеку, обновив зависимости (переписал на aiosmtpd).

теперь она работает в современном python (и называется inboxium).

поднял почту на VDS.

ради интереса решил отправить письмо, просто, по ip (admin@0.0.0.0) — работает. ни разу не видел чтобы так делали.

после успешной покупки домена и проброса MX записей в DNS мы имеем рабочую почту.

но проблемы начались с другой стороны:

для подтверждения почты сервис отправляет сообщение, в формате, который библиотека считает пустым текстом.

это значит, что нам придётся переписать механизм препарирования сообщений (чтобы пользователь мог получить сырые данные).

и ещё я давно хотел сделать структуру работы с сообщениями как в aiogram, чтобы был единый класс Message и разработчик мог получить из него всё остальное:

by: str      | получатель (-и). sender: str  | отправитель. subject: str | тема письма. text: str    | текст письма. raw: str     | сырой текст письма (для таких случаев как наш).

вот пример кода на обновлённом inboxium:

@inbox.message async def handle(message: InboxMessage) -> None:     """Handle any messages."""     if message.sender == TARGET_SENDER:         print("!!! Верно обнаружен отправитель !!!")          urls = re.findall(FIND_CONFIDER_URL, message.raw)         if urls:             r = requests.get(urls[0])             print(f"!!! Почта подтверждена {urls[0]} !!!")

кстати, заметил, что в стандартных классах современного python, связанных с email отвратительное оформление кода. так что даже в питоне есть еще что форкать))

для удобства работы, систему было решено сделать автономной: на VDS с белым IP поднят скрипт, который сверяет отправителя и тему письма и автоматически переходит по ссылкам для подтверждения почты.

обещал способ нивелировать обнаружения временных почт:

большинство систем, для обнаружения временных почт грубо сверяют домен. поэтому, для минимизации обнаружения нужно поднимать временную почту на домене третьего уровня (user@example.example.com).


ссылка на оригинал статьи https://habr.com/ru/articles/946680/


Комментарии

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *