通过 Clouflare Worker 免费发送电子邮件

通过 Clouflare Worker 免费发送电子邮件

2024-3-29·devcxl
devcxl

2022 年 5 月 13 号,Cloudflare 发布了一篇博客 ,宣布与电子邮件安全公司 Mailchannels 合作。

这次合作中,MailChannels 专门为 Cloudflare Workers 创建了一项电子邮件发送服务,降低了 Cloudflare Workers 发送电子邮件的门槛。 然而更值得高兴的是,发送电子邮件是完全免费的。你没听错“完全免费!!!”

通过该电子邮件发送服务 我们可以发送交易电子邮件,例如交易订单、用户注册确认、密码重置。 也应该能够发送营销邮件。

让我们看看怎么使用它。

前置条件

  • 一个 Cloudflare 帐户
  • 一个可以被 Cloudflare 管理的域名
  • npm 软件包 create-cloudflare
  • git
  • openssl(可选)

为你的 Clouflare 帐户启用 MailChannels

首先,找到您的帐户 workers.dev子域:

  1. 登录 Cloudflare 仪表板 并选择你的帐户。
  2. 选择 工作人员和页面 > 概述 。
  3. 在概述的右侧 ,记下您的 workers.dev 子域 。类似于 myaccount.workers.dev

当你找到你的 workers.dev子域,添加 MailChannels DNS 记录:

  1. 在 “帐户主页” 中,选择您要为其添加 SPF 记录的网站。
  2. 选择 DNS > 记录 > 添加记录 。
  3. 添加以下 TXT DNS 记录,替换 myaccount.workers.dev 为你自己的 workers.dev 子域,替换 youdomain.com 为你自己的自定义域二级域名。
    Type Name Content
    TXT _mailchannels v=mc1 cfid=myaccount.workers.dev cfid=yourdomain.com

yourdomain.com应设置为 worker 自定义域的二级域名

添加 MailChannel 的 SPF 支持

要同时使用 MailChannels 和 Cloudflare 电子邮件路由:

  1. 在 “帐户主页” 中,选择您要为其添加 SPF 记录的网站。
  2. 选择 DNS > 记录 > 添加记录 。
  3. 添加以下 TXT DNS 记录:
    Type Name Content
    TXT @ v=spf1 include:_spf.mx.cloudflare.net include:relay.mailchannels.net -all

添加 MailChannel 的 DKIM 支持

  1. 使用openssl生成 DKIM 凭据 (包含公钥、私钥)

    openssl genrsa 2048 | tee private_key.pem | openssl rsa -outform der | openssl base64 -A > private_key.txt

    openssl genrsa 2048生成 2048 位 RSA 密钥。 输出被传递到 tee private_key.pem,它将密钥写入 private_key.pem 文件,并将密钥传递给 openssl rsa -outform der | openssl base 64 -A,它将密钥从 PEM 格式转换为 DER 格式,然后对其进行 Base64 编码。 将此输出带入 > private_key.txt 将内容保存到 private_key.txt.

    echo -n "v=DKIM1;p=" > dkim_record.txt && openssl rsa -in private_key.pem -pubout -outform der | openssl base64 -A >> dkim_record.txt

    这会根据私钥创建公钥( openssl rsa -in priv_key.pem -pubout -outform der ),将其编码为 base64 ( openssl base 64 -A),最后将其写入 dkim_record.txt 文件。

  2. 在 “帐户主页” 中,选择您要为其添加 DKIM 记录的网站。

  3. 选择 DNS > 记录 > 添加记录 。

  4. 添加以下 TXT DNS 记录:

    Type Name Content
    TXT mailchannels._domainkey dkim_record.txt中的内容

    ._domainkey前可以设置任何值 因为使用 mailchannels发送邮件 为了方便标识记忆,所以推荐使用mailchannels._domainkey

  5. 修改_dmarcDNS记录

    Type Name Content
    TXT _dmarc “v=DMARC1; p=reject; adkim=s; aspf=s; pct=100; fo=1;”
    • p=reject:策略指示,当邮件未能通过DMARC验证时,接收邮件服务器应拒绝此邮件。其他可能的值包括none(无特殊处理)和quarantine(将邮件标记为垃圾邮件)。
    • adkim=s:DKIM(DomainKeys Identified Mail)对齐模式,s表示严格对齐,要求DKIM签名域必须完全匹配。
    • aspf=s:SPF(Sender Policy Framework)对齐模式,s表示严格对齐,要求SPF的Return-Path域必须完全匹配。
    • rua=mailto: xxxx@mail.com :Aggregate(汇总)报告的接收地址,域名所有者希望接收DMARC汇总报告的邮箱地址,汇总报告包含发送和接收的统计信息。
    • ruf=mailto: xxxx@mail.com :Forensic(法证)报告的接收地址,域名所有者希望接收DMARC法证报告的邮箱地址,法证报告包含每封未通过DMARC验证的邮件的详细信息。
    • pct=100:策略的适用百分比,这里是100%,表示DMARC策略适用于所有的邮件。
    • fo=1:Failure reporting options(失败报告选项),fo=1表示只要有DMARC验证失败的情况就会生成法证报告。其他可能的值包括0(从不生成法证报告)、d(只有DKIM失败时生成法证报告)和s(只有SPF失败时生成法证报告)。

编写发送邮件的 Worker 代码

email.js
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设置为你想要设置的发信名

最后你可以通过引用该代码中的 send 方法在 Cloudflare Worker 中发送电子邮件

部署API服务

  1. 克隆该项目

    git clone https://github.com/devcxl/cloudflare-email-sender

  2. 修改 wrangeler 配置

    wrangler.example.toml 重命名为 wrangler.toml

    修改wrangler.toml中的配置项

    • SENDER_EMAIL:发送邮件的邮箱
    • SENDER_NAME:发信人名称
    • DKIM_DOMAIN:DKIM发信二级域名
    • DKIM_SELECTOR:DKIM选择器 设置._domainkey前对应的值即可
  3. 部署

    1. 运行npm i安装依赖。
    2. 运行npm run deploy并根据提示登陆你的 Cloudfalre 账号并部署
    3. 运行openssl rand -base64 32生成随机密钥
    4. 运行npx wrangler secret put ACCESS_TOKEN设置访问随机密钥
    5. 运行npx wrangler secret put DKIM_PRIVATE_KEY设置DKIM生成的私钥文本文件private_key.txt中的内容

使用示例

发送自定义邮件

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"
}'

发送纯文本邮件

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"
}'

发送模板邮件

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"
}'

参考