Тимчасова пошта
на Go.
Одноразова пошта для Go — одним HTTP-запитом.
package main
import (
"bytes"
"encoding/json"
"fmt"
"net/http"
"os"
)
func main() {
req, _ := http.NewRequest("POST",
"https://evilmail.pro/api/temp-email",
bytes.NewBufferString(`{"ttlMinutes": 30}`))
req.Header.Set("X-API-Key", os.Getenv("EVILMAIL_KEY"))
req.Header.Set("Content-Type", "application/json")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()
var r struct {
Data struct {
Email string `json:"email"`
SessionToken string `json:"sessionToken"`
} `json:"data"`
}
json.NewDecoder(resp.Body).Decode(&r)
fmt.Println("Inbox ready:", r.Data.Email)
}Створіть тимчасову пошту в Go за кілька рядків: API одноразової пошти EvilMail дозволяє створювати тимчасові поштові скриньки, опитувати їх на нові повідомлення та витягувати OTP-коди прямо з вашого набору тестів чи CI-конвеєра. Замість того щоб няньчитися зі справжньою поштовою скринькою або скрапити веб-інтерфейс, ви звертаєтеся до простих HTTP-ендпоінтів через net/http і декодуєте JSON — без стороннього SDK, без headless-браузера. Він створений для тестування верифікації електронної пошти в Go, димових тестів реєстраційних потоків і будь-якого сценарію, де вам потрібна справжня адреса, що приймає листи, на вимогу.
Навіщо використовувати тимчасову пошту на Go
Автоматизоване тестування реєстрації
Реєструйте свіжу одноразову пошту в Go для кожного наскрізного тестового прогону, щоб акаунти ніколи не перетиналися. Кожна скринька справжня та приймає листи, тож ваш потік реєстрації поводиться точно так само, як у продакшені.
OTP і верифікація електронної пошти
Опитайте скриньку, отримайте лист із підтвердженням і витягніть 6-значний код через regex — усе в одній горутині Go. Ідеально для тестування потоків верифікації та двофакторної автентифікації без участі людини.
Конвеєри CI/CD
Оскільки це лише net/http і ключ API зі змінної середовища, той самий код працює локально та в GitHub Actions чи GitLab CI. Немає SMTP-сервера й облікових даних поштової скриньки, які потрібно ротувати.
Навантажувальне тестування та тестування кількох акаунтів
Створюйте багато незалежних скриньок одночасно за допомогою горутин, щоб симулювати сотні користувачів, які реєструються водночас. Кожен токен сесії ізолює одну скриньку, тож паралельні тести залишаються чистими.
Процес — тимчасова пошта Go за 3 виклики
Створіть одноразову скриньку
// createInbox spins up a disposable EvilMail inbox and
// returns its address plus the session token used to poll it.
func createInbox(key string) (email, token string, err error) {
body := bytes.NewBufferString(`{"ttlMinutes": 30}`)
req, err := http.NewRequest("POST",
"https://evilmail.pro/api/temp-email", body)
if err != nil {
return "", "", err
}
req.Header.Set("X-API-Key", key)
req.Header.Set("Content-Type", "application/json")
resp, err := http.DefaultClient.Do(req)
if err != nil {
return "", "", err
}
defer resp.Body.Close()
var r struct {
Data struct {
Email string `json:"email"`
SessionToken string `json:"sessionToken"`
} `json:"data"`
}
if err := json.NewDecoder(resp.Body).Decode(&r); err != nil {
return "", "", err
}
return r.Data.Email, r.Data.SessionToken, nil
}Опитуйте, доки не прийде лист
// Message mirrors one row from the inbox listing.
type Message struct {
UID int `json:"uid"`
From string `json:"from"`
Subject string `json:"subject"`
}
// waitForMessage polls the inbox ~20 times, 3s apart, until at
// least one message lands, then returns the first one.
func waitForMessage(key, token string) (Message, error) {
url := "https://evilmail.pro/api/temp-email/" + token
for i := 0; i < 20; i++ {
req, _ := http.NewRequest("GET", url, nil)
req.Header.Set("X-API-Key", key)
resp, err := http.DefaultClient.Do(req)
if err != nil {
return Message{}, err
}
var r struct {
Data struct {
Messages []Message `json:"messages"`
} `json:"data"`
}
json.NewDecoder(resp.Body).Decode(&r)
resp.Body.Close()
if len(r.Data.Messages) > 0 {
return r.Data.Messages[0], nil
}
time.Sleep(3 * time.Second) // wait, then retry
}
return Message{}, fmt.Errorf("timed out waiting for email")
}Прочитайте повідомлення й витягніть код
// otpRe matches a standalone 6-digit verification code.
var otpRe = regexp.MustCompile(`\b(\d{6})\b`)
// readCode fetches a message body and pulls the 6-digit OTP.
func readCode(key, token string, uid int) (string, error) {
url := fmt.Sprintf(
"https://evilmail.pro/api/message/%d?token=%s", uid, token)
req, _ := http.NewRequest("GET", url, nil)
req.Header.Set("X-API-Key", key)
resp, err := http.DefaultClient.Do(req)
if err != nil {
return "", err
}
defer resp.Body.Close()
var r struct {
Data struct {
Text string `json:"text"`
HTML string `json:"html"`
} `json:"data"`
}
json.NewDecoder(resp.Body).Decode(&r)
// Regex over the plain-text body (fall back to HTML).
m := otpRe.FindStringSubmatch(r.Data.Text)
if m == nil {
return "", fmt.Errorf("no 6-digit code found")
}
return m[1], nil
}Тимчасова пошта Go — FAQ
Q1Як отримати адресу тимчасової пошти в Go?−
Надішліть POST-запит на https://evilmail.pro/api/temp-email із заголовком X-API-Key і JSON-тілом на кшталт {"ttlMinutes": 30}. Відповідь містить data.email (адресу) і data.sessionToken (використовується для опитування цієї скриньки). Функція createInbox вище робить саме це за допомогою net/http і encoding/json — без потреби в SDK.
Q2Чи можна використовувати це для автоматизованого тестування?+
Так, це основний сценарій використання. Увесь потік — це простий HTTP, тож він одразу вбудовується в тестові файли Go, CI-завдання чи навантажувальні скрипти. Читайте ключ API зі змінної середовища, наприклад EVILMAIL_KEY, створюйте скриньку для кожного тесту й знищуйте її, коли спливає TTL. Ви можете створювати багато скриньок одночасно за допомогою горутин для паралельних тестів.
Q3Як витягнути OTP з листа?+
Після того як опитування повертає повідомлення, зробіть GET на https://evilmail.pro/api/message/{uid}?token={sessionToken}, щоб отримати його тіло. Потім запустіть regexp по data.text (або data.html). Окремий 6-значний код відповідає шаблону \b(\d{6})\b — скомпілюйте його один раз через regexp.MustCompile і використовуйте FindStringSubmatch, щоб захопити цифри, як показано в readCode.
Q4Чи потрібен ключ API і чи є обмеження швидкості?+
Так — кожен запит має надсилати ваш ключ у заголовку X-API-Key, і читання повідомлень також його вимагає. Ніколи не вписуйте ключ жорстко в код; завантажуйте його зі змінної середовища. Обмеження швидкості застосовуються для кожного ключа й достатньо щедрі для звичайного використання в тестах і CI; якщо ви запускаєте важкі навантажувальні тести, додайте невелику паузу між викликами (цикл опитування вже засинає на 3 с між спробами).
Q5Скільки живе скринька?+
Час життя скриньки задається значенням ttlMinutes, яке ви передаєте під час її створення — наприклад 30 хвилин. Щойно TTL спливає, скринька та її повідомлення видаляються, а токен сесії перестає повертати листи, тож створюйте нову скриньку для кожного прогону, а не використовуйте повторно старий токен.
Тимчасова пошта іншими мовами
Один ключ API. Одноразові скриньки в масштабі.
Створюйте необмежену кількість тимчасових адрес, опитуйте їх через HTTP і витягуйте коди підтвердження прямо у ваші тести й CI. Безкоштовний старт; власні домени та вищі ліміти на платних тарифах.

