Email ảo để test đăng ký: chọn loại nào cho QA và developer

Không phải bài test nào cũng cần email thật. Test luồng đăng ký trên app của chính bạn ở môi trường staging thì một máy chủ thư giả (loại công cụ "bắt thư" chạy nội bộ) là đủ: nhanh, miễn phí, không gửi gì ra internet. Bạn chỉ cần hộp thư thật khi muốn chắc thư xác minh thực sự tới được Gmail hay iCloud, khi chạy test trên môi trường thật, hoặc khi luồng đi qua một dịch vụ bên thứ ba có kiểm tra tên miền email. Lúc đó, một hộp thư thật đọc được qua API là cách gọn nhất để Playwright, Selenium hay Cypress tự lấy mã.

Bốn loại email dùng để test

Loại Hợp với Không hợp với
Máy chủ thư giả trong staging Test tích hợp, test tự động app của bạn Kiểm tra thư có tới Gmail, iCloud thật; dịch vụ bên thứ ba
Alias Gmail (dấu +) của hộp thư nhóm QA Test tay, vài tài khoản, mỗi lần chạy một hậu tố Dịch vụ chặn dấu + hoặc gộp biến thể; test cần nhiều hộp thư tách biệt
Mail tạm Kiểm tra nhanh luồng không quan trọng Dịch vụ chặn tên miền mail tạm; tự động hóa cần ổn định
Hộp thư Gmail, iCloud thật qua API E2E trên môi trường thật, dịch vụ bên thứ ba, chạy trong CI Luồng cần gửi thư đi, tài khoản phải giữ lâu, kiểm thử tải

Alias rẻ và tiện cho test tay, nhưng mọi biến thể về cùng một hộp và nhiều dịch vụ gộp chúng làm một; bài tạo nhiều email từ 1 Gmail nói rõ giới hạn này.

Chọn theo tình huống test

Luồng E2E với hộp thư thật qua API

Với OTPGmail, luồng chuẩn có năm bước:

  1. Gọi POST /v1/orders với service và domain (gmail.com hoặc icloud.com), kèm header Idempotency-Key mới cho mỗi đơn. App của bạn không có trong danh sách thì dùng mã ot ("Dịch vụ bất kỳ", giá cao hơn); test trên một dịch vụ có sẵn thì lấy mã của nó từ GET /v1/services. Phản hồi là một mảng đơn, mỗi đơn có orderId và email.
  2. Điền email vào form đăng ký.
  3. Gọi GET /v1/orders/{orderId} mỗi 3–5 giây; mã hoặc link mới nhất nằm ở cuối mảng otp.
  4. Nhập mã, kiểm tra kết quả.
  5. Hết thời gian chờ của bài test mà chưa có mã thì gọi POST /v1/orders/{orderId}/cancel để được hoàn tiền ngay (chỉ hủy được trước khi có mã đầu). Không gọi thì hệ thống tự hủy và hoàn 100% khi hết thời gian chờ, tối đa 25 phút.

Mã mẫu cho Node 18 trở lên, dùng được trong Playwright; địa chỉ gốc của API và cách lấy API key ghi trong tài liệu API:

import { randomUUID } from 'node:crypto';

const BASE = process.env.OTPGMAIL_BASE_URL;
const AUTH = { Authorization: `Bearer ${process.env.OTPGMAIL_API_KEY}` };
const sleep = (ms) => new Promise((r) => setTimeout(r, ms));

export async function rentInbox(service = 'ot', domain = 'gmail.com') {
  const res = await fetch(`${BASE}/v1/orders`, {
    method: 'POST',
    headers: { ...AUTH, 'Content-Type': 'application/json', 'Idempotency-Key': randomUUID() },
    body: JSON.stringify({ service, domain }),
    signal: AbortSignal.timeout(15000),
  });
  const body = await res.json();
  if (!body.success) throw new Error(body.error.code);
  return body.data[0];
}

export async function waitForCode(orderId, maxMs = 300000) {
  const end = Date.now() + maxMs;
  while (Date.now() < end) {
    const res = await fetch(`${BASE}/v1/orders/${orderId}`, { headers: AUTH });
    const order = (await res.json()).data;
    if (order.otp.length) return order.otp.at(-1).code;
    if (order.status === 'cancelled') return null;
    await sleep(4000);
  }
  await fetch(`${BASE}/v1/orders/${orderId}/cancel`, { method: 'POST', headers: AUTH });
  return null;
}

Trong bài test, gọi rentInbox(), điền email vào form, rồi waitForCode(orderId) trước khi nhập mã. Nếu bạn tự viết phần thử lại cho lệnh tạo đơn bị timeout, hãy gửi lại đúng Idempotency-Key của lần đầu để không tạo đơn trùng.

Giới hạn và chi phí cần tính trước khi đưa vào CI

Thực hành tốt khi test bằng email thật

Cách thuê trên web và theo lô cho developer có ở bài thuê Gmail cho developer test đăng ký; ví dụ Python và cách xử lý từng mã lỗi ở bài API nhận OTP qua email cho tool tự động.

Câu hỏi thường gặp

Có cần email thật để chạy test Playwright hay Selenium không?

Không phải lúc nào cũng cần. Test app của bạn trong staging thì máy chủ thư giả là đủ. Cần email thật khi kiểm tra thư tới được Gmail, iCloud, khi chạy trên môi trường thật hoặc khi luồng đi qua dịch vụ bên thứ ba có kiểm tra tên miền.

Dùng alias Gmail dấu + cho test tự động có ổn không?

Ổn cho test tay và số lượng nhỏ, nếu dịch vụ chấp nhận dấu +. Không ổn khi dịch vụ gộp các biến thể làm một tài khoản, hoặc khi bạn cần nhiều hộp thư thật sự tách biệt.

Mã không về trong CI thì có mất tiền không?

Với thuê lẻ thì không: hủy trước khi có mã, hoặc để hệ thống tự hủy khi hết thời gian chờ, bạn được hoàn 100% vào số dư. Riêng thuê theo lô không hoàn tiền cho hộp thư không nhận được mã.

Nên test bằng @gmail.com hay @icloud.com?

Nên chạy cả hai, vì người dùng thật của bạn dùng cả hai. Nếu chỉ chọn một để tiết kiệm, iCloud thường rẻ hơn Gmail, tùy dịch vụ; dịch vụ chưa có iCloud sẽ trả lỗi DOMAIN_UNAVAILABLE, khi đó chuyển sang gmail.com.

Bài liên quan

Thuê Gmail nhận OTP ngay

Đăng ký miễn phí, chỉ trừ tiền khi thuê thành công. Không có mã trong 25 phút — hoàn tiền 100% tự động.

Không thấy dịch vụ bạn cần? Bấm Thêm dịch vụ trên trang thuê, admin bổ sung nếu hạ tầng hỗ trợ.

Cần tài khoản Gmail đăng nhập được chứ không chỉ nhận mã? Xem mua Gmail live ngắn · Hoàn tiền và bảo hành