跳转到内容

添加与验证域名

要从 hello@acme.com 发送邮件,你需要通过发布 DNS 记录来证明自己拥有 acme.com。验证会设置 DKIM 签名(让收件方确认邮件确实来自你)和自定义 return path(让 SPF 和 DMARC 与你的域名对齐)。

  1. 添加域名

    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})` : ""}`);
    }

    你也可以使用控制台或 spacepost domains add acme.com。

  2. 创建 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 服务商处添加这些记录。参见下文的记录详解和服务商指南。

  3. 验证

    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 now
    if (error) throw new Error(error.message);
    const { data: domain } = await spacepost.domains.get(id);
    console.log(domain?.status); // "verified" once DKIM is confirmed

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,取值相同,因此你可以清楚地看到具体缺少哪一条。

如果 acme.com 已验证,你就可以从任意子域名发送(news@mail.acme.com)。对于营销邮件,更好的做法是单独验证子域名本身(mail.acme.com),这样可以让信誉与事务邮件域名相互独立。

套餐 域名数
Free 3
Pro 10
Scale 1,000

添加已被其他团队注册的域名会返回 422 validation_error(“Domain already registered”)。

遇到问题?参见故障排查。