Skip to the content.

首页 | Blogs | 项目合集 | Bilibili↗
←返回 | 创建:2024-08-27 | 最后更新:2024-08-27

QQ邮箱以前可以随意自定义域名,但是这几年把这个功能合并到了VIP里面
不过不要担心不要怕,靠Cloudflare Workers,可以自己部署一个简易的邮件收发系统。

收取邮件

收取邮件很简单,靠Cloudflare的免费电子邮件路由就行
官方有教程,网上相关教程也不少,就不赘述了。
至于非CF托管域名,则看看你的DNS服务商有没有这个功能吧。

发送邮件

发送主要思路就是利用已有服务,分为:

Outlook

前往添加账户别名
输入上文的自动转发的邮箱地址
确认并验证即可
添加账户别名

之后使用Outlook发信的时候就能选择这个地址作为发信地址了。

发信测试

CFWorkers

前排提示:本人辛苦3小时搞完了才发现MailChannels关闭了这个服务
https://support.mailchannels.com/hc/en-us/articles/26814255454093-End-of-Life-Notice-Cloudflare-Workers
此方法已失效

配置Worker

重头戏是如何发送邮件。

有一个Gist可以靠MailChannel API临时发送邮件。
直接进去复制就行:ihsangan/index.js
当然,那个可能有点简陋,所以我也会上传我自己用SoberJS UI美化后的版本(记得修改一下里面的默认值):kdxhub/EmailWorkers.js

之后前往Cloudflare,因为有免费的Worker可以白嫖
在左侧菜单中选择Workers
CF-Workers

创建一个Workers并把上面的项目代码全部替换进去就行了

生成DKIM密钥

在下一步之前,需要弄一个DKIM密钥

DKIM 是一种电子邮件认证技术,可以验证邮件的发送者身份。

转到一个Linux终端或者安卓用Termux
反正能用OpenSSL就行

输入以下命令:

apt install openssl -y
openssl genrsa 2048 | tee private_key.pem | openssl rsa -outform der | openssl base64 -A > 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

终端中生成DKIM私钥

这些命令会生成3个文件,定义如下:

发件时需要填写private_key.txt中的内容

配置DKIM记录

转到域名DNS服务商的记录表,新增这3条记录

TXT记录名称 备注
_dmarc v=DMARC1; p=reject; adkim=s; aspf=s; rua=mailto:YYY; ruf=mailto:YYY pct=100; fo=1; 固定值,直接粘贴
mailchannels._domainkey 上一步中dkim_record.txt文件的内容  
_mailchannels v=mc1 cfid=kdx.workers.dev 将其中的 kdx 修改为你的 Worker 域名称
你的域名 v=spf1 a mx include:relay.mailchannels.net ~all  

接着前往dmarcly验证你的记录是否正确配置
Dmarcly
第一个空填你的域名,第二个和图片一样填mailchannels
出现绿色的Success就是配置正确了。

开始发件

WebUI

还记得那个Worker你部署到哪里了吗
访问https://workers部署路径/submit就可以打开Web发件UI了

给自己发个测试邮件看看
邮件发送示例

POST请求

https://workers部署路径/发送下方POST请求即可

{
  "from": {
      "email": "发件邮箱[email protected]",
      "name": "发件人昵称"
  },
  "personalizations": [
    {
      "to": [
        {
          "email": "收件邮箱",
          "name": "收件人(这个列表可以拓展)"
        }
      ]
    }
  ],
  "subject": "邮件主题(标题)",
  "content": [
    {
      "type": "text/plain",
      "value": "邮件内容,type定义类型,见于MIME类型"
    }
  ]
}

成功会返回null,否则返回错误详情。