跳到正文

邮件

事务性邮件,支持模板、域名验证与投递追踪。

1. 概览

基础路径: https://api.infrai.cc/v1/email
鉴权头: Authorization: Bearer $INFRAI_API_KEY
bash
# Call any /v1/email capability over raw HTTP — no SDK to install.
# curl:
curl https://api.infrai.cc/v1/email/... \
  -H "Authorization: Bearer $INFRAI_API_KEY" \
  -H "Content-Type: application/json"

2. 方法 (17)

2.1email.send

POST /v1/email/send

发送事务性邮件;支持模板与附件。

参数

名称类型必填说明
tostring | string[]
必填
收件地址或地址列表。
subjectstring
必填
邮件主题。
textstring可选纯文本正文。
htmlstring可选HTML 正文。
fromstring可选发件地址(需已验证域名)。
ccstring[]可选抄送地址。
bccstring[]可选密送地址。
template_idstring可选用于渲染的模板 id(替代正文)。
template_varsRecord<string, unknown>可选传入模板的变量。
attachmentsArray<{ filename, content, mime? }>可选要附加的文件。
vendorstring可选固定使用某个供应商,而非自动路由。
idempotency_keystring可选可选去重 key;相同重试将返回同一结果。

返回

EmailRecord { email_id, state, to, subject, vendor, created_at }
名称类型说明
message_idstringmessage的唯一标识符
pattern: ^msg_[A-Za-z0-9]{20,}$
vendor_message_idstring | null上游供应商分配的消息标识符
from_usedstring实际用于投递的发件邮箱地址
mode"default_vendor" | "verified_domain"投递模式或操作模式
scheduled_atstring | nullISO 8601 时间戳:the resource is scheduled to activate(ISO 8601)
format: date-time
accepted_recipientsstring[]recipient email addresses that were accepted列表
suppressed_recipientsstring[]recipient email addresses that were suppressed列表
metadataobject | null本次发送的成本/供应商披露(成本透明契约面)。为内核 ResultMetadata 的超集,另带邮件专属 `mode` 字段;供应商路由解析后存在(仅当所有收件人在尝试投递前已被抑制时缺失……即便如此通常仍以 cost_usd=0 存在)。
metadata.request_idstringUUID v7。
metadata.trace_idstring分布式追踪标识符
metadata.timestampstring数据点的 Unix 时间戳
format: date-time
metadata.latency_msinteger操作延迟(毫秒)
≥ 0
metadata.entry_formany入口格式(rest、mcp、sdk)
metadata.cost_usdnumber此操作成本(美元)
≥ 0
metadata.cost_cnynumber此请求成本(人民币)
≥ 0
metadata.vendorstring适配器名称;引用 VendorRegistry。
metadata.vendor_region"china" | "western"处理此请求的供应商区域
metadata.markup_pctnumber供应商成本之上的加价百分比
metadata.mode"default_vendor" | "verified_domain"本次发送解析出的邮件投递模式(邮件专属字段,不存在于通用 kernel ResultMetadata)。

示例

一次性前置(每个范例都假定已完成):

bash
# No SDK to install — every call is a plain HTTPS request.
# Get a project key by signing in at https://infrai.cc/login (Google/GitHub gives
# you $2 free credit; email sign-in starts at $0). On 402 INSUFFICIENT_CREDIT, add
# funds at https://infrai.cc/billing (or POST /v1/account/topup and open the
# returned checkout_url).
export INFRAI_API_KEY="ifr_..."
bash
curl -X POST https://api.infrai.cc/v1/email/send \
  -H "Authorization: Bearer $INFRAI_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"to": "sample"}'

2.2email.get

GET /v1/email/get/{id}

按 id 获取单条邮件记录。

参数

名称类型必填说明
idstring
必填
邮件记录 id。

返回

EmailRecord
名称类型说明
message_idstring消息存档 ID(msg_ + 十六进制)。
pattern: ^msg_[A-Za-z0-9]{12,}$
statestring聚合状态——参见 enums/email_state.yaml。
channel"email"存档记录的投递渠道。
toany消息发送的收件人(字符串或数组,按提交时的格式)。
vendorstring实际派发消息的供应商。
created_atnumber | string消息存档时的 Unix 秒数(或 ISO-8601)。
per_recipient_stateobject可选——收件人邮箱到逐收件人状态的映射(仅在配置了投递事件 Webhook 管道时填充)。
first_event_atstring可选——首次投递事件时间戳(从 Webhook 派生)。
format: date-time
last_event_atstring可选——最近投递事件时间戳(从 Webhook 派生)。
format: date-time
countsobject可选——按事件类型的统计(delivered/bounced/opened/clicked/...),从 Webhook 派生。

示例

一次性前置(每个范例都假定已完成):

bash
# No SDK to install — every call is a plain HTTPS request.
# Get a project key by signing in at https://infrai.cc/login (Google/GitHub gives
# you $2 free credit; email sign-in starts at $0). On 402 INSUFFICIENT_CREDIT, add
# funds at https://infrai.cc/billing (or POST /v1/account/topup and open the
# returned checkout_url).
export INFRAI_API_KEY="ifr_..."
bash
curl -X GET https://api.infrai.cc/v1/email/get/ID \
  -H "Authorization: Bearer $INFRAI_API_KEY"

2.3email.suppression.add

POST /v1/email/suppression/add

将某地址加入抑制名单。

返回

SuppressionRecord
名称类型说明
emailstring邮箱地址
format: email
reason"hard_bounce" | "soft_bounce_5x" | "complained" | "unsubscribed" | "invalid" | "manual" | "user_request"当前状态或操作原因
added_atstring资源添加时间(ISO 8601)
format: date-time
last_attempt_atstring | null此条目上次阻止发送的时间。
format: date-time
attempt_count_blockedinteger | nulldelivery attempts blocked by this suppression数量
≥ 0
notesstring | null关于此抑制的自由文本备注
scope"account" | "domain"此资源的适用范围
domain_scopestring | null当 scope=domain 时,具体的已验证域名。

示例

一次性前置(每个范例都假定已完成):

bash
# No SDK to install — every call is a plain HTTPS request.
# Get a project key by signing in at https://infrai.cc/login (Google/GitHub gives
# you $2 free credit; email sign-in starts at $0). On 402 INSUFFICIENT_CREDIT, add
# funds at https://infrai.cc/billing (or POST /v1/account/topup and open the
# returned checkout_url).
export INFRAI_API_KEY="ifr_..."
bash
curl -X POST https://api.infrai.cc/v1/email/suppression/add \
  -H "Authorization: Bearer $INFRAI_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"email": "user@example.com"}'

2.4email.domain.verify

POST /v1/email/domain/verify

验证发件域名并返回所需 DNS 记录。

参数

名称类型必填说明
domainstring
必填
要验证的域名。

返回

{ verified, records: Array<{ type, name, value }> }
名称类型说明
domainstring顶级域名,如 "yourdomain.com"。
domain_idstringdomain的唯一标识符
pattern: ^dom_[A-Za-z0-9]{20,}$
status"pending_dns" | "verifying" | "verified" | "failed" | "expired"当前资源状态
dns_recordsobject[]域名验证所需的 DNS 记录
dns_records[].type"TXT" | "CNAME" | "MX" | "A" | "AAAA"资源类型标识
dns_records[].namestring完整限定 DNS 名称。
dns_records[].valuestringDNS 记录或配置的值
dns_records[].purpose"spf" | "dkim" | "tracking" | "dmarc" | "return_path" | "verification"DNS 记录用途
dns_records[].ttl_recommendedinteger建议 TTL(秒)
≥ 60default: 3600
checksobject | null逐条记录检查状态("ok"/"pending"/"mismatch"/...)。
warm_up_state"not_started" | "in_progress" | "complete" | null域名当前预热状态
daily_limit_currentinteger | null当前每日发送限额
≥ 0
daily_limit_targetinteger | null预热后目标每日发送限额
≥ 0
created_atstring资源创建时间(ISO 8601)
format: date-time
verified_atstring | nullISO 8601 时间戳:verification was completed(ISO 8601)
format: date-time
expires_atstring | nullDKIM 轮换到期时间(建议 1 年)。
format: date-time
rotatedboolean仅在 email.domain.rotate_dkim 响应中存在:DKIM 密钥轮换发起后为 true(在 DNS 中观测到新记录前状态回落为 pending_dns)。

示例

一次性前置(每个范例都假定已完成):

bash
# No SDK to install — every call is a plain HTTPS request.
# Get a project key by signing in at https://infrai.cc/login (Google/GitHub gives
# you $2 free credit; email sign-in starts at $0). On 402 INSUFFICIENT_CREDIT, add
# funds at https://infrai.cc/billing (or POST /v1/account/topup and open the
# returned checkout_url).
export INFRAI_API_KEY="ifr_..."
bash
curl -X POST https://api.infrai.cc/v1/email/domain/verify \
  -H "Authorization: Bearer $INFRAI_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"domain": "sample"}'

2.5email.batch.send

POST /v1/email/batch/send

批量个性化发送,最多 100 条不同邮件共用一个 idempotency_key(批量直通,单条不重复计费)。

参数

名称类型必填说明
messagesEmailSendOptions[]
必填
邮件数组,每项是一个完整的 EmailSendRequest,各自带收件人与模板变量,1 到 100 条。
1–100 items
idempotency_keystring可选可选去重 key;相同重试将返回同一结果。

返回

BatchSendResult { batch_id, results }
名称类型说明
batch_idstringbatch job的唯一标识符
pattern: ^batch_[A-Za-z0-9]{20,}$
resultsobject[]individual results from a batch operation列表
results[].indexinteger此消息在请求 messages[] 数组中的位置。
≥ 0
results[].message_idstring | null此消息入队失败时为 null。
pattern: ^msg_[A-Za-z0-9]{20,}$
results[].tostring | string[]-
results[].status"accepted" | "suppressed" | "failed"-
results[].errorstring | nullstatus=failed 时的错误码(如 SUPPRESSED_RECIPIENT)。

示例

一次性前置(每个范例都假定已完成):

bash
# No SDK to install — every call is a plain HTTPS request.
# Get a project key by signing in at https://infrai.cc/login (Google/GitHub gives
# you $2 free credit; email sign-in starts at $0). On 402 INSUFFICIENT_CREDIT, add
# funds at https://infrai.cc/billing (or POST /v1/account/topup and open the
# returned checkout_url).
export INFRAI_API_KEY="ifr_..."
bash
curl -X POST https://api.infrai.cc/v1/email/batch/send \
  -H "Authorization: Bearer $INFRAI_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"messages": [{"to": "sample"}]}'

2.6email.event.list

GET /v1/email/event/list

查询指定邮件的投递事件时间线。

参数

名称类型必填说明
message_idstring
必填
必填。要查询事件时间线的邮件 message_id。
typestring可选按事件类型过滤(如 delivered、bounced、opened)。
limitnumber可选返回的最大条数。
cursorstring可选分页游标。

返回

{ items: EmailEvent[], next_cursor? }
名称类型说明
itemsobject[]resource records列表
items[].type"queued" | "sent" | "delivered" | "opened" | "clicked" | "bounced" | "complained" | "deferred" | "expired" | "cancelled" | "unsubscribed" | "auto_suppressed"资源类型标识
items[].atstring事件的 ISO 8601 时间戳
format: date-time
items[].recipientstring收件人邮箱地址
format: email
items[].message_idstring | nullmessage的唯一标识符
pattern: ^msg_[A-Za-z0-9]{20,}$
items[].metaobject | null事件专属元数据(ip / user_agent / url / bounce_type / reason)。
countintegeritems in this page数量
≥ 0
next_cursorstring | null传入 event.list() 以获取下一页。

示例

一次性前置(每个范例都假定已完成):

bash
# No SDK to install — every call is a plain HTTPS request.
# Get a project key by signing in at https://infrai.cc/login (Google/GitHub gives
# you $2 free credit; email sign-in starts at $0). On 402 INSUFFICIENT_CREDIT, add
# funds at https://infrai.cc/billing (or POST /v1/account/topup and open the
# returned checkout_url).
export INFRAI_API_KEY="ifr_..."
bash
curl -X GET https://api.infrai.cc/v1/email/event/list \
  -H "Authorization: Bearer $INFRAI_API_KEY"

2.7email.suppression.check

GET /v1/email/suppression/check/{email}

查询某个收件地址是否在抑制名单中。

参数

名称类型必填说明
emailstring
必填
收件邮箱地址。

返回

SuppressionCheckResult { is_suppressed, record? }
名称类型说明
emailstring被检查的邮箱地址。
suppressedboolean该地址是否当前被抑制
reason"hard_bounce" | "soft_bounce_5x" | "complained" | "unsubscribed" | "invalid" | "manual" | "user_request"当前抑制的原因。仅在 suppressed=true 时存在。
added_atstring此抑制被添加的 ISO 8601 时间戳。仅在 suppressed=true 时存在。
format: date-time
last_attempt_atstring | null此条目上次阻止发送的时间。仅在 suppressed=true 时存在。
format: date-time
attempt_count_blockedinteger | nulldelivery attempts blocked by this suppression. Present only when suppressed=true.数量
≥ 0
notesstring | null关于此抑制的自由文本备注。仅在 suppressed=true 时存在。
scope"account" | "domain"此抑制条目的适用范围。仅在 suppressed=true 时存在。
domain_scopestring | null当 scope=domain 时,具体的已验证域名。仅在 suppressed=true 时存在。

示例

一次性前置(每个范例都假定已完成):

bash
# No SDK to install — every call is a plain HTTPS request.
# Get a project key by signing in at https://infrai.cc/login (Google/GitHub gives
# you $2 free credit; email sign-in starts at $0). On 402 INSUFFICIENT_CREDIT, add
# funds at https://infrai.cc/billing (or POST /v1/account/topup and open the
# returned checkout_url).
export INFRAI_API_KEY="ifr_..."
bash
curl -X GET https://api.infrai.cc/v1/email/suppression/check/EMAIL \
  -H "Authorization: Bearer $INFRAI_API_KEY"

2.8email.suppression.list

GET /v1/email/suppression/list

列出抑制名单中的收件地址。

参数

名称类型必填说明
reasonstring可选按抑制原因过滤(如 bounce、complaint、manual)。
limitnumber可选返回的最大条数。
cursorstring可选分页游标。

返回

{ items: SuppressionRecord[], next_cursor? }
名称类型说明
itemsobject[]resource records列表
items[].emailstring邮箱地址
format: email
items[].reason"hard_bounce" | "soft_bounce_5x" | "complained" | "unsubscribed" | "invalid" | "manual" | "user_request"当前状态或动作的原因
items[].added_atstring此资源添加的 ISO 8601 时间戳
format: date-time
items[].last_attempt_atstring | null此条目上次阻止发送的时间。
format: date-time
items[].attempt_count_blockedinteger | nulldelivery attempts blocked by this suppression数量
≥ 0
items[].notesstring | null关于此抑制的自由文本备注
items[].scope"account" | "domain"此资源的适用范围
items[].domain_scopestring | null当 scope=domain 时,具体的已验证域名。
countintegeritems in this page数量
≥ 0
next_cursorstring | null获取下一页的不透明游标;null 或不存在表示最后一页

示例

一次性前置(每个范例都假定已完成):

bash
# No SDK to install — every call is a plain HTTPS request.
# Get a project key by signing in at https://infrai.cc/login (Google/GitHub gives
# you $2 free credit; email sign-in starts at $0). On 402 INSUFFICIENT_CREDIT, add
# funds at https://infrai.cc/billing (or POST /v1/account/topup and open the
# returned checkout_url).
export INFRAI_API_KEY="ifr_..."
bash
curl -X GET https://api.infrai.cc/v1/email/suppression/list \
  -H "Authorization: Bearer $INFRAI_API_KEY"

2.9email.suppression.delete

DELETE /v1/email/suppression/delete/{email}

将某地址移出抑制名单,恢复对其投递。

参数

名称类型必填说明
emailstring
必填
收件邮箱地址。
idempotency_keystring可选可选去重 key;相同重试将返回同一结果。

返回

{ deleted: boolean }
名称类型说明
emailstring | null已从抑制列表中移除的邮箱地址
deletedboolean抑制条目是否已移除(与 `found` 同值:条目存在且已从抑制存储中移除)。
foundboolean删除调用前该邮箱是否存在抑制条目。

示例

一次性前置(每个范例都假定已完成):

bash
# No SDK to install — every call is a plain HTTPS request.
# Get a project key by signing in at https://infrai.cc/login (Google/GitHub gives
# you $2 free credit; email sign-in starts at $0). On 402 INSUFFICIENT_CREDIT, add
# funds at https://infrai.cc/billing (or POST /v1/account/topup and open the
# returned checkout_url).
export INFRAI_API_KEY="ifr_..."
bash
curl -X DELETE https://api.infrai.cc/v1/email/suppression/delete/EMAIL \
  -H "Authorization: Bearer $INFRAI_API_KEY"

2.10email.domain.list

GET /v1/email/domain/list

列出账户下已添加的发信域名。

参数

名称类型必填说明
limitnumber可选返回的最大条数。
cursorstring可选分页游标。

返回

{ items: DomainVerification[], next_cursor? }
名称类型说明
recordsobject[]resource records列表
records[].domainstring顶级域名,如 "yourdomain.com"。
records[].domain_idstringdomain的唯一标识符
pattern: ^dom_[A-Za-z0-9]{20,}$
records[].status"pending_dns" | "verifying" | "verified" | "failed" | "expired"此资源当前状态
records[].dns_recordsobject[]域名验证所需的 DNS 记录
records[].dns_records[].type"TXT" | "CNAME" | "MX" | "A" | "AAAA"资源类型标识
records[].dns_records[].namestring完整限定 DNS 名称。
records[].dns_records[].valuestringDNS 记录或配置的值
records[].dns_records[].purpose"spf" | "dkim" | "tracking" | "dmarc" | "return_path" | "verification"DNS 记录用途
records[].dns_records[].ttl_recommendedinteger建议 TTL(秒)
≥ 60default: 3600
records[].checksobject | null逐条记录检查状态("ok"/"pending"/"mismatch"/...)。
records[].warm_up_state"not_started" | "in_progress" | "complete" | null域名当前预热状态
records[].daily_limit_currentinteger | null当前每日发送限额
≥ 0
records[].daily_limit_targetinteger | null预热后目标每日发送限额
≥ 0
records[].created_atstring此资源创建的 ISO 8601 时间戳
format: date-time
records[].verified_atstring | null验证完成的 ISO 8601 时间戳
format: date-time
records[].expires_atstring | nullDKIM 轮换到期时间(建议 1 年)。
format: date-time
records[].rotatedboolean仅在 email.domain.rotate_dkim 响应中存在:DKIM 密钥轮换发起后为 true(在 DNS 中观测到新记录前状态回落为 pending_dns)。
total_countinteger跨所有页的总条目数
≥ 0
next_cursorstring | null传入 domain.list() 以获取下一页。

示例

一次性前置(每个范例都假定已完成):

bash
# No SDK to install — every call is a plain HTTPS request.
# Get a project key by signing in at https://infrai.cc/login (Google/GitHub gives
# you $2 free credit; email sign-in starts at $0). On 402 INSUFFICIENT_CREDIT, add
# funds at https://infrai.cc/billing (or POST /v1/account/topup and open the
# returned checkout_url).
export INFRAI_API_KEY="ifr_..."
bash
curl -X GET https://api.infrai.cc/v1/email/domain/list \
  -H "Authorization: Bearer $INFRAI_API_KEY"

2.11email.domain.get

GET /v1/email/domain/get/{domain}

获取某个发信域名的验证状态与信誉信息。

参数

名称类型必填说明
domainstring
必填
要验证的域名。

返回

DomainGetResult { verification, reputation }
名称类型说明
verificationobject域名验证状态和 DNS 记录
verification.domainstring顶级域名,如 "yourdomain.com"。
verification.domain_idstringdomain的唯一标识符
pattern: ^dom_[A-Za-z0-9]{20,}$
verification.status"pending_dns" | "verifying" | "verified" | "failed" | "expired"此资源当前状态
verification.dns_recordsobject[]域名验证所需的 DNS 记录
verification.dns_records[].type"TXT" | "CNAME" | "MX" | "A" | "AAAA"资源类型标识
verification.dns_records[].namestring完整限定 DNS 名称。
verification.dns_records[].valuestringDNS 记录或配置的值
verification.dns_records[].purpose"spf" | "dkim" | "tracking" | "dmarc" | "return_path" | "verification"DNS 记录用途
verification.dns_records[].ttl_recommendedinteger建议 TTL(秒)
≥ 60default: 3600
verification.checksobject | null逐条记录检查状态("ok"/"pending"/"mismatch"/...)。
verification.warm_up_state"not_started" | "in_progress" | "complete" | null域名当前预热状态
verification.daily_limit_currentinteger | null当前每日发送限额
≥ 0
verification.daily_limit_targetinteger | null预热后目标每日发送限额
≥ 0
verification.created_atstring此资源创建的 ISO 8601 时间戳
format: date-time
verification.verified_atstring | null验证完成的 ISO 8601 时间戳
format: date-time
verification.expires_atstring | nullDKIM 轮换到期时间(建议 1 年)。
format: date-time
verification.rotatedboolean仅在 email.domain.rotate_dkim 响应中存在:DKIM 密钥轮换发起后为 true(在 DNS 中观测到新记录前状态回落为 pending_dns)。
reputationobject | null域名验证并开始预热前为 null。
reputation.domainstring域名
reputation.tier"warming_up" | "established" | "trusted" | "throttled" | "suspended"当前订阅档位(standard / pro / enterprise)
reputation.current_daily_capinteger当前每日发送上限
≥ 0
reputation.used_todayintegeremails sent today数量
≥ 0
reputation.bounce_rate_30dnumber最近 30 天退信率
0–1
reputation.complaint_rate_30dnumber最近 30 天投诉率
0–1
reputation.days_in_current_tierinteger当前预热档位已持续天数
≥ 0
reputation.next_tier"warming_up" | "established" | "trusted" | "throttled" | "suspended" | null下一个预热档位
reputation.next_tier_requirementsobject | null升级所需的具体阈值和剩余时长。
reputation.throttle_risk"low" | "medium" | "high"基于近期域名信誉指标的当前限流风险。

示例

一次性前置(每个范例都假定已完成):

bash
# No SDK to install — every call is a plain HTTPS request.
# Get a project key by signing in at https://infrai.cc/login (Google/GitHub gives
# you $2 free credit; email sign-in starts at $0). On 402 INSUFFICIENT_CREDIT, add
# funds at https://infrai.cc/billing (or POST /v1/account/topup and open the
# returned checkout_url).
export INFRAI_API_KEY="ifr_..."
bash
curl -X GET https://api.infrai.cc/v1/email/domain/get/DOMAIN \
  -H "Authorization: Bearer $INFRAI_API_KEY"

2.12email.domain.delete

DELETE /v1/email/domain/delete/{domain}

删除一个已添加的发信域名。

参数

名称类型必填说明
domainstring
必填
要验证的域名。
idempotency_keystring可选可选去重 key;相同重试将返回同一结果。

返回

{ deleted: boolean }
名称类型说明
domainstring | null已删除的域名
deletedboolean域名是否已删除(与 `found` 同值:域名存在且已从自管发信域存储中移除)。
foundboolean删除调用前该域名是否存在域名验证记录。

示例

一次性前置(每个范例都假定已完成):

bash
# No SDK to install — every call is a plain HTTPS request.
# Get a project key by signing in at https://infrai.cc/login (Google/GitHub gives
# you $2 free credit; email sign-in starts at $0). On 402 INSUFFICIENT_CREDIT, add
# funds at https://infrai.cc/billing (or POST /v1/account/topup and open the
# returned checkout_url).
export INFRAI_API_KEY="ifr_..."
bash
curl -X DELETE https://api.infrai.cc/v1/email/domain/delete/DOMAIN \
  -H "Authorization: Bearer $INFRAI_API_KEY"

2.13email.domain.rotate_dkim

POST /v1/email/domain/rotate_dkim/{domain}

为发信域名轮换 DKIM 密钥,返回需配置的新 DNS 记录。

参数

名称类型必填说明
domainstring
必填
要验证的域名。
idempotency_keystring可选可选去重 key;相同重试将返回同一结果。

返回

DomainVerification { domain, status, dns_records, ... }
名称类型说明
domainstring顶级域名,如 "yourdomain.com"。
domain_idstringdomain的唯一标识符
pattern: ^dom_[A-Za-z0-9]{20,}$
status"pending_dns" | "verifying" | "verified" | "failed" | "expired"当前资源状态
dns_recordsobject[]域名验证所需的 DNS 记录
dns_records[].type"TXT" | "CNAME" | "MX" | "A" | "AAAA"资源类型标识
dns_records[].namestring完整限定 DNS 名称。
dns_records[].valuestringDNS 记录或配置的值
dns_records[].purpose"spf" | "dkim" | "tracking" | "dmarc" | "return_path" | "verification"DNS 记录用途
dns_records[].ttl_recommendedinteger建议 TTL(秒)
≥ 60default: 3600
checksobject | null逐条记录检查状态("ok"/"pending"/"mismatch"/...)。
warm_up_state"not_started" | "in_progress" | "complete" | null域名当前预热状态
daily_limit_currentinteger | null当前每日发送限额
≥ 0
daily_limit_targetinteger | null预热后目标每日发送限额
≥ 0
created_atstring资源创建时间(ISO 8601)
format: date-time
verified_atstring | nullISO 8601 时间戳:verification was completed(ISO 8601)
format: date-time
expires_atstring | nullDKIM 轮换到期时间(建议 1 年)。
format: date-time
rotatedboolean仅在 email.domain.rotate_dkim 响应中存在:DKIM 密钥轮换发起后为 true(在 DNS 中观测到新记录前状态回落为 pending_dns)。

示例

一次性前置(每个范例都假定已完成):

bash
# No SDK to install — every call is a plain HTTPS request.
# Get a project key by signing in at https://infrai.cc/login (Google/GitHub gives
# you $2 free credit; email sign-in starts at $0). On 402 INSUFFICIENT_CREDIT, add
# funds at https://infrai.cc/billing (or POST /v1/account/topup and open the
# returned checkout_url).
export INFRAI_API_KEY="ifr_..."
bash
curl -X POST https://api.infrai.cc/v1/email/domain/rotate_dkim/DOMAIN \
  -H "Authorization: Bearer $INFRAI_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{}'

2.14email.template.create

POST /v1/email/template/create

创建一个邮件模板。

参数

名称类型必填说明
namestring
必填
模板名称,账户内唯一。
1–128 chars
subjectstring
必填
主题模板,可包含 {{var}} 占位符。
htmlstring
必填
HTML 正文模板,可包含 {{var}}、{{#section}}、{{^inverted}}。
body_textstring可选纯文本备用正文。
variablesRecord<string, string>可选声明的变量及类型,如 { name: 'string' }。
default_varsRecord<string, unknown>可选发送时变量缺失所用的默认值。
tagsstring[]可选模板标签列表。
idempotency_keystring可选可选去重 key;相同重试将返回同一结果。

返回

Template { template_id, name, subject, html, ... }
名称类型说明
template_idstring用于渲染的模板标识符
pattern: ^tmpl_[A-Za-z0-9]{20,}$
namestring账户内唯一。
1–128 chars
subjectstring可包含双花括号占位符(如 var)。
htmlstringHTML 正文;可包含双花括号占位符(var、#section、^inverted)。
body_textstring | null纯文本备选。
variablesobject | null声明的变量:name,类型为 'string'、'int'、'bool'、'array' 或 'object'。
default_varsobject | null发送时变量缺失所用的默认值。
tagsstring[] | null分类与筛选标签
created_atstring资源创建时间(ISO 8601)
format: date-time
updated_atstring资源最后更新时间(ISO 8601)
format: date-time

示例

一次性前置(每个范例都假定已完成):

bash
# No SDK to install — every call is a plain HTTPS request.
# Get a project key by signing in at https://infrai.cc/login (Google/GitHub gives
# you $2 free credit; email sign-in starts at $0). On 402 INSUFFICIENT_CREDIT, add
# funds at https://infrai.cc/billing (or POST /v1/account/topup and open the
# returned checkout_url).
export INFRAI_API_KEY="ifr_..."
bash
curl -X POST https://api.infrai.cc/v1/email/template/create \
  -H "Authorization: Bearer $INFRAI_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"name": "example", "subject": "sample", "html": "<h1>Hello from infrai</h1>"}'

2.15email.template.update

PATCH /v1/email/template/update/{id}

更新一个已有的邮件模板。

参数

名称类型必填说明
idstring
必填
用于渲染的模板 id(替代正文)。
subjectstring可选主题模板,可包含 {{var}} 占位符。
htmlstring可选HTML 正文模板,可包含 {{var}}、{{#section}}、{{^inverted}}。
body_textstring可选纯文本备用正文。
variablesRecord<string, string>可选声明的变量及类型,如 { name: 'string' }。
default_varsRecord<string, unknown>可选发送时变量缺失所用的默认值。
tagsstring[]可选模板标签列表。
idempotency_keystring可选可选去重 key;相同重试将返回同一结果。

返回

Template { template_id, name, subject, html, ... }
名称类型说明
template_idstring用于渲染的模板标识符
pattern: ^tmpl_[A-Za-z0-9]{20,}$
namestring账户内唯一。
1–128 chars
subjectstring可包含双花括号占位符(如 var)。
htmlstringHTML 正文;可包含双花括号占位符(var、#section、^inverted)。
body_textstring | null纯文本备选。
variablesobject | null声明的变量:name,类型为 'string'、'int'、'bool'、'array' 或 'object'。
default_varsobject | null发送时变量缺失所用的默认值。
tagsstring[] | null分类与筛选标签
created_atstring资源创建时间(ISO 8601)
format: date-time
updated_atstring资源最后更新时间(ISO 8601)
format: date-time

示例

一次性前置(每个范例都假定已完成):

bash
# No SDK to install — every call is a plain HTTPS request.
# Get a project key by signing in at https://infrai.cc/login (Google/GitHub gives
# you $2 free credit; email sign-in starts at $0). On 402 INSUFFICIENT_CREDIT, add
# funds at https://infrai.cc/billing (or POST /v1/account/topup and open the
# returned checkout_url).
export INFRAI_API_KEY="ifr_..."
bash
curl -X PATCH https://api.infrai.cc/v1/email/template/update/ID \
  -H "Authorization: Bearer $INFRAI_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{}'

2.16email.template.delete

DELETE /v1/email/template/delete/{id}

删除一个邮件模板。

参数

名称类型必填说明
idstring
必填
用于渲染的模板 id(替代正文)。
idempotency_keystring可选可选去重 key;相同重试将返回同一结果。

返回

{ deleted: boolean }
名称类型说明
template_idstring | null已删除的模板标识符
deletedboolean模板是否已删除(与 `found` 同值:模板存在且已从模板存储中移除)。
foundboolean删除调用前是否存在此 ID 的模板。

示例

一次性前置(每个范例都假定已完成):

bash
# No SDK to install — every call is a plain HTTPS request.
# Get a project key by signing in at https://infrai.cc/login (Google/GitHub gives
# you $2 free credit; email sign-in starts at $0). On 402 INSUFFICIENT_CREDIT, add
# funds at https://infrai.cc/billing (or POST /v1/account/topup and open the
# returned checkout_url).
export INFRAI_API_KEY="ifr_..."
bash
curl -X DELETE https://api.infrai.cc/v1/email/template/delete/ID \
  -H "Authorization: Bearer $INFRAI_API_KEY"

2.17email.template.preview

POST /v1/email/template/preview/{id}

用给定变量渲染模板,预览主题、HTML、文本及缺失变量。

参数

名称类型必填说明
idstring
必填
用于渲染的模板 id(替代正文)。
varsRecord<string, unknown>
必填
用于渲染的变量值,会与模板的 default_vars 合并。

返回

TemplatePreview { rendered_subject, rendered_html, rendered_text, missing_vars }
名称类型说明
rendered_subjectstring变量替换后的渲染主题行
rendered_htmlstring变量替换后的渲染 HTML 正文
rendered_textstring | null变量替换后的渲染纯文本正文
missing_varsstring[]模板引用但在输入和 default_vars 中均缺失的变量。

示例

一次性前置(每个范例都假定已完成):

bash
# No SDK to install — every call is a plain HTTPS request.
# Get a project key by signing in at https://infrai.cc/login (Google/GitHub gives
# you $2 free credit; email sign-in starts at $0). On 402 INSUFFICIENT_CREDIT, add
# funds at https://infrai.cc/billing (or POST /v1/account/topup and open the
# returned checkout_url).
export INFRAI_API_KEY="ifr_..."
bash
curl -X POST https://api.infrai.cc/v1/email/template/preview/ID \
  -H "Authorization: Bearer $INFRAI_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"vars": {}}'
高级:指定 vendor

默认情况下 infrai 会把每次调用智能路由到最佳可用供应商——无需自己挑选 vendor。作为高级逃生口,本能力支持可选的 vendor 入参以锁定某个供应商。本能力当前所有可用 vendor 可通过该能力 id 对应的 discovery 端点实时获取——参见 discovery API

GET /v1/discovery/{capability}

email.send

3. 全部能力

本模块全部已路由能力——完整的对外 REST 契约。上方方法是带讲解的入门示例,此表是完整参考。

email.batch.sendPOST /v1/email/batch/send

Send up to 100 personalized emails under one idempotency_key (batch passthrough, not billed per message).

参数 (2)
名称类型必填说明
messagesobject[]必填Each entry is a full EmailSendRequest with its own recipients / template_vars.
1–100 items
idempotency_keystring | null可选One key for the whole batch; per-message sends are not re-charged.
email.domain.deleteDELETE /v1/email/domain/delete/{domain}

Delete a previously added sender domain.

参数 (1)
名称类型必填说明
domainstring必填Path parameter.
email.domain.getGET /v1/email/domain/get/{domain}

Get the verification status and reputation of a sender domain.

参数 (1)
名称类型必填说明
domainstring必填Path parameter.
email.domain.listGET /v1/email/domain/list

List the sender domains added to the account.

无请求参数。

email.domain.rotate_dkimPOST /v1/email/domain/rotate_dkim/{domain}

Rotate DKIM for a sender domain and return the new DNS records.

参数 (2)
名称类型必填说明
domainstring必填Path parameter.
idempotency_keystring | null可选Client-provided idempotency key; prevents duplicate execution on retry
email.domain.verifyPOST /v1/email/domain/verify

Verify a sender domain's DNS records to complete verification.

参数 (2)
名称类型必填说明
domainstring必填Sending domain to verify (e.g. mail.example.com).
idempotency_keystring | null可选Client-provided idempotency key; prevents duplicate execution on retry
email.event.listGET /v1/email/event/list

List email delivery events (delivered, bounced, opened, clicked, complained).

无请求参数。

email.getGET /v1/email/get/{id}

Get the delivery details of one email by message_id.

参数 (1)
名称类型必填说明
idstring必填Path parameter.
email.sendPOST /v1/email/send

Send a transactional email (inline body/HTML or a template) with tracking; idempotent.

参数 (21)
名称类型必填说明
tostring | string[]必填Recipient address, or an array of addresses for multiple recipients.
ccstring[]可选Carbon copy recipients
bccstring[]可选Blind carbon copy recipients
fromstring | null可选Optional. Omit to use Infrai's default sender on send.infrai.cc. If you provide a custom-domain sender, that domain must be verified first.
from_display_namestring | null可选Display name for the sender
reply_tostring | null可选Reply-to email address
subjectstring | null可选Email subject line
bodystring | null可选Plain text body.
htmlstring | null可选HTML body of the email
template_idstring | null可选Identifier of the template used for rendering
template_varsobject | null可选Variables to substitute in the template
attachmentsobject[]可选List of email attachments
headersobject | null可选Custom HTTP headers to include in requests or responses
tagsstring[]可选Tags for categorization and filtering
track_opensboolean可选Whether to track email opens
default: false
track_clicksboolean可选Whether to track link clicks in the email
default: false
scheduled_atstring | null可选ISO 8601 timestamp when the resource is scheduled to activate
format: date-time
idempotency_keystring | null可选Client-provided idempotency key; prevents duplicate execution on retry
vendorstring | null可选Pin to a specific vendor.
message_class"transactional" | "marketing"可选Semantic class of the message. Only transactional is currently live; marketing is reserved and fails closed.
default: "transactional"
auto_unsubscribe_linkboolean | null可选Whether to append a signed unsubscribe link. Transactional messages omit it by default; marketing-like content may still be forced to include it.
email.suppression.addPOST /v1/email/suppression/add

Add a recipient address to the suppression list to stop future delivery; idempotent.

参数 (6)
名称类型必填说明
emailstring必填Email address
format: email
reason"hard_bounce" | "soft_bounce_5x" | "complained" | "unsubscribed" | "invalid" | "manual" | "user_request"可选Reason for the current state or action
default: "manual"
scope"account" | "domain"可选Scope of applicability for this resource
default: "account"
domain_scopestring | null可选When scope=domain, the specific verified domain.
notesstring | null可选Free-text notes about this suppression
idempotency_keystring | null可选Client-provided idempotency key; prevents duplicate execution on retry
email.suppression.checkGET /v1/email/suppression/check/{email}

Check whether an address is on the suppression list.

参数 (1)
名称类型必填说明
emailstring必填Path parameter.
email.suppression.deleteDELETE /v1/email/suppression/delete/{email}

Remove an address from the suppression list to resume delivery.

参数 (1)
名称类型必填说明
emailstring必填Path parameter.
email.suppression.listGET /v1/email/suppression/list

List recipient addresses on the suppression list.

无请求参数。

email.template.createPOST /v1/email/template/create

Create an email template.

参数 (8)
名称类型必填说明
namestring必填Unique within account.
1–128 chars
subjectstring必填May contain double-brace var placeholders.
htmlstring必填HTML body; may contain double-brace var, double-brace #section, double-brace ^inverted.
body_textstring | null可选Plain-text alternative.
variablesobject | null可选Declared variables: { name: 'string' | 'int' | 'bool' | 'array' | 'object' }.
default_varsobject | null可选Defaults used when var missing in send().
tagsstring[] | null可选Tags for categorization and filtering
idempotency_keystring | null可选Client-provided idempotency key; prevents duplicate execution on retry
email.template.deleteDELETE /v1/email/template/delete/{id}

Delete an email template.

参数 (1)
名称类型必填说明
idstring必填Path parameter.
email.template.previewPOST /v1/email/template/preview/{id}

Render and preview a template with the given variables.

参数 (2)
名称类型必填说明
idstring必填Path parameter.
varsobject必填Variable values merged with the template's default_vars before rendering.
email.template.updatePATCH /v1/email/template/update/{id}

Update an existing email template.

参数 (8)
名称类型必填说明
idstring必填Path parameter.
subjectstring | null可选May contain double-brace var placeholders.
htmlstring | null可选HTML body; may contain double-brace var, double-brace #section, double-brace ^inverted.
body_textstring | null可选Plain-text alternative.
variablesobject | null可选Template variable definitions
default_varsobject | null可选Default variable values for the template
tagsstring[] | null可选Tags for categorization and filtering
idempotency_keystring | null可选Client-provided idempotency key; prevents duplicate execution on retry

4. 完整示例

本模块的生产级端到端范例:先一次性配置,再运行业务流程,尽量覆盖本模块的多数 API。

单文件可运行 Python 程序(仅标准库、无 SDK):拷贝后填入 INFRAI_API_KEY 运行,即可按真实业务流逐步体验本模块核心 API——每一步都真实调用并计费,后续步骤复用前一步返回的真实字段。12 行 helper 就是全部集成代码。

python
#!/usr/bin/env python3
"""Infrai · comm-email — runnable real-app example (single file, zero deps).

Copy this file, set your key, run it: every step is a REAL call to
api.infrai.cc, billed at the real (tiny) per-call price, printing the
live JSON response. Get a key at https://infrai.cc/login (Google/
GitHub sign-in grants $2 free credit); add funds at
https://infrai.cc/billing. No SDK — the 12-line helper below is the
entire integration."""
import json
import os
from urllib import error, request

KEY = os.environ.get("INFRAI_API_KEY") or "ifr_..."  # <- your key
BASE = "https://api.infrai.cc"


# Same raw HTTPS POST/GET as every per-method example on this page —
# wrapped once for reuse. There is nothing else to it: no SDK.
def infrai(method, path, body=None):
    req = request.Request(
        BASE + path, method=method,
        data=json.dumps(body).encode() if body is not None else None,
        headers={"Authorization": f"Bearer {KEY}",
                 "Content-Type": "application/json"})
    try:
        with request.urlopen(req, timeout=60) as r:
            return json.loads(r.read())
    except error.HTTPError as e:
        return json.loads(e.read())


def show(label, resp):
    print(f"\n== {label} ==")
    print(json.dumps(resp, indent=2, ensure_ascii=False))
    return resp


# 1) email.send — POST /v1/email/send · Send a transactional email (inline body/HTML or a template) with tracking; idempotent.
ask1 = input("Your email address (sends a real email): ").strip()
r1 = show("email.send", infrai("POST", "/v1/email/send", {"to":ask1,"subject":"Welcome","html":"<p>Hi!</p>"}))

# 2) email.get — GET /v1/email/get/{id} · Get the delivery details of one email by message_id.
id_2 = (r1.get("data") or {}).get("message_id") or ""
r2 = show("email.get", infrai("GET", f"/v1/email/get/{id_2}"))

# 3) email.event.list — GET /v1/email/event/list · List the delivery event timeline for one email; message_id is required.
r3 = show("email.event.list", infrai("GET", "/v1/email/event/list"))