Thực hành n8n đa kênh · Bài 7

Gửi email tự động bằng n8n đúng quy định

Email xác nhận đăng ký, thư cảm ơn, bản tin ưu đãi: n8n gửi được hết, nhưng mỗi loại thư có luật riêng. Bài viết đi từng bước từ tạo credential, dựng workflow, đến đặt các chốt chặn theo Nghị định 91/2020 và quy định người gửi của Google. Đối chiếu tài liệu n8n bản 2.44.4, kiểm tra tháng 10/2026.

Cập nhật 21/10/2026⏱ 10 phút đọcCài đặt & bắt đầuNgười mới → Trung cấp

Thư gửi tay thì sót, thư gửi hàng loạt thì vào spam

Một trung tâm đào tạo gửi thư xác nhận đăng ký bằng tay, cuối tuần không ai trực nên khách đợi hai ngày. Tháng sau, cả đội gửi một lượt thư ưu đãi cho mọi địa chỉ, kể cả người chưa từng đồng ý nhận: hộp thư bị báo đạt giới hạn gửi, vài khách phản ánh bị làm phiền. (Tình huống minh hoạ.)

Gửi email tự động bằng n8n giải quyết được cả hai việc, với điều kiện bạn tách rõ thư giao dịch (xác nhận, nhắc lịch, trả lời yêu cầu của khách) và thư quảng cáo (ưu đãi, bản tin bán hàng), rồi đặt chốt chặn cho loại thứ hai. Chưa quen workflow, đọc trước n8n cho người mới.

Gửi email tự động bằng n8n gồm những gì?

Gửi email tự động bằng n8n là dựng workflow nhận một sự kiện (khách đăng ký, đến lịch, có đơn mới), lấy dữ liệu khách, kiểm tra điều kiện được phép gửi rồi gửi thư qua Gmail node hoặc Send Email (SMTP), và ghi lại đã gửi gì, lúc nào.

Hai đường gửi email tự động bằng n8n: sự kiện như form đăng ký, lịch hằng ngày, đơn mới đi vào workflow; nhánh Gmail node dùng credential Google OAuth2, gửi được thư, trả lời đúng luồng, gắn nhãn, Gmail cá nhân giới hạn khoảng 500 thư mỗi ngày, Google Workspace 2.000 thư mỗi ngày; nhánh Send Email dùng SMTP với app password, cổng 465 hoặc 587; cả hai có Send and Wait để người duyệt và tuỳ chọn tắt dòng chữ ký n8n
Hình: Gmail node hay Send Email (SMTP): hai đường gửi thư từ một workflow (minh hoạ)
  1. Sự kiệnForm, Webhook, Schedule Trigger, đơn mới
  2. Chuẩn hoá dữ liệuEdit Fields: tên, email, mã khách
  3. Chốt chặnIf: email hợp lệ? đồng ý? chưa từ chối?
  4. GửiGmail hoặc Send Email, đã tắt dòng chữ ký n8n
  5. Ghi nhật kýData table hoặc Google Sheets: đã gửi lúc nào
Khung chung của mọi workflow gửi email (ví dụ minh hoạ).

Chọn Gmail node hay Send Email (SMTP)

Gmail nodeSend Email (SMTP)
Kết nốiCredential Google: OAuth2 (khuyên dùng) hoặc Service AccountCredential SMTP: máy chủ, cổng, tài khoản, mật khẩu hoặc app password
Thao tác chínhMessage: Send, Reply, Get, Get Many, Add/Remove Label…; Draft; Thread; Send and WaitSend; Send and Wait for Response (Approval, Free Text, Custom Form)
Tuỳ chọn khi gửiSender Name, Send Replies To, CC, BCC, Attachments, Append n8n attributionReply To, CC, BCC, Attachments, Email Format (Text, HTML, Both), Append n8n Attribution
Lưu ýTự cài n8n với ứng dụng OAuth ở trạng thái Testing: refresh token hết hạn sau 7 ngàyTài liệu ghi node không đặt được header như In-Reply-To, References

Số thư được gửi mỗi ngày do nhà cung cấp hộp thư quyết định, n8n không nới được:

Gmail cá nhân hợp với thư giao dịch số lượng nhỏ; bản tin gửi nhiều người nên đi qua tên miền riêng hoặc dịch vụ gửi email.

Nguồn: Gmail node – Message · Send Email node · Google credentials · Google OAuth 2.0 – Testing 7 ngày · Giới hạn Gmail · Giới hạn Workspace

Bước 1. Tạo credential gửi thư

Cách A – Gmail node. Trong n8n, thêm node Gmail, ở ô Credential chọn tạo mới và đăng nhập bằng OAuth2. Trên n8n Cloud, một số node Google có Managed OAuth2. Nếu tự cài n8n và tự tạo ứng dụng OAuth trong Google Cloud, hãy chuyển ứng dụng khỏi trạng thái Testing: theo Google, ứng dụng loại External ở trạng thái này cấp refresh token chỉ sống 7 ngày, sau đó workflow lỗi xác thực.

Cách B – Send Email (SMTP). Với Gmail qua SMTP, tài liệu n8n hướng dẫn bật xác minh hai bước (2-Step Verification), tạo App password rồi điền như mẫu dưới. Cổng 465 đi cùng công tắc SSL/TLS bật; cổng 587 thì tắt công tắc để dùng STARTTLS; cổng 25 không mã hoá, không nên dùng.

Các ô trong credential SMTPKhông dán vào Termius, chỉ để đối chiếu
Host: smtp.gmail.com            # hoặc máy chủ SMTP của tên miền riêng
Port: 465                       # 465 = bật SSL/TLS; 587 = tắt SSL/TLS (dùng STARTTLS)
SSL/TLS: bật
User: <địa chỉ email gửi>
Password: <app password, nhập thẳng vào ô này trong n8n>
An toàn: app password, mật khẩu, token chỉ nhập vào mục Credentials của n8n; không dán vào node Code, ghi chú workflow, tin nhắn, khung chat AI hay ảnh chụp màn hình. Lỡ để lộ thì thu hồi và tạo cái mới.

Nguồn: Google credentials · Google OAuth 2.0 · SMTP credentials · Gmail qua SMTP

Bước 2. Workflow thư xác nhận đăng ký

Thư giao dịch trả lời đúng việc khách vừa yêu cầu. Dựng theo thứ tự:

  1. Trigger: Webhook nhận dữ liệu form website, hoặc n8n Form Trigger nếu chưa có website (cách nối form: Đưa form website về bảng khách hàng).
  2. Edit Fields (Set): tạo các trường ten, email, chuong_trinh, thoi_diem; xoá khoảng trắng thừa ở email.
  3. If: điều kiện String "matches regex" hoặc "is not empty" cho email; không hợp lệ thì rẽ sang nhánh báo người phụ trách thay vì gửi.
  4. Gmail (Message → Send) hoặc Send Email (Send): điền To, Subject, nội dung theo mẫu dưới; mở Options, tắt Append n8n Attribution, đặt Sender Name hoặc Reply To là hộp thư có người đọc.
  5. Data Table (Row → Upsert) hoặc Google Sheets (Append or Update Row): ghi đã gửi thư xác nhận lúc nào, để không gửi trùng khi khách bấm gửi form hai lần.
Mẫu thư xác nhậnCopy rồi dán vào ô Subject và Message; thay phần trong <<…>>
Tiêu đề: Đã nhận đăng ký của {{ $json.ten }}
Nội dung:
Chào {{ $json.ten }},
<Tên doanh nghiệp> đã nhận đăng ký "{{ $json.chuong_trinh }}" của bạn lúc {{ $json.thoi_diem }}.
Tư vấn viên sẽ liên hệ trong giờ làm việc.
Cần đổi thông tin, bạn chỉ cần trả lời thư này.

Phần trong {{ }} là biểu thức n8n, lấy giá trị từ node trước. Chạy thử với email của bạn trước khi publish.

Nguồn: Webhook · If node · Gmail – Send · Send Email · Data Table node

Bước 3. Bảng khách có cột đồng ý và từ chối

Bảng khách phải trả lời được: khách đã đồng ý chưa, lúc nào, bằng cách nào, đã từ chối chưa. Thêm các cột sau vào Data table của n8n hoặc bảng tính (xem Google Sheets làm CRM):

Các cột nên có trong bảng kháchKhông dán vào Termius, chỉ để đối chiếu
ma_khach          # mã ngẫu nhiên, dùng trong link từ chối thay cho email
ten
email
dong_y_quang_cao  # co / trống
ngay_dong_y       # thời điểm khách đồng ý
cach_dong_y       # vd: form website, tích ô đồng ý
tu_choi           # thời điểm từ chối; có giá trị là không bao giờ gửi quảng cáo nữa
lan_gui_qc_cuoi   # thời điểm gửi thư quảng cáo gần nhất

Nghị định 91/2020 yêu cầu người quảng cáo kiểm tra được sự đồng ý rõ ràng và lưu thông tin đăng ký, từ chối tối thiểu 01 năm. Đừng xoá dòng của khách đã từ chối: dòng đó giúp workflow biết không gửi lại. Data table mặc định ai trong cùng project cũng xem được, nên chỉ cho người cần thiết vào project đó.

Nguồn: Nghị định 91/2020 – Điều 11 · n8n – Data tables

Bước 4. Workflow thư quảng cáo có người duyệt

Các chốt chặn cho email quảng cáo trong n8n theo Nghị định 91/2020, ví dụ minh hoạ: lọc khách đã đồng ý trước, chưa từ chối, tối đa 3 thư mỗi địa chỉ trong 24 giờ; tiêu đề có nhãn [QC] ở đầu, cuối thư có phần từ chối; người quản lý duyệt bản xem trước qua Send and Wait; gửi theo lô có giãn nhịp; khách bấm link từ chối thì Webhook ghi cột từ chối, gửi một thư xác nhận không quảng cáo và ngừng gửi
Hình: Thư quảng cáo đi qua các chốt chặn trước khi tới hộp thư khách (minh hoạ)
  1. Schedule Trigger chạy một lần mỗi ngày trong giờ làm việc (đặt múi giờ Asia/Ho_Chi_Minh; tự cài thì đặt GENERIC_TIMEZONE).
  2. Data Table (Row → Get) hoặc Google Sheets (Get Row(s)) lấy khách có dong_y_quang_cao = co và tu_choi trống.
  3. If: lan_gui_qc_cuoi trống hoặc trước thời điểm hiện tại hơn 24 giờ (kiểu Date & Time, phép so "is before"). Tối đa một thư mỗi ngày thì luôn dưới mức 3 thư/24 giờ.
  4. Telegram (thao tác Send and Wait for Response, kiểu Approval) hoặc Gmail (thao tác Send and Wait for Approval): gửi người quản lý tiêu đề, nội dung, số người nhận; bấm duyệt mới đi tiếp. Với Telegram, đặt thêm Limit Wait Time để workflow không chờ mãi.
  5. Loop Over Items chia lô nhỏ, mỗi lô thêm Wait vài giây để giãn nhịp.
  6. Gửi theo mẫu dưới, rồi cập nhật lan_gui_qc_cuoi của từng khách.
Mẫu thư quảng cáoCopy rồi dán vào ô Subject và Message; thay phần trong <<…>>
Tiêu đề: [QC] <nội dung ưu đãi, khớp với thân thư>
Nội dung:
Chào {{ $json.ten }},
<nội dung ưu đãi>

Người gửi: <tên doanh nghiệp> · <số điện thoại> · <email> · <địa chỉ> · <website>
Bạn nhận thư này vì đã đồng ý nhận tin ưu đãi ngày {{ $json.ngay_dong_y }}.
Từ chối nhận thư: <địa chỉ trang từ chối>?ma={{ $json.ma_khach }}
Hoặc trả lời thư này với chữ "TỪ CHỐI", hoặc gọi <số điện thoại>.

Link từ chối dùng ma_khach ngẫu nhiên, không đặt email hay số điện thoại vào đường link.

Nguồn: Schedule Trigger · If – Date &amp; Time · Send and Wait for Response · Xử lý giới hạn tốc độ · Nghị định 91/2020 – Điều 13, 17–20

Bước 5. Nhận yêu cầu từ chối và dừng ngay

  1. Tạo workflow mới bắt đầu bằng Webhook, HTTP method GET, Respond = "Using 'Respond to Webhook' Node". Đường dẫn production của webhook là <địa chỉ trang từ chối> trong mẫu thư.
  2. Data Table (Row → Update), điều kiện ma_khach Equals giá trị ma trên link; ghi thời điểm vào tu_choi.
  3. Respond to Webhook: Respond With = Text hoặc Redirect tới trang "Bạn đã từ chối nhận thư".
  4. Gửi một thư xác nhận không chứa quảng cáo, rồi ngừng gửi (Nghị định 91/2020).
  5. Khách từ chối qua email hay điện thoại: người nhận cập nhật cột tu_choi trong ngày.

Huỷ đăng ký một chạm: gửi trên 5.000 thư mỗi ngày tới Gmail thì thư quảng cáo cần hai header List-Unsubscribe và List-Unsubscribe-Post: List-Unsubscribe=One-Click. Node Send Email không đặt được header tự chọn, nên ở quy mô này hãy để n8n gọi dịch vụ gửi email có hỗ trợ sẵn qua HTTP Request.

Nguồn: Webhook · Respond to Webhook · Data Table – Rows · Google – one-click unsubscribe · Nghị định 91/2020 – Điều 20

An toàn và chính sách cần nhớ

Quy địnhNội dung chínhLàm trong n8n
Nghị định 91/2020 – đồng ý trướcChỉ gửi thư quảng cáo khi người nhận đã đồng ý trước; lưu đăng ký, từ chối tối thiểu 1 nămCột đồng ý, cách đồng ý, ngày; không xoá dòng đã từ chối
Nghị định 91/2020 – tần suấtKhông quá 3 thư quảng cáo tới một địa chỉ trong 24 giờ, trừ khi có thoả thuận khácMỗi người tối đa 1 thư/ngày, If kiểm tra lần gửi cuối
Nghị định 91/2020 – hình thứcNhãn [QC] hoặc [AD] ở đầu tiêu đề; tiêu đề khớp nội dung; thông tin người gửi đặt trước phần từ chối ở cuối thưMẫu thư cố định, người duyệt xem trước
Nghị định 91/2020 – từ chốiDừng ngay khi nhận yêu cầu; gửi xác nhận một lần, không quảng cáoWorkflow từ chối ở Bước 5
Luật 91/2025/QH15Đồng ý phải tự nguyện, biết rõ mục đích; im lặng không phải là đồng ý; khách có quyền rút lạiKhông tự đánh dấu "đồng ý" cho khách không trả lời
GoogleMọi người gửi: SPF hoặc DKIM, TLS, tỷ lệ báo spam dưới 0,3%; trên 5.000 thư/ngày thêm DMARC, huỷ đăng ký một chạmCấu hình DNS tên miền gửi; theo dõi tỷ lệ spam

Khung giờ 7:00–22:00 ở Điều 13 Nghị định 91/2020 áp dụng cho tin nhắn quảng cáo (gọi điện 8:00–17:00); nghị định không đặt khung giờ cho email. Gửi email trong 7:00–22:00 chỉ là khuyến nghị nên làm, không phải quy định bắt buộc. Bộ Công an đang lấy ý kiến dự thảo nghị định mới về chống tin nhắn, thư điện tử, cuộc gọi rác (tin ngày 09/09/2026); hãy kiểm tra văn bản đang có hiệu lực trước khi chạy chiến dịch. Bài viết không phải tư vấn pháp lý.

Tổng hợp quy định theo từng kênh Messenger, Zalo OA, SMS, email: Bám đuổi khách đúng chính sách.

Nguồn: Nghị định 91/2020/NĐ-CP · Luật 91/2025/QH15 · Google sender guidelines · Chính phủ – dự thảo nghị định chống tin rác

Kiểm tra đã chạy đúng

Lỗi thường gặp

Hiện tượngNguyên nhân thường gặpCách xử lý
Gmail node lỗi xác thực sau khoảng một tuầnỨng dụng OAuth tự tạo còn ở trạng thái TestingPublish ứng dụng OAuth trong Google Cloud, kết nối lại credential
SMTP báo sai tài khoản hoặc kết nối bị ngắtDùng mật khẩu thường thay app password; cổng và công tắc SSL/TLS không khớpTạo app password; 465 bật SSL/TLS, 587 tắt
"You have reached a limit for sending mail"Vượt giới hạn gửi của GmailGiảm số thư, chờ 1–24 giờ, chuyển bản tin sang tên miền riêng hoặc dịch vụ gửi email
Thư vào thư mục spamTên miền chưa có SPF, DKIM; nhiều người báo spamCấu hình DNS, chỉ gửi cho người đã đồng ý, giữ link từ chối dễ thấy
Link từ chối báo lỗi 404Dùng Test URL hoặc workflow chưa publishPublish workflow, dùng Production URL

Nguồn: Google OAuth 2.0 · SMTP credentials · Giới hạn Gmail · Google sender guidelines · Webhook – Test và Production URL

Bắt đầu từ đâu?

  1. Hôm nay: tạo credential và workflow thư xác nhận đăng ký (Bước 1–2), chạy thử với email của bạn.
  2. Tuần này: thêm cột đồng ý, từ chối vào bảng khách và dựng workflow từ chối (Bước 3, 5) trước khi gửi thư quảng cáo nào.
  3. Sau đó: bật workflow thư quảng cáo có người duyệt; kết hợp nhắc lịch theo mốc ở Nhắc lịch và chăm sóc khách theo mốc và báo lỗi qua bot Telegram.

Đọc tiếp: Nhắc lịch, chăm sóc theo mốc →

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

Nên dùng Gmail node hay Send Email (SMTP) trong n8n?

Gmail node hợp khi bạn dùng tài khoản Google và cần các thao tác như trả lời đúng luồng thư, gắn nhãn, đọc thư. Send Email hợp với mọi hộp thư có SMTP, kể cả máy chủ thư của tên miền riêng. Cả hai đều có thao tác gửi rồi chờ người duyệt. Giới hạn số thư mỗi ngày do nhà cung cấp hộp thư đặt, không phải do n8n.

Gửi email cảm ơn sau khi khách đăng ký có phải xin đồng ý nhận quảng cáo không?

Thư xác nhận đúng việc khách vừa yêu cầu không phải là thư quảng cáo. Nếu trong thư có giới thiệu sản phẩm, ưu đãi thì phần đó là quảng cáo và phải theo Nghị định 91/2020: có sự đồng ý trước, nhãn [QC] hoặc [AD] ở đầu tiêu đề, phần từ chối ở cuối thư. Bài viết không phải tư vấn pháp lý; trường hợp chưa rõ nên hỏi luật sư.

Danh sách email mua lại có dùng để gửi tự động được không?

Không nên. Nghị định 91/2020 coi thư quảng cáo gửi khi chưa có sự đồng ý trước là thư rác, và người quảng cáo phải kiểm tra được sự đồng ý đó. Luật Bảo vệ dữ liệu cá nhân 91/2025/QH15 ghi rõ im lặng hoặc không phản hồi không được coi là đồng ý.

Vì sao thư gửi từ n8n có dòng "This email was sent automatically with n8n"?

Cả Send Email và Gmail node đều mặc định gắn dòng này. Tắt bằng tuỳ chọn Append n8n Attribution trong node.

Gửi trên 5.000 thư mỗi ngày tới Gmail thì cần gì thêm?

Theo hướng dẫn người gửi của Google: thêm DMARC và thư quảng cáo phải hỗ trợ huỷ đăng ký một chạm bằng hai header List-Unsubscribe và List-Unsubscribe-Post, kèm link huỷ rõ ràng trong thân thư. Tài liệu node Send Email của n8n không có tuỳ chọn thêm header tự đặt, nên ở quy mô này hãy dùng dịch vụ gửi email có hỗ trợ sẵn và để n8n gọi dịch vụ đó qua HTTP Request.

Tài liệu liên quan

Xem tất cả tài liệu hướng dẫn →

Bước tiếp theo

Đăng ký tư vấn 1:1

Chuyên gia Aduca cùng bạn xem quy trình hiện tại, chọn việc nên giao cho AI Agent trước và cách kiểm soát rủi ro.

Về AducaChuỗi bài do đội ngũ Aduca biên soạn từ kinh nghiệm đào tạo và triển khai AI Agent cho Marketing – Sales. Aduca Academy do Nguyễn Đức – Chủ tịch Aduca Group sáng lập; ông kinh doanh thương mại điện tử từ 2012, chạy quảng cáo Facebook từ 2014 và đào tạo từ 2016. Phần thực hành từng bước nằm trong các thư mục OpenClaw, Hermes Agent, Claude, ChatGPT và n8n, Second Brain.

Nguồn tham khảo

Lịch sử cập nhật

Miễn trừ trách nhiệm

Bài viết thuộc chuỗi kiến thức của Công ty Cổ phần Giáo dục Aduca, chia sẻ miễn phí cho mục đích học tập. Thông tin kỹ thuật đối chiếu với tài liệu chính thức của các dự án và nền tảng tại ngày cập nhật (có ghi nguồn); phần nhận định là quan điểm của Aduca. OpenClaw, Hermes Agent, Claude (thương hiệu của Anthropic), ChatGPT (thương hiệu của OpenAI), n8n (thương hiệu của n8n GmbH), các phần mềm chạy model và các model AI mở (Ollama, LM Studio, Qwen, Gemma, gpt-oss…), Obsidian, Notion, phương pháp Building a Second Brain (Tiago Forte) cùng các phần mềm, dịch vụ nêu trong bài thuộc về chủ sở hữu tương ứng, không thuộc Aduca; Aduca không phải đối tác chính thức của các công ty này. Tính năng, gói và giá có thể thay đổi bất cứ lúc nào – hãy kiểm tra trang chính thức trước khi mua. Kết quả áp dụng phụ thuộc quy trình, dữ liệu và con người của từng doanh nghiệp; bài viết không cam kết doanh thu hay hiệu quả cụ thể. © 2026 Aduca — được trích dẫn khi ghi rõ nguồn aduca.vn.