用途:把应用自身的事务性邮件(订单收据、登录验证码、密码重置、通知)通过 Portaly 邮件 API 从创作者自己的域名发出。仅限事务性邮件,即由某人某个动作触发的单封邮件;简报和群发公告需在 Portaly 管理后台(https://portaly.cc/admin/email)发送,不走此 API。
限制与前提:处于 Beta 阶段,仅限受邀账户,其他账户每次调用返回 403 FORBIDDEN;创建邮件 API Key 还需 Premium 套餐(含月度配额)。API 主机默认 https://portaly.ai,除非刻意指向非生产环境,否则不要设置 PORTALY_API_HOST。权威契约见 https://portaly.ai/docs(Email 部分)与 https://portaly.ai/openapi.json,冲突时以文档为准。
主要能力:发送单封邮件(POST /api/email/emails),支持最多 50 个收件人(to/cc/bcc)、定时发送(scheduledAt,1 分钟至 30 天减 10 分钟,返回 202)与取消、附件(base64 约 3 MB 或公开 https URL,单封共 10 MB)、批量发送(POST /api/email/batches,最多 100 封,后台发送)、查询配额(GET /api/email/quota)、列出与查询邮件、绑定域名(需 full 权限 Key)。
使用方式:1)由人工在 https://portaly.cc/admin/email/api-keys 创建以 pem_ 开头的 Key,写入 .env 的 PORTALY_EMAIL_API_KEY,切勿粘贴到聊天、切勿放在浏览器或客户端代码中,并确保 .env 在 .gitignore 中;2)选择并验证发信域名,建议使用不收信的子域(如 mail.example.com),按返回的 dnsRecords 添加三条 DKIM CNAME 及 MX、TXT,Cloudflare 上设为 DNS only;3)在服务端代码发送,始终携带由业务事件派生的 Idempotency-Key,并用 tags 的 ref 记录该 Key;4)按错误码分支处理(429 RATE_LIMITED 按 Retry-After 重试、500/503/网络错误用同一 Key 指数退避重试、502 SEND_OUTCOME_UNKNOWN 同 Key 重试、409 IDEMPOTENCY_KEY_IN_USE 最多约 10 分钟后转人工、429 SEND_QUOTA_EXCEEDED 不循环重试、422 RECIPIENT_SUPPRESSED 不重试、403 DOMAIN_NOT_ALLOWED 等交创作者处理);5)用定时任务(如每 10–15 分钟)列出 bounced、complained 等状态并记录。
适用场景:创作者自有应用向自己的客户发送由用户动作触发的单封邮件。
限制:无 Webhook,需轮询;每 Key 每分钟限 60 收件人、10 批次、120 次读取、20 次取消或域名绑定;沙箱仅投递到账户所有者已验证的登录邮箱,每天 50 封;不得用于营销或群发;不得用真实服务商的虚构地址测试,应使用沙箱或模拟地址(success@simulator.amazonses.com、bounce@simulator.amazonses.com、complaint@simulator.amazonses.com)。