§2 · Kiến trúc
Một hệ thống email marketing tự host thực sự hoạt động như thế nào.
Một lần gửi campaign đi qua năm giai đoạn. Hiểu các giai đoạn này là điều kiện tiên quyết để chọn nền tảng, chọn sending relay, và debug deliverability khi một campaign chạy kém.
[Marketer's browser]
│
▼ HTTPS POST /campaigns
[Web app — Laravel/Symfony/Go] ◀── REST API also lands here
│
▼ enqueue per-recipient job
[Job queue — Redis / beanstalkd / DB]
│
▼ worker picks job, renders MIME
[Sending driver — SES/Mailgun/SMTP]
│
▼ TLS, AUTH, DATA, .
[Mail Transfer Agent (MTA)]
│
▼ SMTP to recipient MX
[Recipient mail server — Gmail/O365/Yahoo]
│
▼ open pixel · click redirect · bounce · complaint
[Webhook back to web app] ◀── reputation feedback loop
Stage 1 — soạn campaign. Marketer viết campaign trong UI web: subject line, sender name, chọn danh sách, content editor (drag-and-drop, MJML, hay raw HTML). Khi họ nhấn "send", application tạo một bản ghi campaign rồi enqueue per-recipient job vào background queue. Chưa có gì rời server cả.
Stage 2 — queue + worker. Background worker pull job với tốc độ queue được cấu hình (thường 5–50 send/giây mỗi worker). Worker fetch row subscriber, merge custom field vào template, embed tracking pixel keyed theo message-id, và viết lại mọi link thành click-tracking redirect. Kết quả là một MIME message đã được personalize đầy đủ, sẵn sàng giao cho sending driver.
Stage 3 — sending driver. Driver là adapter giữa application của bạn và bất kỳ transport nào bạn chọn: một API call Amazon SES, một HTTPS POST Mailgun, một SendGrid Web API call, hay một handshake SMTP AUTH PLAIN thô tới Postal MTA của riêng bạn. Pattern sending-driver của AcelleMail, ví dụ, định nghĩa một contract 5 method (connect, send, getDeliveryStatus, getCapabilities, validateConfig) mà mọi driver implement — xem /developers/sending-drivers cho guideline driver đầy đủ. Driver built-in ship cho Amazon SES, SendGrid, Mailgun, SparkPost, Elastic Email, Gmail SMTP, và bất kỳ generic SMTP server nào (8 vendor sống trong app/SendingServers/Drivers/Vendors/).
Stage 4 — MTA → recipient. MTA (của bạn hoặc của relay) mở SMTP connection tới MX server bên nhận, tự giới thiệu bằng HELO/EHLO, negotiate STARTTLS, authenticate khóa DKIM-signing, và submit message. Mail server bên nhận chạy spam scoring, verify SPF/DKIM/DMARC, xử lý header list-unsubscribe, rồi quyết định inbox hay reject.
Stage 5 — feedback loop. Ba tín hiệu quay về, đều bất đồng bộ. Bounce đến qua SMTP (mã 5xx cho hard bounce, 4xx cho soft) hoặc qua webhook của relay. Complaint (người nhận nhấn "spam") đến qua Feedback Loop của Mailbox Provider hoặc, lại, webhook của relay. Engagement (open pixel hit, click-redirect request) đến qua HTTP thuần ngược về web app của bạn. Application dùng các tín hiệu này để update suppression list, retire địa chỉ chết, và đẩy vào analytics campaign. Catalogue webhook-event của AcelleMail nằm tại config/webhook_events.php — đó là danh sách canonical các event mà application emit và consume.
Hình dáng giống nhau trên mọi nền tảng tự host, với một biến: queue và MTA sống ở đâu. Worker của AcelleMail chạy cùng box với web app mặc định; Listmonk làm tương tự; Mautic dùng Symfony Messenger và hỗ trợ worker box tách riêng. Mail relay có thể local (Postal cùng máy, Postfix trên box anh em) hoặc remote (SES, Mailgun) — quyết định đó là chủ đề của §5.