Перейти к документации
API

Одноразовые ящики

Рабочий адрес для того, у кого его нет: без аккаунта, без ключа и исчезающий в тот же день.

Что такое одноразовый ящик

Вызывающая сторона просит адрес на домене, которым владеет эта установка, следит за ним несколько минут, читает всё, что приходит, и бросает его. Он существует ради кода подтверждения, вопроса «что на самом деле отправляет эта форма» и регистрации, которую вы не хотите привязывать к адресу, которым будете пользоваться и через пять лет.

  • Он только принимает и ничего больше. Отправки нет: у ящика нет идентичности, от имени которой можно отправлять, и ни один из этих девяти вызовов не выпустит сообщение на провод.
  • Аренда по умолчанию длится 60 минут и может быть продлена до 24 часов, по часу за раз.
  • Он вмещает 50 сообщений, считающихся по мере поступления. Почта, приходящая в полный ящик, отбрасывается, а не ставится в очередь, и удаление одного сообщения не освобождает место под другое.
  • По окончании аренды почта УДАЛЯЕТСЯ, а не скрывается и не архивируется. Строка переживает её на неделю, чтобы адрес нельзя было выдать заново, пока медленный отправитель ещё делает к нему повторные попытки.
  • Ничто из этого не касается почтового ящика. Одноразовое сообщение живёт в собственной таблице, и ни один запрос на этом пути не дотянется до настоящего.

Это те же вызовы, которые делает бесплатный инструмент на этом сайте, так что всё, что может страница, может и ваш код. API нужен для случая, когда страницы нет: например, для набора тестов, которому нужен свежий адрес на каждый прогон.

Адрес — это не учётные данные

Одноразовый адрес вбивают в форму регистрации сразу же после его выдачи. Оттуда он путешествует в заголовке To:, через логи отправителя и в ту CRM, что стоит на другом конце. Если бы знания адреса хватало для чтения почты, инструмент по своей конструкции сливал бы каждый выданный им ящик — и ровно той стороне, которую вызывающая сторона держала на расстоянии вытянутой руки.

Поэтому создание ящика возвращает второе значение: token, 32 случайных байта в виде oe_inbox_ плюс 43 символа base64url. Он появляется в этом единственном ответе и больше нигде. Строка хранит только его хеш с ключом, поэтому восстановить его не может ничто: ни обращение в поддержку, ни дамп базы данных. Потеряли токен — потеряли ящик, и это правильный исход для учётных данных, которые читают чью-то почту.

Весь процесс
# 1. Mint one. This is the only response that carries a token.curl -s -X POST "$OE/temp-mail/inboxes" -H "Content-Type: application/json" -d '{}' # 2. Keep it, and read with it.export INBOX="Authorization: Bearer oe_inbox_kQ8v…"curl -s "$OE/temp-mail/inboxes/tinb_9c2f…/messages" -H "$INBOX"

Отправьте на один из этих маршрутов ключ API вида oe_live_ или oe_test_ — и он будет отклонён как invalid_credential_type, а не простым 401. Здесь два вида учётных данных делят один хост и один заголовок, и «не авторизовано» заставило бы вас гадать, какие из ваших были не те.

Аренда и её продление

Час, а не те десять минут, по которым назван жанр. Десяти хватает на код подтверждения и не хватает на вторую половину того, ради чего этим пользуются: пробный период, который пишет вам снова на следующее утро, форма, заполненная дважды, потому что первая попытка истекла по таймауту. ttlMinutes при создании позволяет попросить другое значение, от 1 до 1440; число вне этого диапазона отклоняется с 422, а не подгоняется молча, потому что срок истечения, о котором вы не просили, — это срок, под который вы уже всё спланировали.

POST /temp-mail/inboxes/{id}/extend добавляет час к сроку истечения, а не к текущему моменту, поэтому раннее продление не тратит оставшееся у вас время. Оно работает 23 раза, а сутки с момента создания ящика — более жёсткий из двух потолков: аренда, уже доходящая до него, не может купить ничего, сколько бы продлений ни осталось неистраченными. extensionsLeft в каждом ответе по ящику учитывает оба, так что клиент может сделать кнопку неактивной; на нуле вызов отвечает 409 extension_limit.

Истёкший ящик перестаёт аутентифицировать мгновенно по истечении срока: его токен отвечает 404, не дожидаясь очистки. Очистка — это то, что удаляет почту, и она выполняется по ежечасному cron; DELETE /temp-mail/inboxes/{id} — то же удаление по требованию.

Потолки

Всё это — подсчитанные строки, а не ограничитель частоты. В этой кодовой базе нет ограничителя, к которому можно было бы обратиться, и сказать об этом полезнее, чем намекать на защиту, которой нет. Потолки расставлены там, где был бы ущерб: на выпуске и на хранении.

ПотолокЗначениеЧто происходит при его достижении
Аренда60 минут, с продлением до 24 часов409 conflict_error / extension_limit
Сообщений на ящик50Дальнейшая почта отбрасывается прямо на входе. Отбой не пишется, ничто не ставится в очередь, а удаление сообщения не возвращает слот.
Выпуск ящиков6 в час, 30 в сутки, на вызывающую сторону429 rate_limit_error / too_many_inboxes
Сохраняемое тело2 МБtruncated: true на сообщении; остального больше нет.
Байты вложений8 МБ на каждоеcontent равно null, а метаданные сохраняются, и это не то же самое, что пустой файл.

Потолок выпуска считается по хешу с ключом от IP клиента, и уничтоженный ящик всё равно засчитывается, так что выбросить один — не способ получить ещё один. За чужим прокси заголовок с пробросом можно подделать, и это известная слабость потолка, а не дыра в учётных данных: ничто здесь не авторизует по этому значению.

Чего здесь нет

Ещё не выпущено

Узнавать методом проб хуже, чем быть предупреждённым:

  • Никакой отправки, ни в каком виде. У одноразового ящика нет подключения, от имени которого можно отправлять, а добавление такого превратило бы анонимный, неаутентифицированный эндпоинт в открытый релей.
  • Никакого переименования. Сменить адрес — значит создать второй ящик: переименование на месте освободило бы старую локальную часть в тот же миг, когда на него нажали, и подтверждение, уже находящееся в пути, было бы доставлено тому, кому его выдали следующим.
  • Никаких правил, фильтров, пересылки, вебхуков и ИИ. spam — это флаг на сообщении, и никто по нему ничего не делает. Ничто не было разложено по папкам, и ничто здесь не суммируется и не эмбеддится.
  • Никаких отбоев. Почта на домен из пула, которая не называет ни живой одноразовый ящик, ни адрес, созданный оператором, молча отбрасывается, и это сделано намеренно: публичный генератор адресов притягивает словарные атаки, а запись отчёта о доставке по любому обратному пути, заявленному атакой, сделала бы установку источником обратного рассеяния.
  • Нет настроенного домена — нет сервиса. Когда TEMP_MAIL_DOMAINS пуст, GET /temp-mail/domains отвечает пустым списком, а создание ящика отвечает 503 temp_mail_unavailable. Входящая доставка на домен из пула не была проверена от начала до конца на живом домене.

Настройка домена, если установка ваша

Список — это конфигурация: раздаётся то, что назвал TEMP_MAIL_DOMAINS. DNS ничем не автоматизирован, поэтому четыре из этих пяти шагов — это человек у регистратора.

  1. Зарегистрируйте под это домен. Берите тот, который вы готовы позволить раздавать незнакомцам. Все адреса на нём делят его репутацию, и поэтому же выбиратель распределяет новые ящики по пулу случайно, а не заполняет первый домен.
  2. Добавьте его в приложении в Settings → Domains. Это создаст отправляющую идентичность и выведет DNS-записи для публикации.
  3. Опубликуйте у регистратора записи MX, SPF, DKIM и TXT _openemail-challenge. Проверка читает живой DNS и повторно выполняется по cron; предлагается только подтверждённый домен.
  4. Добавьте подтверждённый домен в TEMP_MAIL_DOMAINS на сервере, через запятую. Пока он там не перечислен, это обычный домен рабочего пространства.
  5. Оставьте catch-all ВКЛЮЧЁННЫМ. Именно он позволяет одноразовому адресу существовать без его создания, потому что почта на любую локальную часть принимается и считывается до обычного поиска получателя, так что для домена из пула строка адреса не записывается никогда; при выключенном catch-all одноразовая почта начала бы раскладываться в настоящий почтовый ящик.

Зарезервированные локальные части (postmaster, abuse, security и остальные из RFC 2142) никогда не могут быть одноразовыми и проваливаются в обычный почтовый ящик. Домен из пула, который отправляет в чёрную дыру собственные жалобы на злоупотребления, — это домен, который перестаёт быть способным доставлять куда-либо. Адрес, который вы сами создали на домене из пула, например legal@ или privacy@, ведёт себя так же: почта на него попадает в ваш ящик, и никому его не выдадут как одноразовый.

В этом разделе