Mail API
通过 HTTP API 发送事务性邮件:Brevo、Mailgun、Mailjet、Maileroo、Postmark、Mailchimp、Resend、SendGrid、MailerSend、Scaleway。
插件
Mail API
通过 HTTP API 发送事务性邮件:Brevo、Mailgun、Mailjet、Maileroo、Postmark、Mailchimp、Resend、SendGrid、MailerSend、Scaleway。
描述
Mail API 让你的邮件服务商的 HTTP API 成为 EmDash 的邮件传输通道。登录链接、邀请邮件和插件邮件都通过 Brevo、Mailgun、Postmark 或其他服务发出,无需 SMTP 服务器。
功能
- 10 家服务商:Brevo、Mailgun、Mailjet、Maileroo、Postmark、Mailchimp Transactional(Mandrill)、Resend、SendGrid、MailerSend 和 Scaleway TEM。
- 已验证的发件人:选择服务商已验证的地址或域名,也可以手动输入。
- 账户状态:套餐、额度、配额和信誉,直接从服务商 API 读取。
- 可操作的错误信息:服务商自己的消息,附带 HTTP 状态码、错误代码、提示、指向解决页面的链接以及原始响应。
- 重试队列:当服务商宕机或触发速率限制时,邮件会在加密队列中等待,并以逐渐增大的间隔重新发送。
- 历史与日志:每次发送都记录状态、消息 ID、尝试次数和耗时,支持筛选、重新发送、14 天图表和仪表盘小组件。
- 每个服务商页面上都有测试表单。
- 加密:API 密钥是 EmDash 密钥,保留的邮件内容经过加密,登录邮件绝不会被保留。
- 后台支持英语、法语和德语,可在手机上使用。
服务商
| 服务商 | 凭据 | 可列出的发件人 | 账户状态 |
|---|---|---|---|
| Brevo | API 密钥 | 地址 | 套餐、额度 |
| Mailgun | API 密钥、域名、区域 | 域名 | 域名状态 |
| Mailjet | API 密钥、密钥(secret key) | 地址、域名 | 无 |
| Maileroo | 发送密钥 | 无 | 无 |
| Postmark | 服务器令牌 | 无 | 服务器、模式 |
| Mailchimp Transactional | Mandrill 密钥 | 域名 | 信誉、配额 |
| Resend | API 密钥 | 域名 | 套餐、配额 |
| SendGrid | API 密钥 | 地址、域名 | 套餐、额度 |
| MailerSend | API 令牌 | 地址、域名 | API 配额 |
| Scaleway TEM | 密钥(secret key)、项目 ID | 域名 | 套餐、用量 |
对于无法列出发件人的服务商,请手动输入地址。
安装
要求
- EmDash 1.3.0 或更高版本,并带有插件沙盒运行器:Cloudflare Worker Loader(Workers Paid 套餐),或 Node.js 上的
@emdash-cms/sandbox-workerd。 - 站点上需要有
EMDASH_ENCRYPTION_KEY:它用于加密 API 密钥。使用npx emdash secrets generate创建,在 Cloudflare 上用wrangler secret put EMDASH_ENCRYPTION_KEY存储。请在密钥管理器中保留一份副本:没有它,数据库备份毫无用处。 - 重试队列需要调度器:Node.js 上已内置。在 Cloudflare 上需要一个
* * * * *的 cron 触发器和scheduled处理程序(EmDash 模板两者都包含)。 - 一个受支持服务商的账户和 API 密钥。
安装
- 从插件注册表安装 Mail API。
- 查看权限并确认:仅向服务商 API 主机发起请求,以及投递 EmDash 邮件。
也可以通过 npm 安装:pnpm add @devbitme/emdash-plugin-apimail,然后把默认导入添加到 astro.config.mjs 中 emdash() 集成的 sandboxed: [...] 里。
设置
- 在后台打开 Mail API,然后点击你的服务商的 Configure。
- 粘贴密钥并保存。Account 部分会确认密钥是否有效。
- 在 Send a test email 中选择一个已验证的发件人,输入你的地址并发送。保持 Use as the default sender 开启,以保留该发件人。
- 在列表中点击该服务商卡片上的 Activate。
- 如果安装了多个邮件传输通道,请在 Settings → Email 下选择 Mail API。在
astro dev下,EmDash 的控制台传输通道也算作其中之一。
设置项
Queue & history 选项卡用于设置邮件可在队列中等待多久(默认情况下,登录邮件为 15 分钟,其他邮件为 24 小时)、是否保留邮件内容,以及历史和日志的保留时长(默认 30 天)。
完整文档:https://git.devbit.me/devbit.me/emdash-plugin-apimail
常见问题
我需要 SMTP 服务器吗?
不需要。Mail API 通过 HTTPS 调用服务商的 HTTP API,因此在无法使用 SMTP 的环境(例如 Cloudflare Workers)中同样可用。
EmDash 的“Send test email”只显示“Failed to send test email”。
请使用服务商页面上的 Send a test email 表单:它会显示服务商的消息、提示和原始响应。该错误同时也记录在 Logs 和服务器日志中。
发件人列表为空,或显示 HTTP 401 或 403。
该密钥可以发送邮件,但无法列出发件人。Resend 需要 Full access 密钥,SendGrid 需要 Sender Authentication 和 User Account 的读取权限,MailerSend 需要 Domains 和 Sender identity,Scaleway 需要 TransactionalEmailReadOnly,Mailgun 需要账户密钥,而不是域名发送密钥。你仍然可以手动输入发件人地址。
错误提示说不允许该 IP 地址。
请把你主机的出站 IP 添加到服务商的允许列表,或关闭该限制。错误信息中包含指向正确页面的链接。
服务商宕机时会怎样?
网络错误、超时、HTTP 429 和 5xx 会把邮件放入加密队列。它会在 1、5、15 和 30 分钟后重试,然后是 1 小时、2 小时,之后每 4 小时一次,并通过当时处于激活状态的服务商发送。登录邮件在 15 分钟后过期,其他邮件在 24 小时后过期。永久性错误(例如无效密钥或被拒绝的收件人)不会重试。
队列一直不运行。
打开 Mail API 的 Security 选项卡:它会列出计划任务,并提供 Repair 按钮。在 Cloudflare 上,请检查 cron 触发器和 scheduled 处理程序。
我的邮件内容会被存储吗?
仅在邮件于队列中等待期间存储,或者在你开启 Keep email content in the history 后存储在历史中。两种情况下都经过加密。登录邮件和邀请邮件在发送后绝不会被保留。
我可以使用多个服务商吗?
可以。配置多个服务商,然后在负责发送的那个上点击 Activate。服务商出现故障时,激活另一个即可:队列中的邮件会通过它重新发送。
安全
报告漏洞
请发送邮件至 [email protected]。请不要先公开提交 issue。
权限
- 网络请求,仅限于服务商 API 主机:
api.brevo.com、api.mailgun.net、api.eu.mailgun.net、api.mailjet.com、api.us.mailjet.com、smtp.maileroo.com、api.postmarkapp.com、mandrillapp.com、api.resend.com、api.sendgrid.com、api.eu.sendgrid.com、api.mailersend.com、api.scaleway.com。 - 邮件传输:EmDash 把待发出的邮件交给该插件,由插件通过当前激活的服务商发送。
插件运行在 EmDash 的沙盒中,无法访问其他任何内容。
API 密钥
API 密钥是 EmDash 的密钥设置,使用站点的 EMDASH_ENCRYPTION_KEY 通过 AES-GCM 加密。已保存的密钥绝不会返回浏览器:后台只显示其最后 5 个字符。服务商在错误消息中回显的任何已配置密钥都会被屏蔽。
存储的数据
- 历史:收件人、主题、服务商、状态、消息 ID、尝试次数、耗时和错误。默认 30 天后删除。
- 邮件内容:仅在邮件于队列中等待期间保留,或在你开启该选项后保留在历史中。它使用随机的 256 位密钥通过 AES-GCM 加密,该密钥本身作为 EmDash 密钥存储。登录邮件和邀请邮件在发送后绝不会被保留。
- 日志:失败记录、队列运行和清理,与历史一同删除。
- 已验证的发件人和账户状态:连同设置的指纹一起缓存在插件存储中,绝不包含密钥。
邮件只会发送到当前激活的服务商的 API。其他任何内容都不会离开站点。
公开路由
有一个路由是公开的:GET /_emdash/api/plugins/apimail/logo?p=。它提供插件内置的服务商标志,不读取任何数据。
后台
后台页面使用私有路由:在插件运行之前,EmDash 要求用户已登录、有权管理插件,并带有 CSRF 请求头。
更新日志
0.3.1
- 每行显示三张服务商卡片,而不是两张:桌面端的列表更紧凑。
- 每张服务商卡片上新增 Website 链接,在新标签页中打开。
- Set as default 改为 Activate,短到足以放进手机上的卡片。
- 服务商页面会立即根据已保存的数据打开,并显示数据的时效。只有在保存密钥或点击 **Refresh from ** 时才会调用服务商,并会提示该次调用耗时多久。
0.3.0
- 每个已配置服务商的卡片上新增 Set as default 按钮。
- 读取已验证发件人或账户状态失败时,会写入日志,并在下次加载页面时重试,除非该密钥缺少相应权限。
- 发件人列表会显示其读取时间,出错后也一样。
- 后台页面适配手机:每行两张服务商卡片,最多三张统计卡片,较长的值独占一行,历史列更少。
- 更短的菜单项:History、Queue、Logs。
- 标签、日志、错误和测试邮件主题中使用普通连字符,而不是长破折号。
- 包体更小:服务商标志改用无损 WebP 图块。
- 注册表列表:新增描述、安装、常见问题、更新日志和安全选项卡,以及横幅。
0.2.0
- 从服务商处选择已验证的发件人:已验证的地址、已验证域名下的任意地址,或手动输入。位于 Sender 选项卡和每个测试表单中。
- 每个服务商页面上显示账户状态:套餐、额度、配额和信誉。
- 测试不再需要预先配置发件人,Use as the default sender 会保留发送成功的那个发件人。
- 已保存的密钥会显示其最后 5 个字符。
- 新增德语后台。