メールによる友だちリンク申請
Rin は、バックエンドへのログインなしで、メールによる友だちリンクの申請・変更・削除を自動処理できます。訪問者に友だちリンクをセルフサービスで管理してもらうのに最適です。
仕組み
訪問者が専用アドレス(例:friend-request@your-domain.com)にメールを送ると、Rin の Worker が Cloudflare Email Routing 経由でメールを受信し、自動的に処理します:
- 訪問者が本文に 友链申请(変更は友链修改、削除は友链删除)と書いてメールを送信します。
- Rin が記入用の JSON テンプレートを返信します。
- 訪問者が JSON を記入して返信します。
- Rin が 8 文字のコード(
a)を生成し、検証方法の選択を求めます:DNS TXT レコード検証なら1、HTML ファイルアップロードなら2と返信します(1/一/方案一/方法一のいずれも受け付け、同様に2/二/方案二/方法二も受け付けます)。 - DNS の場合、Rin は TXT レコードの追加手順を送信します — ホスト
_jiaofriend、タイプTXT、値a。ファイルアップロードの場合、Rin は検証用 HTML ソースを送信し、サイトルートにa.htmlを作成してソースをそのままコピーするよう求めます。 - 訪問者が設定を完了し、本文に 请你进行下一步验证 と書いて返信します。
- Rin が選択された方法で検証します:DNS は Cloudflare DNS-over-HTTPS 経由で
_jiaofriend.visitor-domainの TXT レコードを照会し、いずれかにaが含まれることを要求します。ファイルアップロードはhttps://site-url/a.htmlを取得し、200 かつ<body>テキストにコードが含まれることを要求します。成功すると、Rin はデータベース内の友だちリンクを追加・更新・削除します。
操作と JSON テンプレート
注記:
- 返信本文にはその JSON のみを含める必要があります。
- 変更には 2 回の検証が必要で、旧サイト用と新サイト用にそれぞれコードが必要です。各サイトの前に検証方法の選択を再度求められます。
- どの段階でも
结束本次友链申请と返信すると、現在の申請が終了し、他の人のために枠が解放されます。 - キャンセルのヒントは、申請が進行中の間に送信されるメールにのみ表示されます。申請が終了すると(成功、無効なデータ、強制キャンセル、タイムアウト)、そのメールにはキャンセルのヒントは含まれません。
- 受信用アドレスは送信用アドレスと異なるため、メールクライアントで「返信」を押すと送信用アドレスに送られ、システムはそれを受信できません。返信を期待するすべてのメールは、受信用アドレス宛に新しいメールを作成するよう促す注意書きで終わります。
- サイト URL はリダイレクトリンクをサポートします:URL が
https://link.your-domain/?...&to=https://real-site&...のような場合、システムはtoパラメータから実際のアドレスを抽出して照合するため、リダイレクトリンクでも実際の URL でも変更・削除が機能します。 - 送信メールは MailPort 送信サービスによって送信され、既存の
EMAIL_SEND_URLS/EMAIL_SEND_KEYSを共有します。
前提条件
- MailPort をデプロイし、
EMAIL_SEND_URLS/EMAIL_SEND_KEYSを設定します(環境変数 を参照)。 - Cloudflare Email Routing を有効にし、専用アドレス(例:
friend-request@your-domain.com)のルーティングルールを Send to a Worker に設定し、Rin を実行している worker を選択します。 - 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 は次のように解決されます:
- 申請者のメールがアカウントにバインドされている:申請者のメールが
users.emailの行と一致する場合、友だちリンクはそのアカウントのuidに所有されます。 - バインドされたアカウントがない:それ以外の場合は、専用のセルフサービスアカウント(デフォルト
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 テンプレートの返信が届けば、パイプライン全体が機能していることが確認できます。