Vũ Văn HảiFull-stack · AI-native
Hướng dẫnBlog
Trao đổi dự án

© 2026 Vũ Văn Hải · Viết từ kinh nghiệm triển khai thật.

Trang chủHướng dẫnBlogRSS
  1. Hướng dẫn
  2. /Tích hợp
  3. /Gửi email bằng Brevo API khi VPS chặn cổng SMTP

Gửi email bằng Brevo API khi VPS chặn cổng SMTP

Gửi email xác thực từ VPS qua Brevo HTTP API v3 (HTTPS, port 443) thay cho SMTP bị chặn: xác thực sender và domain (DKIM, SPF), lấy đúng API key, cấu hình .env và xử lý các lỗi thường gặp.

Cập nhật: 21 thg 9, 20266 phút đọc
EmailBrevoVPS
Mục lục
  • Tóm tắt nhanh
  • Bước 1: Đăng ký tài khoản Brevo
  • Bước 2: Xác thực người gửi (sender)
  • Bước 3: Xác thực tên miền (domain)
  • Bước 4: Lấy API key
  • Bước 5: Cấu hình ứng dụng (.env)
  • Xử lý sự cố

Một số nhà cung cấp VPS (như DigitalOcean, Vultr, Linode) mặc định chặn các cổng SMTP (465, 587) để chống spam, nên gửi email qua SMTP thông thường (ví dụ Gmail SMTP) từ VPS sẽ thất bại với lỗi timeout hoặc connection refused. Bài này dùng Brevo HTTP API v3 - giao tiếp qua HTTPS port 443 nên không bị chặn - để gửi email xác thực thay cho SMTP, đồng thời khắc phục lỗi hiển thị sai địa chỉ email người gửi.

Trong toàn bài, example.com là tên miền của bạn, [email protected] và [email protected] là địa chỉ email gửi, MyApp là tên ứng dụng, <account-id> và <brevo-code> là các mã do Brevo tự sinh. Thay bằng giá trị thật của bạn.

Tóm tắt nhanh

  1. Đăng ký: tạo tài khoản miễn phí trên Brevo.
  2. Xác thực email gửi: vào Senders, Domains & Dedicated IPs > Senders, thêm email gửi và bấm link xác nhận trong hộp thư.
  3. Xác thực domain (nếu dùng email tên miền riêng): vào tab Domains, thêm domain rồi khai báo 3 bản ghi DNS: TXT (DKIM), TXT (SPF) và CNAME (Return-Path).
  4. Lấy API key: menu Profile > SMTP & API > tab API keys & MCP, bấm Generate a new API key (mã có dạng xkeysib-...). KHÔNG lấy SMTP key.
  5. Cấu hình app: cập nhật .env với API key vừa sinh, rồi khởi động lại Docker (docker compose down và docker compose up -d --build).

Bước 1: Đăng ký tài khoản Brevo

Brevo có gói miễn phí vĩnh viễn cho phép gửi 300 email/ngày - dư dả cho việc gửi OTP hay email xác thực tài khoản.

  1. Truy cập trang chủ brevo.com.
  2. Bấm Sign up free ở góc trên bên phải.
  3. Đăng ký bằng Google cho nhanh, hoặc đăng ký bằng email bình thường.
  4. Điền các thông tin cá nhân/công ty được yêu cầu (không bắt buộc thẻ tín dụng).

Bước 2: Xác thực người gửi (sender)

Brevo KHÔNG cho phép gửi email bằng API nếu bạn chưa chứng minh mình là chủ sở hữu của địa chỉ email gửi đi.

  1. Tại dashboard Brevo, vào mục Senders, Domains & Dedicated IPs (menu bên phải dưới cùng, hoặc ở góc trên bên phải).
  2. Chọn tab Senders.
  3. Bấm Add a sender (thêm người gửi).
  4. Nhập thông tin:
    • From Name: tên hiển thị của người gửi, ví dụ MyApp hoặc MyApp Admin.
    • From Email: địa chỉ email sẽ gửi thư, ví dụ [email protected] hoặc [email protected].
  5. Mở hộp thư của bạn, tìm email từ Brevo và bấm nút/link Verify để xác minh.
  6. Đảm bảo trạng thái của sender trên Brevo chuyển thành Active/Verified.

Bước 3: Xác thực tên miền (domain)

Nếu bạn dùng email theo tên miền riêng (ví dụ [email protected]), người nhận thường sẽ thấy người gửi là một địa chỉ lạ như admin@<account-id>.brevosend.com thay vì email chính xác của bạn.

Lý do: domain của sender chưa được verify nên Brevo tự động route email qua domain phụ của họ để thư không rơi vào Spam.

Cách khắc phục:

  1. Vào Settings > Senders & Domains (hoặc mục tương tự trên dashboard), chọn tab Domains.
  2. Bấm Add a domain rồi nhập tên miền (ví dụ example.com).
  3. Thêm 3 bản ghi DNS mà Brevo yêu cầu (bảng bên dưới) vào trang quản lý DNS của tên miền (Cloudflare, MatBao, Tenten...).
  4. Cấu hình DNS xong, quay lại Brevo bấm Verify. Chờ vài phút (tối đa vài giờ) để DNS cập nhật.
  5. Sau khi verify thành công, thêm lại sender [email protected] như Bước 2. Thư sẽ hiển thị đúng [email protected] và không bị rơi vào Spam.

Ba bản ghi DNS cần khai báo:

LoạiTên (Host/Name)Mục đích
TXT (DKIM)mail._domainkey.example.comXác thực email là của bạn
TXT (SPF)example.comCho phép Brevo gửi email thay bạn
CNAME (Return-Path)<brevo-code>.example.comTheo dõi thư trả về (tracking bounces)

Giá trị cụ thể của từng bản ghi hiển thị ngay trên trang domain của Brevo - copy nguyên văn sang trang quản lý DNS.

Bước 4: Lấy API key

Brevo có 2 loại key: SMTP key và API key. Bạn BẮT BUỘC phải lấy API key - SMTP key không dùng được với HTTP API.

Loại keyCách nhận biếtDùng được không
SMTP key (SMTP password)Bắt đầu bằng *** và kết thúc bằng vài chữ cái ngắnKhông
API keyCực kỳ dài và luôn bắt đầu bằng xkeysib-Có
  1. Bấm vào Profile ở góc trên bên phải trang Brevo, chọn SMTP & API.
  2. Màn hình này có 2 tab: "SMTP" và "API keys & MCP".
  3. Chọn tab API keys & MCP.
  4. Bấm Generate a new API key.
  5. Đặt tên gợi nhớ (ví dụ website-prod-api).
  6. Bấm Generate.
  7. Copy ngay lập tức chuỗi mã này (xkeysib-...). Mã chỉ hiện lên một lần duy nhất.

Bước 5: Cấu hình ứng dụng (.env)

Sau khi có đủ thông tin, trên VPS (hoặc máy local), mở file .env và cập nhật cấu hình. Tên biến dưới đây theo ứng dụng mẫu - đổi cho khớp với ứng dụng của bạn:

# 1. Bật chế độ gửi qua HTTP API (brevo) thay cho SMTP truyền thống
Email__Provider=brevo

# 2. Dán API key (bắt đầu bằng xkeysib-) vừa lấy ở Bước 4 vào đây
Email__BrevoApiKey=xkeysib-<your-api-key>

# 3. Điền CHÍNH XÁC email đã verify ở Bước 2
Email__SenderEmail=[email protected]

# 4. Tên hiển thị người gửi (nên khớp với From Name ở Bước 2)
Email__SenderName=MyApp

Khởi động lại ứng dụng Docker:

docker compose down
docker compose up -d --build

Xử lý sự cố

Triệu chứngCách xử lý
Frontend báo lỗi (xoay vòng mãi) và log backend báo "Unauthorized"Bạn đã dán nhầm SMTP password thay vì API key của Brevo. Xem lại Bước 4, đảm bảo lấy đúng key bắt đầu bằng xkeysib-
Log báo API thành công (201 Created) nhưng KHÔNG nhận được thưChưa làm Bước 2 (xác thực sender email) nên Brevo chặn. Cũng có thể thư bị bộ lọc kiểm duyệt của Brevo giữ lại (nghi spam/phishing) - vào Email Log trên dashboard Brevo để xem kết quả chi tiết
Thư vào mục Spam/Thư rácGửi lần đầu thì hộp thư (như Gmail) chưa "quen" - nhờ người nhận mở mục thư rác và đánh dấu Not spam / Báo cáo không phải thư rác vài lần để tăng độ uy tín (deliverability). Đồng thời chắc chắn đã cấu hình DNS DKIM/SPF ở Bước 3
Thư hiển thị sai email gửi dạng admin@<account-id>.brevosend.comChưa xác thực domain (Bước 3). Phải xác thực domain trên trang Brevo thì mới dùng được địa chỉ email theo tên miền riêng
Bài tiếp theoCấu hình webhook và API key SePay để nhận thanh toán

Bài liên quan

  • Đặt app ở đâu trên VPS? Cấu trúc thư mục chuẩn /opt/apps

    Quy ước đặt mỗi app trong một thư mục con của /opt/apps trên VPS: chown thư mục cha một lần duy nhất, từ đó git clone, git pull và sửa .env đều không cần sudo.

    VPS

    VPS
  • Migrate database PostgreSQL giữa hai VPS bằng pg_dump và psql

    Di chuyển toàn bộ một database PostgreSQL (schema lẫn data) từ VPS nguồn sang VPS đích qua máy local: dump bằng pg_dump, restore trong một transaction, verify số dòng, cutover và rollback an toàn.

    Database

    Database
  • Kết nối PostgreSQL trên VPS qua SSH Tunnel từ máy local

    Dùng SSH Tunnel để máy dev kết nối PostgreSQL trên VPS mà không phải mở port 5432 ra internet, kèm cách cấu hình DATABASE_URL cho môi trường local và production.

    Database

    Database

Viết bởi Vũ Văn Hải

Tôi là Hải, full-stack developer ở TP. Hồ Chí Minh. Các bài ở đây đúc kết từ những hệ thống tôi tự dựng và vận hành. Cần dựng hoặc gỡ rối một hệ thống tương tự? Cứ nhắn tôi.

Trao đổi dự ánXem thêm hướng dẫn

Thấy sai sót hoặc lệnh không còn chạy? Báo cho tôi

Mục lục

  • Tóm tắt nhanh
  • Bước 1: Đăng ký tài khoản Brevo
  • Bước 2: Xác thực người gửi (sender)
  • Bước 3: Xác thực tên miền (domain)
  • Bước 4: Lấy API key
  • Bước 5: Cấu hình ứng dụng (.env)
  • Xử lý sự cố