Webhook email realtime: kiến trúc nhận thư cho ứng dụng
Có ba cách nhận thư trong ứng dụng: poll định kỳ, webhook (server đẩy), và WebSocket (kênh mở). Mỗi cách có đánh đổi riêng về độ trễ, độ phức tạp và chi phí.
Polling vs Webhook vs WebSocket
Polling: đơn giản, dễ làm, nhưng tốn request và có độ trễ. Hợp cho script ngắn.
Webhook: server đẩy ngay khi có thư, ít tốn tài nguyên, hợp cho hệ thống tự động (n8n, backend).
WebSocket: kênh hai chiều mở liên tục, độ trễ thấp nhất, hợp cho giao diện realtime.
Xác thực chữ ký HMAC
Webhook phải xác thực để chắc request thật sự từ Mailtr. Tính lại HMAC-SHA256 từ secret và so sánh:
import crypto from "node:crypto";
function verify(rawBody, signature, secret) {
const expected = crypto.createHmac("sha256", secret).update(rawBody).digest("hex");
return crypto.timingSafeEqual(Buffer.from(expected), Buffer.from(signature));
}
// trong handler: doc header X-Mail1h-Signature, so voi verify(body, sig, secret) Thiết kế đáng tin cậy
Trả 2xx nhanh rồi xử lý nền để tránh timeout. Idempotent theo message_id để không xử lý trùng. Có cơ chế dự phòng (poll) nếu webhook lỡ. Xem bài n8n để có ví dụ thực tế.