Mailjet 对接与踩坑避雷:Cloudflare DNS + 事务型邮件(Step by Step)
本文详细介绍了如何使用Mailjet配置事务型邮件发送服务,适用于拥有自有域名并使用Cloudflare托管DNS的用户。主要内容包括:1)Mailjet账号注册与业务审核注意事项;2)发送域配置中的SPF/DKIM/DMARC设置要点;3)API密钥获取与SMTP/Send API发送方式;4)事件回调Webhooks的配置建议;5)常见问题解决方案,如SPF记录合并、DKIM格式处理等。重点提

适用人群:
- 使用 Cloudflare 做 DNS 托管的自有域名(示例:
anymk.app) - 只发 事务型(Transactional) 邮件(系统通知、任务提醒、告警),不用 Mailjet 做营销群发
全流程速览
- 注册/激活 Mailjet 账号 → 完成业务审核
- 在 Mailjet 添加 发送域 → 配置 SPF / DKIM / DMARC(Cloudflare)
- 通过 Mailjet 的域名认证检测(SPF/DKIM = OK)
- 申请解除发送限制 / 解封(如遇到审查或“发送被暂停”)
- 获取 API Key / Secret → 选择 SMTP 或 Send API 对接发信
- 配置 事件回调 Webhooks(Event Notifications) 做投递与退信监控
- 进行 投递验证(查看邮件原文,确认 SPF/DKIM/DMARC 均 PASS)
实战心得:最大坑往往出在 DNS(尤其是 SPF 多条、DKIM 换行) 和 发件人策略(用免费邮箱当 From)。
Step 0:准备工作与名词
- 发送域(From Domain):建议使用自有域名,例如
noreply@yourdomain.com。 - 事务型邮件:与业务操作直接相关的通知,不需要退订链接,但不要混入营销内容。
- Cloudflare 橙云/灰云:TXT/MX 记录与代理无关,但注意不要把 MX 或发信相关主机开代理。
Step 1:注册 & 审核(解封)
- 注册 Mailjet,完成邮箱验证。
- 如出现“Your sending activity is currently suspended/已暂停发送”,通常需要补充业务说明。建议一次性提供:
- 业务简介(做什么,服务对象是谁)
- 月发送量(区间即可,如 500–1,000/月)
- 邮件类型(明确:仅事务型,无营销/推广)
- 触发场景 & 频次(例如任务分派、任务完成通知、系统告警)
- 收件人来源(仅员工、内部系统产生,非购买或第三方列表)
- 示例邮件(3 封左右,含主题/正文/收件人角色)
- 如客服要求,**先完成域名认证(SPF/DKIM)**再继续审核。
模板(可中英双语)在文末附录。
Step 2:在 Mailjet 添加发送域
路径:Account → Domains and senders → SPF/DKIM Authentication。
添加你要作为 From 使用的域(例如 anymk.app)。添加后,Mailjet 会给出:
- 一个 域验证 TXT(形如
mailjet._XXXXXXXX) - 一个 DKIM TXT(
mailjet._domainkey) - SPF 建议值
在 Cloudflare 中按下文配置。
Step 3:SPF 配置(只能一条,合并所有发信源)
常见坑:同一个主机(通常是根域 @)存在多条 SPF TXT,结果整体 SPF 失效。
做法
- 在 Cloudflare 的 DNS → 记录 中,找到现有 SPF TXT 记录,合并为一条。
- 将你用到的发信源 全部 include 到同一条 SPF。例如你同时用 Mailjet、Google Workspace、Cloudflare Email Routing,可以这样:
v=spf1 include:spf.mailjet.com include:_spf.google.com include:_spf.mx.cloudflare.net ~all
小贴士:
- 末尾选择
~all(软失败)更稳妥;成熟后可评估改为-all(硬失败)。- SPF 有 10 次 DNS lookup 限制,不要盲目堆叠 include;如接近上限,考虑“扁平化”(flatten)。
- 记录只有一条,若 Cloudflare 提示“有多个 SPF 记录无效”,请删除多余的 TXT。
Step 4:DKIM 配置(单行、2048 位、带引号)
在 Mailjet 的“Domain Authentication Setup”里会看到:
- 记录类型:
TXT - 主机名(Hostname):
mailjet._domainkey - 值(Value):
k=rsa; p=...(一整行,2048 bit 公钥)
常见坑:
- 把 DKIM 值粘贴成多行、或缺少引号,导致 Mailjet 检测报错。
- 解决:在 Cloudflare 新建 TXT 时,把
k=rsa; p=...用 一对双引号 包起来(超长值 Cloudflare 会自动按 RFC 分片,但在 UI 里看仍是一条)。
保存后回到 Mailjet 点 Refresh 检测,直到 DKIM = OK。
Step 5:DMARC(先 p=none 观察,再收紧)
在 Cloudflare 添加 TXT 记录:
- 名称:
_dmarc - 值:
v=DMARC1; p=none; rua=mailto:dmarc@yourdomain.com; ruf=mailto:dmarc@yourdomain.com; fo=1
建议先 p=none 收集报告 1–2 周,确认影响后可逐步改为 quarantine → reject。
Step 6:可选设置(更“像自己”)
- Account → Tracking settings:
- 事务型邮件一般可只开 Open/Click 里你真正需要的指标;减少重写链接带来的“追踪”痕迹。
- Page Domains:若用 Mailjet 托管退订页/表单/登陆页,设置自定义子域(品牌化)。
Step 7:获取 API Key & 发送方式
路径:Account → API Key Management。
A) SMTP 方式(最简单)
- Host:
in-v3.mailjet.com - Port:
587(STARTTLS)或465(SSL) - Username:Mailjet API Key
- Password:Mailjet Secret Key
Node.js(Nodemailer)示例:
import nodemailer from 'nodemailer';
const transporter = nodemailer.createTransport({
host: 'in-v3.mailjet.com',
port: 587,
secure: false, // 587 + STARTTLS
auth: {
user: process.env.MJ_API_KEY,
pass: process.env.MJ_API_SECRET,
},
});
await transporter.sendMail({
from: 'noreply@yourdomain.com', // 必须是已认证域
to: 'employee@yourdomain.com',
subject: '任务指派 #12345',
text: '请在 App 查看任务详情',
});
B) Send API 方式(更灵活)
cURL 示例:
curl -s \
-X POST \
--user "$MJ_API_KEY:$MJ_API_SECRET" \
-H 'Content-Type: application/json' \
-d '{
"Messages": [
{
"From": {"Email": "noreply@yourdomain.com", "Name": "System"},
"To": [{"Email": "employee@yourdomain.com"}],
"Subject": "任务完成通知 #67890",
"TextPart": "任务已完成,请在后台审核。"
}
]
}' \
https://api.mailjet.com/v3.1/send
Step 8:事件回调 Webhooks(强烈推荐)
路径:Account → Event notifications (webhooks)。
- 建议至少订阅:
bounce,blocked,spam,unsub,open,click - 你的服务端暴露一个 HTTPS 接口接收 JSON,收到后入库/告警。
- 先用 Mailjet 的 Test 功能验证签名/可达性。
Step 9:投递验证(Header 自查)
给自己的 Gmail/Outlook 发一封,打开“查看原始邮件 / View Original”,确认:
spf=pass(domain=yourdomain.com)dkim=pass(selector=mailjet)dmarc=pass(policy=none/quarantine/reject)- Return-Path/From/Message-ID 等域名一致性合理(尽量同域或可解释的子域)。
Step 10:高频坑与解决
- SPF 多条 → 合并为单条,只保留一条包含所有 include 的 TXT。
- DKIM 值换行/缺引号 → 以 单行 + 双引号 形式保存。
- 用
gmail.com等免费邮箱当 From → 被拒:Mailjet 明确不支持作为发件域;必须用自有域。 - DNS 传播 → Cloudflare 一般几分钟,但客户端缓存/递归解析器可能延迟;等 5–30 分钟再点 Mailjet 的 Refresh。
- 事务型邮件被当营销 → 文案避免“促销/折扣/营销词”,不必加退订,但确保确属业务必要通知。
- 点击追踪导致超链接被重写 → 若介意,可在 Tracking settings 关闭 Click tracking 或仅在特定邮件禁用。
- 退信 550/5.7.x(未认证/策略失败) → 逐项核对 SPF/DKIM/DMARC 的 PASS;检查 From 域、Return-Path、信封发件人与头部一致性。
- Cloudflare 提示“有多个 SPF 记录无效” → 删除多余 SPF TXT(见 Step 3)。
Step 11:合规与策略(事务型)
- 收件人均为员工/内部,邮件是履职所需;无需退订。
- 严禁导入购买/第三方列表。
- 保留发送日志与回执,便于审计。
Step 12:故障排查清单(Checklist)
@根域只有 一条 SPF,内容包含include:spf.mailjet.com与其他必要 includemailjet._domainkeyTXT 存在,值为单行 2048 位公钥_dmarcTXT 存在,先p=none收集报告- Mailjet 后台 SPF = OK,DKIM = OK
- API Key/Secret 正确,SMTP 587/STARTTLS 或 465/SSL 可连通
- Webhooks 正常收到事件
- 实测邮件头:
spf=pass、dkim=pass、dmarc=pass
Cloudflare 操作速记
- 进入 DNS → 记录:
- 新建 TXT(名称
@):SPF 合并后的那一条 - 新建 TXT(名称
mailjet._domainkey):粘贴 DKIM 值(单行) - 新建 TXT(名称
_dmarc):DMARC 策略
- 新建 TXT(名称
- 保存后回 Mailjet 点 Refresh。
附录 A:与 Mailjet 支持沟通模板(英文)
Subject: Account Review Information – Transactional Emails Only
Hi Mailjet Support,
We use Mailjet only for transactional emails to our employees. Monthly volume: 500–1,000.
Triggers:
1) Work Assignment → to field workers (5–10/week)
2) Task Completion → to supervisors (10–20/day)
3) System Alerts → to admins (1–2/week)
Recipients: employees only (internal HR directory), no purchased/third‑party lists.
Compliance: no marketing or promotional content; work‑related notifications only.
Domain authentication has been completed (SPF/DKIM OK). Samples attached below if needed.
Could you please lift the sending suspension?
Thanks,
[Your Name]
附录 B:事务型邮件示例(可直接用作模板)
任务指派
Subject: 新任务已分派 - #12345
From: noreply@yourdomain.com
To: employee@yourdomain.com
您好,
系统已为您分派新的任务:#12345。
请在移动端 App 查看详情并按时处理。
任务完成通知
Subject: 任务已完成 - #67890
From: noreply@yourdomain.com
To: supervisor@yourdomain.com
您好,
任务 #67890 已由 {员工姓名} 完成,请在后台审核。
系统告警
Subject: 【告警】数据同步失败 - 需处理
From: alerts@yourdomain.com
To: admin@yourdomain.com
时间:2025-11-06 15:00
类型:数据同步失败
条目:15
请尽快查看同步日志并处理。
结语
按照以上步骤走,90% 的坑基本都能避开:
- Cloudflare 里 SPF 只留一条,DKIM 单行
- Mailjet 后台看到 SPF/DKIM = OK 再联调
- 先
p=none看 DMARC 报告,确认稳定后再收紧 - 打通 Webhooks,出现退信/封禁能第一时间发现
如果你现在的域名已经是 OK 状态,但仍被暂停发送,直接把本指南里的关键信息整理给支持(附加 2–3 封事务型示例),一般就能顺利解封。
更多推荐


所有评论(0)