添加与验证域名
要从 hello@acme.com 发送邮件,你需要通过发布 DNS 记录来证明自己拥有 acme.com。验证会设置 DKIM 签名(让收件方确认邮件确实来自你)和自定义 return path(让 SPF 和 DMARC 与你的域名对齐)。
-
添加域名
add-domain.ts import { SpacePost } from "@spacepost/node";const spacepost = new SpacePost(process.env.SPACEPOST_API_KEY);const { data: domain, error } = await spacepost.domains.create({ name: "acme.com" });if (error) throw new Error(`${error.name}: ${error.message}`);console.log(domain.id, domain.status); // "not_started" or "pending"for (const r of domain.records ?? []) {console.log(`${r.type.padEnd(5)} ${r.name} -> ${r.value}${r.priority ? ` (priority ${r.priority})` : ""}`);}终端窗口 curl -X POST https://api.spacepost.dev/domains \-H "Authorization: Bearer $SPACEPOST_API_KEY" \-H "Content-Type: application/json" \-d '{ "name": "acme.com" }'r = requests.post("https://api.spacepost.dev/domains",headers={"Authorization": f"Bearer {os.environ['SPACEPOST_API_KEY']}"},json={"name": "acme.com"},)for rec in r.json()["records"]:print(rec["type"], rec["name"], rec["value"])你也可以使用控制台或
spacepost domains add acme.com。 -
创建 DNS 记录
响应中包含
records数组和recommended_records数组(DMARC):Response (abridged) {"object": "domain","id": "0192e1c4-0000-7000-8000-000000000001","name": "acme.com","status": "not_started","region": "eu-central-1","open_tracking": false,"click_tracking": false,"records": [{ "record": "DKIM", "name": "a1b2c3d4e5f6._domainkey", "type": "CNAME", "ttl": "Auto", "status": "not_started", "value": "a1b2c3d4e5f6.dkim.amazonses.com" },{ "record": "DKIM", "name": "g7h8i9j0k1l2._domainkey", "type": "CNAME", "ttl": "Auto", "status": "not_started", "value": "g7h8i9j0k1l2.dkim.amazonses.com" },{ "record": "DKIM", "name": "m3n4o5p6q7r8._domainkey", "type": "CNAME", "ttl": "Auto", "status": "not_started", "value": "m3n4o5p6q7r8.dkim.amazonses.com" },{ "record": "SPF", "name": "send", "type": "MX", "ttl": "Auto", "status": "not_started", "value": "feedback-smtp.eu-central-1.amazonses.com", "priority": 10 },{ "record": "SPF", "name": "send", "type": "TXT", "ttl": "Auto", "status": "not_started", "value": "\"v=spf1 include:amazonses.com ~all\"" }],"recommended_records": [{ "record": "DMARC", "name": "_dmarc", "type": "TXT", "ttl": "Auto", "status": "not_started", "value": "\"v=DMARC1; p=none;\"" }]} -
验证
DNS 变更可能需要几分钟(偶尔需要数小时)。SpacePost 会自动重新检查待验证的域名,你也可以随时手动触发检查:
verify-domain.ts import { SpacePost } from "@spacepost/node";const spacepost = new SpacePost(process.env.SPACEPOST_API_KEY);const id = "0192e1c4-0000-7000-8000-000000000001";const { error } = await spacepost.domains.verify(id); // asks SpacePost to re-check DNS nowif (error) throw new Error(error.message);const { data: domain } = await spacepost.domains.get(id);console.log(domain?.status); // "verified" once DKIM is confirmed终端窗口 curl -X POST https://api.spacepost.dev/domains/$DOMAIN_ID/verify -H "Authorization: Bearer $SPACEPOST_API_KEY"curl https://api.spacepost.dev/domains/$DOMAIN_ID -H "Authorization: Bearer $SPACEPOST_API_KEY"终端窗口 spacepost domains verify acme.comspacepost domains doctor acme.com # looks up each record live and tells you what is missing or wrong
API 中的记录名称是相对于你的域名的(send、_dmarc、a1b2c3d4e5f6._domainkey)。有些 DNS 服务商要求填写完整名称(send.acme.com);服务商指南中会说明具体情况。
| 记录 | 类型 | 名称 | 值 | 用途 |
|---|---|---|---|---|
| DKIM(3 条) | CNAME | <token>._domainkey |
<token>.dkim.amazonses.com |
发布 Amazon SES 为你轮换的公钥(“Easy DKIM”)。收件方用它们来验证每封邮件确实由你的域名签名且未被篡改。必需:验证依赖全部三条记录。 |
| Return path | MX | send |
feedback-smtp.<region>.amazonses.com,优先级 10 |
接收发往 send.acme.com 的退信和投诉通知。与下面的 TXT 记录一起构成自定义 MAIL FROM 域名。 |
| Return path | TXT | send |
v=spf1 include:amazonses.com ~all |
return path 子域名的 SPF。由于信封发件人位于你的域名下,SPF 会与你的 From 地址对齐,而这正是 DMARC 所需要的。 |
| DMARC(推荐) | TXT | _dmarc |
v=DMARC1; p=none; |
告诉收件方如何处理未通过认证的邮件,Gmail 和 Yahoo 要求群发发件人必须配置。参见 DMARC。 |
| 状态 | 含义 |
|---|---|
not_started |
域名已添加,尚未检测到 DNS 记录。 |
pending |
SpacePost 正在检查 DNS。 |
verified |
DKIM 已确认。你可以从该域名发送邮件。 |
temporary_failure |
查询暂时失败。系统会自动重试。 |
failed |
72 小时内未找到 DNS 记录,或某条记录有误。请修复记录后再次调用 verify。 |
只要 DKIM 通过,域名就会变为 verified。如果仅缺少 return path 记录,邮件仍可发送,但 SPF 对齐会回退到 Amazon 的域名,从而削弱 DMARC 对齐。为获得最佳送达率,请补全这些记录。
records 中的每条记录都有自己的 status,取值相同,因此你可以清楚地看到具体缺少哪一条。
从子域名发送
Section titled “从子域名发送”如果 acme.com 已验证,你就可以从任意子域名发送(news@mail.acme.com)。对于营销邮件,更好的做法是单独验证子域名本身(mail.acme.com),这样可以让信誉与事务邮件域名相互独立。
| 套餐 | 域名数 |
|---|---|
| Free | 3 |
| Pro | 10 |
| Scale | 1,000 |
添加已被其他团队注册的域名会返回 422 validation_error(“Domain already registered”)。
DNS 服务商指南
Section titled “DNS 服务商指南”遇到问题?参见故障排查。