Почта вашего продукта,
от вызова до результата
Приложение отправляет письмо вызовом, а OpenEmail шлёт его с вашего домена. Каждый вызов записан на ключ, которым он сделан, и у каждой отправки есть результат, который можно прочитать.
Вызов возвращает ID письма. Каждое событие, которое получает ваш эндпоинт, несёт тот же ID.
С чего это начинается
Как это выглядит сегодня.
Почта уходит из вашего кода
Чеки, коды регистрации и сбросы пароля отправляет ваш бэкенд, их не набирает человек.
После отправки ничего не возвращается
Клиент говорит, что код не пришёл, а записи о доставке, чтобы это проверить, нет.
Один общий ключ и никаких записей о вызовах
Все сервисы отправляют с одним секретом, и нигде не видно, какой вызов не прошёл и когда.
Как это работает
Готово в четыре шага.
- 01
Подтвердите домен
Опубликуйте записи из настроек, и домен станет зелёным, когда они совпадут.
- 02
Выпустите ограниченный ключ
Ограничьте ключ адресами и доменами, с которых он может отправлять, а ролью ограничьте то, до чего он дотянется.
- 03
Отправьте письмо вызовом
Один вызов указывает шаблон, значения и получателя, и повтор не отправит его дважды.
- 04
Примите вебхук, прочитайте журнал
Ваш эндпоинт получает каждое событие с ID письма, а в журнале видно: доставлено, отказ или ошибка.
На чём это держится
Части, которые делают работу.
Это держится на документированном API с ключами, которые можно ограничить, типизированном SDK, вебхуках на ваш эндпоинт, шаблонах с версиями и записях, которые стоят за вашим отправляющим доменом.
Документированный HTTP API с ключами, которые можно выпускать, ограничивать и отзывать.
Сначала клиент на TypeScript, потом остальные.
Сообщаем вашему эндпоинту о приходе письма, вместо того чтобы заставлять вас опрашивать.
Текст, написанный один раз, с версиями, отправленный много раз: из редактора, из вашего кода или агентом.
Знак рядом с отправителем, когда опубликованные записи отправляющего домена сходятся.
Начальная запись p=none, показанная для копирования или записанная синхронизацией; ужесточать её за вас никто не станет.
v=DMARC1; p=none; rua=…
На практике
Каждая часть по шагам.
Четыре коротких страницы проходят весь путь: отправка из кода, чтение журнала вызовов, что произошло после отправки и почта внутри тестового прогона, которая ещё впереди.
Отправляйте чеки, коды и ссылки для сброса из своего кода и узнавайте, когда они доходят.
Каждый вызов ключа, каждый отправленный вебхук, с кодом и временем.
Дайте каждому прогону теста свой адрес и читайте полученную почту.
Вопросы
Их задают до регистрации.
Что мешает повтору отправить одно письмо дважды?
Один вызов указывает шаблон, значения и получателя, и его повтор не отправит дважды. Вызов возвращает ID письма, и каждое событие, которое получает ваш эндпоинт, несёт тот же ID.
Видно ли, что произошло после отправки?
Да. Каждая отправка читается как доставлено, отказ, жалоба или ошибка, по дням, источникам и адресам отправителя, а журнал запросов хранит метод, путь, код ответа и длительность каждого вызова, сделанного ключом.
Есть ли SDK для моего языка?
Чаще всего пока нет. Типизированный клиент сначала для TypeScript, остальные будут позже, поэтому пока любой другой язык обращается напрямую к документированному HTTP API.
Рядом
Другие задачи для того же ящика.
У каждой заявки, записи или клиента может быть свой адрес. Письмо туда приходит на ваш эндпоинт подписанным событием, а ваш код отвечает с этого адреса.
Дайте агенту собственный адрес и ключ, ограниченный тем, что ему можно. Он читает, ставит метки, пишет черновики и отправляет, а каждый его вызов записывается.
Напишите один раз как шаблон. Отправьте из редактора, из своего кода или в выбранный день, а потом прочитайте, что было дальше.