邮件自动友链申请

Rin 支持通过邮件自动完成友链的申请、修改与删除,全程无需登录后台,适合希望把友链入口交给访客自助维护的场景。

工作原理

访客向你的专用邮箱地址(例如 friend-request@你的域名.com)发送邮件,Rin 的 Worker 通过 Cloudflare Email Routing 接收邮件并自动处理:

  1. 访客发送正文为 友链申请 的邮件。
  2. Rin 回复一封邮件,附上需要填写的 JSON 模板。
  3. 访客按模板填写 JSON 并回复。
  4. Rin 生成一个 8 位验证码(记为 变量a),并让访客选择验证方式:回复 1 使用 DNS TXT 记录验证,回复 2 使用 上传 HTML 文件验证(1 / 一 / 方案一 / 方法一 均可;2 / 二 / 方案二 / 方法二 同理)。
  5. 若选择 DNS:Rin 回复添加 TXT 记录的教程——主机记录 _jiaofriend、记录类型 TXT、记录值 变量a。若选择文件:Rin 回复验证 HTML 源码,要求访客在站点根目录创建 变量a.html 并将源码原样复制进去(不要增改任何内容)。
  6. 访客完成对应配置后回复正文 请你进行下一步验证。
  7. Rin 按所选方式验证:DNS 方式通过 Cloudflare DNS-over-HTTPS 查询 _jiaofriend.访客域名 的 TXT 记录,要求记录值中包含 变量a;文件方式访问 https://访客站点URL/变量a.html,要求 GET 返回 200 且页面 <body> 中包含 变量a。验证通过后直接在数据库中完成友链的新增 / 修改 / 删除。

支持的操作与 JSON 模板

操作触发正文(必须完全一致)JSON 模板字段
友链申请友链申请name 站点名称、url 站点URL、avatar 站点图标URL、desc 站点简介
友链修改友链修改oldUrl 旧站点URL、newUrl 新站点URL、avatar、name、desc
友链删除友链删除url 站点URL
强制结束结束本次友链申请无(立即终止当前申请)

说明:

  • 访客回复的正文必须只包含那份 JSON。
  • 修改友链时需分两次验证旧站点和新站点,Rin 会为每个站点分别生成验证码,并在每个站点验证前重新询问验证方式。
  • 任意阶段回复 结束本次友链申请 可立即终止当前申请,释放占用后其他人可继续申请。
  • 结束提示只出现在进行中的邮件里。申请一旦结束(成功、信息有误被终止、强制结束、超时自动结束),对应邮件就不再带该提示。
  • 由于系统收件地址与发件地址不同,直接使用邮件客户端的「回复」会发到发件地址而无法被处理。每封需要回信的邮件末尾都会提示用户新建邮件并发送到收件地址。
  • 站点 URL 支持跳转链接:若 URL 形如 https://link.你的域名/?...&to=https://真实站点&...,系统会自动从 to 参数提取真实地址进行匹配,因此修改/删除时提供跳转链接或真实地址均可。
  • 邮件发送由 MailPort 发件服务完成,与邮箱验证码登录共用同一套 EMAIL_SEND_URLS / EMAIL_SEND_KEYS。

前提条件

  1. 已部署 MailPort 并配置 EMAIL_SEND_URLS / EMAIL_SEND_KEYS(见 环境变量说明)。
  2. 已开通 Cloudflare Email Routing,并把专用地址(如 friend-request@你的域名.com)的路由规则动作设为 Send to a Worker,目标 Worker 选择部署 Rin 的 Worker。
  3. 出站邮件(MailPort)所用的发件域名不要与你用于接收的域名完全相同,避免 Rin 处理到自己发出的邮件导致循环。

规则与限制

  • 并发为 1:同一时间只允许一个访客申请。若他人同时发起,会被邮件告知 20 分钟后再试。
  • 10 分钟验证时限:验证码自发出起 10 分钟内有效,超时则本次申请自动终止。
  • 30 分钟总时限:一次申请从发起起 30 分钟内必须完成。
  • JSON 或站点 URL 不合法:Rin 直接发邮件告知信息有误并终止本次申请。
  • 严格验证:文件方式要求 GET 返回 200,且剔除标签/脚本后 <body> 文本中能找到验证码;SPA 回退、自定义 404 页面(返回 200 的整页 HTML)、403/500、30x 重定向均视为未通过。DNS 方式要求 _jiaofriend.访客域名 的 TXT 记录值中包含验证码。两种方式都可在时限内重试。
  • 通过邮件完成的友链 uid 归管理员,accepted 直接为 1,无需后台再审核。

可选开关

  • friend_email_apply_enable(数据库配置,server.config):设为 false 可关闭该功能,默认开启。可通过后台设置页或 serverConfig 写入。

UID 归属(自助申请友链的归属账号)

通过邮件自助申请的友链,其归属 uid 规则如下:

  1. 申请邮箱已绑定账号:若申请者的邮箱在博客中已绑定某个账号(users.email 匹配),则友链归属该账号的 uid。
  2. 无绑定账号:否则归属一个专门的「自助申请」账号,默认 uid = 7。

如何自定义

  • 方式一(推荐,无需改代码):在后台设置或 serverConfig 中写入 friend_email_owner_uid,值为你希望使用的账号 uid(例如 7)。
  • 方式二(改代码默认值):编辑 server/src/services/friend-email.ts 中的常量 DEFAULT_EMAIL_OWNER_UID(默认 7)。

注意:无论哪种方式,请确保目标 uid 对应的账号已存在,否则写入友链时会因外键约束失败。

部署后验证

向 friend-request@你的域名.com 发一封正文为 友链申请 的邮件,应收到回复邮件与 JSON 模板,即表示整条链路已打通。