メールによる友だちリンク申請

Rin は、バックエンドへのログインなしで、メールによる友だちリンクの申請・変更・削除を自動処理できます。訪問者に友だちリンクをセルフサービスで管理してもらうのに最適です。

仕組み

訪問者が専用アドレス(例:friend-request@your-domain.com)にメールを送ると、Rin の Worker が Cloudflare Email Routing 経由でメールを受信し、自動的に処理します:

  1. 訪問者が本文に 友链申请(変更は友链修改、削除は友链删除)と書いてメールを送信します。
  2. Rin が記入用の JSON テンプレートを返信します。
  3. 訪問者が JSON を記入して返信します。
  4. Rin が 8 文字のコード(a)を生成し、検証方法の選択を求めます:DNS TXT レコード検証なら 1、HTML ファイルアップロードなら 2 と返信します(1 / 一 / 方案一 / 方法一 のいずれも受け付け、同様に 2 / 二 / 方案二 / 方法二 も受け付けます)。
  5. DNS の場合、Rin は TXT レコードの追加手順を送信します — ホスト _jiaofriend、タイプ TXT、値 a。ファイルアップロードの場合、Rin は検証用 HTML ソースを送信し、サイトルートに a.html を作成してソースをそのままコピーするよう求めます。
  6. 訪問者が設定を完了し、本文に 请你进行下一步验证 と書いて返信します。
  7. Rin が選択された方法で検証します:DNS は Cloudflare DNS-over-HTTPS 経由で _jiaofriend.visitor-domain の TXT レコードを照会し、いずれかに a が含まれることを要求します。ファイルアップロードは https://site-url/a.html を取得し、200 かつ <body> テキストにコードが含まれることを要求します。成功すると、Rin はデータベース内の友だちリンクを追加・更新・削除します。

操作と JSON テンプレート

操作トリガー本文(完全一致が必要)JSON フィールド
申請友链申请name、url(サイト URL)、avatar(サイトアイコン URL)、desc(サイト説明)
変更友链修改oldUrl、newUrl、avatar、name、desc
削除友链删除url(サイト URL)
キャンセル结束本次友链申请なし(現在の申請を即座に終了)

注記:

  • 返信本文にはその JSON のみを含める必要があります。
  • 変更には 2 回の検証が必要で、旧サイト用と新サイト用にそれぞれコードが必要です。各サイトの前に検証方法の選択を再度求められます。
  • どの段階でも 结束本次友链申请 と返信すると、現在の申請が終了し、他の人のために枠が解放されます。
  • キャンセルのヒントは、申請が進行中の間に送信されるメールにのみ表示されます。申請が終了すると(成功、無効なデータ、強制キャンセル、タイムアウト)、そのメールにはキャンセルのヒントは含まれません。
  • 受信用アドレスは送信用アドレスと異なるため、メールクライアントで「返信」を押すと送信用アドレスに送られ、システムはそれを受信できません。返信を期待するすべてのメールは、受信用アドレス宛に新しいメールを作成するよう促す注意書きで終わります。
  • サイト URL はリダイレクトリンクをサポートします:URL が https://link.your-domain/?...&to=https://real-site&... のような場合、システムは to パラメータから実際のアドレスを抽出して照合するため、リダイレクトリンクでも実際の URL でも変更・削除が機能します。
  • 送信メールは MailPort 送信サービスによって送信され、既存の EMAIL_SEND_URLS / EMAIL_SEND_KEYS を共有します。

前提条件

  1. MailPort をデプロイし、EMAIL_SEND_URLS / EMAIL_SEND_KEYS を設定します(環境変数 を参照)。
  2. Cloudflare Email Routing を有効にし、専用アドレス(例:friend-request@your-domain.com)のルーティングルールを Send to a Worker に設定し、Rin を実行している worker を選択します。
  3. MailPort が使用する送信元ドメインは、受信用ドメインと同じにしないでください。Rin が自身の送信メールを処理してしまうのを避けるためです。

ルールと制限

  • 同時実行数 = 1:一度に 1 人の訪問者の申請のみです。同時に申請した人には、20 分後に再試行するよう伝えます。
  • 10 分間の検証ウィンドウ:コードは発行された瞬間から 10 分間有効です。超過すると申請は自動終了します。
  • 30 分間の総ウィンドウ:申請は開始から 30 分以内に完了する必要があります。
  • 無効な JSON またはサイト URL:Rin が訪問者にエラーをメールし、申請を終了します。
  • 厳格な検証:ファイルアップロードは 200 応答と、<body> テキスト(タグ/スクリプト/スタイルを除去した後)にコードが含まれることを要求します。SPA フォールバック、カスタム 404 ページ(200 を返すフルページ HTML)、403/500、30x リダイレクトはすべて失敗します。DNS は _jiaofriend.visitor-domain の TXT レコードにコードが含まれることを要求します。どちらの方法もウィンドウ内で再試行できます。
  • メールで完了した友だちリンクは accepted = 1 で、バックエンドのレビューステップはありません。所有者 uid は以下で説明するように解決されます。

任意のトグル

  • friend_email_apply_enable(データベース設定、server.config):false に設定すると無効になります。デフォルトは true です。管理設定ページまたは serverConfig から書き込みます。

所有者 UID(セルフサービス友だちリンクを所有するアカウント)

メールで作成された友だちリンクの場合、所有者 uid は次のように解決されます:

  1. 申請者のメールがアカウントにバインドされている:申請者のメールが users.email の行と一致する場合、友だちリンクはそのアカウントの uid に所有されます。
  2. バインドされたアカウントがない:それ以外の場合は、専用のセルフサービスアカウント(デフォルト uid = 7)に所有されます。

カスタマイズ方法

  • オプション 1(推奨、コード変更なし):管理設定または serverConfig に friend_email_owner_uid を書き込み、希望するアカウントの uid(例:7)に設定します。
  • オプション 2(コードのデフォルトを変更):server/src/services/friend-email.ts の DEFAULT_EMAIL_OWNER_UID 定数を編集します(デフォルト 7)。

注:どちらの場合も、対象の uid アカウントが存在することを確認してください。存在しない場合、外部キー制約により挿入が失敗します。

デプロイ後の検証

本文に 友链申请 と書いたメールを friend-request@your-domain.com に送信してください。JSON テンプレートの返信が届けば、パイプライン全体が機能していることが確認できます。