Cấu hình SMTP_ADDR, SMTP_USER, SMTP_PASSWORD, MAIL_FROM, CONTACT_EMAIL. Khi có credential, SMTP bắt buộc STARTTLS. Mailpit giữ toàn bộ email thử tại local, không cần credential.
Chữ ký webhook
Tạo webhook HTTPS công khai trong Settings và lưu secret được hiển thị một lần. Tính HMAC-SHA256 trên chuỗi timestamp, dấu chấm và nguyên byte body. Kiểm tra X-Nextvision-Timestamp, X-Nextvision-Signature, X-Nextvision-Event-ID; đối chiếu chữ ký constant time, giới hạn độ cũ timestamp và chống nhận trùng theo event ID.
Retry
Outbox PostgreSQL được ghi cùng transaction nghiệp vụ. Redis báo có công việc; DB giữ nguồn dữ liệu chính. Worker nhận lease và lấy lại lease hết hạn. Retry theo exponential backoff, tối đa 8 lần. Xem mục Notifications để biết kết quả.
Email/webhook có ngữ nghĩa at-least-once: có thể gửi lại nếu tiến trình chết sau khi bên nhận chấp nhận nhưng trước khi DB xác nhận. Email giữ Message-ID ổn định; webhook receiver cần deduplicate event ID. Unique constraint ngăn tạo nhiều delivery record cho cùng event/đích nhận.