Gửi email qua SMTP

Trỏ ứng dụng dùng SMTP vào Banger, từ Supabase Auth, WordPress đến trình gửi thư của framework. Khóa Banger API là mật khẩu, mọi tin nhắn gửi từ tên miền của bạn và xuất hiện trong Nhật ký.

Cài đặt

Máy chủsubmit.bangermail.com
Cổng465 với TLS ngay từ đầu, hoặc 587 với STARTTLS. Nếu mạng chặn, dùng 2465 (TLS) hoặc 2587 (STARTTLS); cổng 25 cũng dùng STARTTLS.
Tên người dùngbanger. Giá trị nào cũng được: chỉ khóa API xác định không gian làm việc.
Mật khẩuKhóa Banger API có phạm vi mail:send.
Mã hóaTLS 1.2 trở lên. Chỉ cho đăng nhập sau khi TLS bắt đầu, nên khóa không bao giờ truyền qua mạng dưới dạng văn bản thuần.
Xác thựcPLAIN hoặc LOGIN.

Trước khi bắt đầu

  1. Tạo khóa API. Trong ứng dụng Banger, mở Cài đặt → Nhà phát triển → Quản lý khóa API, chọn Tạo khóa API, chọn mail:send và sao chép khóa: chỉ hiển thị một lần. Trang hiển thị các cài đặt SMTP này bên cạnh khóa.
  2. Gửi từ luồng Sản phẩm. Địa chỉ From phải nằm trên tên máy chủ có luồng Sản phẩm hoạt động, dành cho biên nhận, cảnh báo và email khác từ ứng dụng. Trong Tên miền, chọn Thêm luồng, rồi Sản phẩm, và thêm bản ghi DNS được liệt kê. Luồng Mail (hộp thư nhóm) hoặc Chiến dịch không chuyển email ứng dụng, nên email ứng dụng không thể ảnh hưởng uy tín hộp thư đến của nhóm.

Ví dụ: Supabase Auth

Trong dự án Supabase, mở Authentication → Emails → SMTP Settings và bật SMTP tùy chỉnh:

Email người gửiĐịa chỉ trên luồng Sản phẩm, như noreply@app.example.com
Tên người gửiTên sản phẩm của bạn. Banger gửi đúng như đã viết.
Máy chủsubmit.bangermail.com
Cổng465
Tên người dùngbanger
Mật khẩuKhóa API của bạn

Lưu, rồi gửi liên kết đăng nhập từ Authentication → Users để kiểm tra đã đến.

Ví dụ: Node.js

import nodemailer from "nodemailer";

const transport = nodemailer.createTransport({
  host: "submit.bangermail.com",
  port: 465,
  secure: true,
  auth: { user: "banger", pass: process.env.BANGER_API_KEY },
});

await transport.sendMail({
  from: "Acme <noreply@app.example.com>",
  to: "person@example.com",
  subject: "Your receipt",
  html: "<p>Thanks for your order.</p>",
});

Để thử từ terminal bằng swaks:

swaks --server submit.bangermail.com:465 --tls-on-connect \
  --auth PLAIN --auth-user banger --auth-password "$BANGER_API_KEY" \
  --from noreply@app.example.com --to you@example.com

Điều xảy ra với mỗi tin nhắn

  • Banger gửi tin nhắn như ứng dụng đã viết, với tên From của bạn, ký bằng khóa DKIM của tên miền và gửi từ tên miền thư trả lại của luồng Sản phẩm.
  • Xóa Bcc, Return-Path và header riêng của Banger, rồi thêm Reply-To chỉ địa chỉ From khi chưa có.
  • Mỗi người nhận được kiểm tra tại RCPT TO: địa chỉ bị chặn gửi bị từ chối riêng, các địa chỉ khác vẫn được gửi.
  • Tin nhắn tối đa 10 MiB với tối đa 50 người nhận.
  • Header Idempotency-Key khiến lần thử lại là cùng lượt gửi. Không có header, vẫn nhận ra lần thử lại cùng tin nhắn và người nhận.
  • Mọi tin nhắn xuất hiện trong Nhật ký với SMTP là nguồn và tính vào gói như lượt gửi khác.

Phản hồi và lỗi

Từ chối nêu nguyên nhân và có tham chiếu (ref …) khớp mục trong Nhật ký. Mã bắt đầu bằng 4 là tạm thời: ứng dụng có thể thử lại sau.

Phản hồiÝ nghĩa
535 5.7.8Mật khẩu không phải khóa Banger API hợp lệ, khóa đã bị thu hồi hoặc thiếu mail:send.
421 4.7.0Ba lần đăng nhập thất bại trên một kết nối: kết nối đóng. Kiểm tra khóa trước khi thử lại.
454 4.7.0Quá nhiều đăng nhập thất bại từ mạng của bạn trong giờ qua. Thử lại sau.
550 5.7.1Tên máy chủ From không có luồng Sản phẩm sẵn sàng gửi (phản hồi nêu điều còn thiếu), người nhận bị chặn gửi hoặc gửi bị tạm dừng vì uy tín.
553 5.1.3Địa chỉ người nhận không hợp lệ.
552 5.3.4Tin nhắn lớn hơn 10 MiB.
554 5.6.0Tin nhắn sai định dạng, ví dụ header From hoặc Subject lặp lại, hoặc From có hơn một địa chỉ.
451 4.7.0Đã dùng hết hạn mức gửi hoặc giới hạn ngày của không gian làm việc. Gia hạn vào kỳ thanh toán hoặc ngày tiếp theo, hoặc ngay khi nâng gói.
451 4.3.0Banger chưa thể nhận tin nhắn lúc này. Thử lại.

Bảo mật

  • Banger chỉ lưu mã băm mỗi khóa. Thu hồi hoặc xoay khóa trong Quản lý khóa API; ứng dụng khách SMTP dùng khóa bị từ chối ở lần đăng nhập tiếp theo.
  • Cấp SMTP khóa riêng chỉ có mail:send, để mật khẩu bị lộ không thể đọc không gian làm việc.
  • Đăng nhập thất bại được giới hạn theo mạng ứng dụng khách và khóa; đăng nhập bị từ chối với khóa của bạn được ghi trong Nhật ký.

Thích HTTP hơn? Cùng khả năng gửi có qua Banger API.