CF大善人不干了。
2022 年 5 月 13 号,Cloudflare 发布了一篇博客,宣布与电子邮件安全公司 Mailchannels 合作。这次合作中,MailChannels 专门为 Cloudflare Workers 创建了一项电子邮件发送服务,降低了 Cloudflare Workers 发送电子邮件的门槛。更值得高兴的是,发送电子邮件是完全免费的。通过该电子邮件发送服务,我们可以发送交易电子邮件,例如交易订单、用户注册确认、密码重置,也能够发送营销邮件。
前置条件
- 一个 Cloudflare 帐户
- 一个可以被 Cloudflare 管理的域名
- npm 软件包 create-cloudflare
- git
- openssl(可选)
为你的 Cloudflare 帐户启用 MailChannels
1. 找到您的帐户 workers.dev 子域
- 登录 Cloudflare 仪表板并选择你的帐户。
- 选择 工作人员和页面 > 概述。
- 在概述的右侧,记下您的 workers.dev 子域,例如 myaccount.workers.dev。
2. 添加 MailChannels DNS 记录
- 在 “帐户主页” 中,选择您要为其添加 SPF 记录的网站。
- 选择 DNS > 记录 > 添加记录。
- 添加以下 TXT DNS 记录,替换 myaccount.workers.dev 为你自己的 workers.dev 子域,替换 youdomain.com 为你自己的自定义域二级域名。
1 2
| Type Name Content TXT _mailchannels v=mc1 cfid=myaccount.workers.dev cfid=yourdomain.com
|
yourdomain.com 应设置为 worker 自定义域的二级域名。
3. 添加 MailChannel 的 SPF 支持
- 在 “帐户主页” 中,选择您要为其添加 SPF 记录的网站。
- 选择 DNS > 记录 > 添加记录。
- 添加以下 TXT DNS 记录:
1 2
| Type Name Content TXT @ v=spf1 include:_spf.mx.cloudflare.net include:relay.mailchannels.net -all
|
4. 添加 MailChannel 的 DKIM 支持
- 使用 openssl 生成 DKIM 凭据(包含公钥、私钥)
1
| openssl genrsa 2048 | tee private_key.pem | openssl rsa -outform der | openssl base64 -A > private_key.txt
|
1
| echo -n "v=DKIM1;p=" > dkim_record.txt && openssl rsa -in private_key.pem -pubout -outform der | openssl base64 -A >> dkim_record.txt
|
- 在 “帐户主页” 中,选择您要为其添加 DKIM 记录的网站。
- 选择 DNS > 记录 > 添加记录。
- 添加以下 TXT DNS 记录:
1 2
| Type Name Content TXT mailchannels._domainkey dkim_record.txt中的内容
|
(注:._domainkey 前可以设置任何值,为了方便标识记忆,推荐使用 mailchannels._domainkey)
5. 修改 _dmarc DNS 记录
- 在 “帐户主页” 中,选择您要为其添加 DMARC 记录的网站。
- 选择 DNS > 记录 > 添加记录。
- 添加以下 TXT DNS 记录:
1 2
| Type Name Content TXT _dmarc "v=DMARC1; p=reject; adkim=s; aspf=s; pct=100; fo=1;"
|
(详细参数解释略)
编写发送邮件的 Worker 代码
创建 email.js
文件,并编写如下代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
| export async function send(to, title, content, type = "text/html") { const send_request = new Request("https://api.mailchannels.net/tx/v1/send", { method: "POST", headers: { "content-type": "application/json", }, body: JSON.stringify({ personalizations: [ { to: [{ email: `${to}`, name: `${to}` }], }, ], from: { email: "noreplay@example.com", name: "Sender Name" }, subject: `${title}`, content: [ { type: `${type}`, value: `${content}`, }, ], }), }); return await fetch(send_request); }
|
注意:将 noreplay@example.com
替换为你自己想要设置的发信地址。将 Sender Name
设置为你想要设置的发信名。
部署 API 服务
- 克隆该项目
1
| git clone https://github.com/devcxl/cloudflare-email-sender
|
- 修改 wrangeler 配置
将 wrangler.example.toml
重命名为 wrangler.toml
并修改其中的配置项:
SENDER_EMAIL
:发送邮件的邮箱
SENDER_NAME
:发信人名称
DKIM_DOMAIN
:DKIM 发信二级域名
DKIM_SELECTOR
:DKIM 选择器(设置 ._domainkey 前对应的值即可)
- 部署
根据提示登录你的 Cloudflare 账号并部署:
1 2 3
| openssl rand -base64 32 npx wrangler secret put ACCESS_TOKEN npx wrangler secret put DKIM_PRIVATE_KEY
|
使用示例
发送自定义邮件
1 2 3 4 5 6 7 8 9 10
| curl -X POST -L https://custom.yourdomain.com/v1/send \ -H 'Content-Type: application/json' \ -H 'Authorization: Bearer {ACCESS_TOKEN}' \ -d '{ "to": "you@example.com", "name": "Jone", "title": "Just Test Message", "content": "<h1>Hello This is test message</h1>", "type": "text/html" }'
|
发送纯文本邮件
1 2 3 4 5 6 7 8 9 10
| curl -X POST -L https://custom.yourdomain.com/v1/send \ -H 'Content-Type: application/json' \ -H 'Authorization: Bearer {ACCESS_TOKEN}' \ -d '{ "to": "you@example.com", "name": "Jone", "title": "Just Test Message", "content": "Hello This is test message. ", "type": "text/plain" }'
|
发送模板邮件
1 2 3 4 5 6 7 8 9 10
| curl -X POST -L https://custom.yourdomain.com/v1/send/activation \ -H 'Content-Type: application/json' \ -H 'Authorization: Bearer {ACCESS_TOKEN}' \ -d '{ "to": "you@example.com", "name": "Example", "title": "Just Test Message", "site_name": "Test Title", "url": "https://www.google.com/search?q=devcxl" }'
|
参考资料