Skip to content

Latest commit

 

History

History
66 lines (47 loc) · 6.04 KB

File metadata and controls

66 lines (47 loc) · 6.04 KB

ワーカー仕様

対象: apps/reminder-worker。メールを送る。送るのは、締め切りが近いタスクのリマインドと、タスクを共有したときの通知。

実装: src/index.ts、メールの文面: src/mail.ts、リマインドの検索: packages/db/src/tasks/reminders.ts

ハンドラ

ハンドラ 起動 内容
scheduled Cron Triggers (15 分ごと) リマインドの対象のタスクを探して、Queues に積む
queue Queues (kanban-reminders) リマインドのメールを送る
queue Queues (kanban-notifications) タスクを共有したときのメールを送る

cron と Queues の設定は wrangler.jsonc (triggers.crons、queues)。kanban-notifications には、apps/web がタスクを共有したときにメッセージを積む。

リマインドの流れ

  1. scheduled が、次の条件をすべて満たすタスクを D1 から探す。
    • リマインドがオン (remind_before_minutes が NULL でない)。既定はオフ
    • 未完了
    • 「締め切り − remind_before_minutes」の時刻を過ぎていて、締め切りはまだ先
    • まだリマインドをキューに積んでいない (reminder_queued_at が NULL)
  2. 見つかったタスクを Queues に積み、reminder_queued_at に時刻を記録する。
  3. queue が、Resend の API でメールを送る。

メール

どのメールも、本文に APP_URL からのリンクを含める。締め切りは日本時間で書く。

メール 宛先 件名 本文
リマインド タスクの所有者 締め切りが近いタスク: <タイトル> 締め切りと、タスクのページへのリンク
共有 (登録済み) 共有された人 <共有した人> さんがタスクを共有しました: <タイトル> 誰がどのタスクを共有したかと、タスクのページへのリンク
共有 (未登録) 招待されたメールアドレス 同上 誰がどのタスクを共有したかと、アカウントを作ると表示される旨、ログインページへのリンク。タスクへのリンクは入れない
  • 共有のメールは、新しく共有したときだけ送る。同じ相手に共有し直しても送らない。
  • 共有のメールを送るかどうか (アカウントの有無) は、メールの文面にだけ影響する。共有する側の画面には、アカウントの有無を返さない。

方針

  • 1 つのタスクにつきリマインドは 1 回。reminder_queued_at が入ったタスクは再度対象にならない。
  • 締め切りかリマインドの設定を変えると reminder_queued_at を空に戻し、新しい設定でもう一度リマインドする。
  • cron は 15 分ごとなので、実際の送信は設定した時刻から最大 15 分遅れる。
  • リマインドの宛先はタスクの所有者だけ。共有された人には送らない。
  • メールの送信が失敗したら、そのメッセージだけを 60 秒後にもう一度試す (最大 3 回。Queues の設定)。うまくいったメッセージは、同じバッチの中でも先に完了させる。それでも送れなかったメッセージは、捨てずにデッドレターキュー (kanban-mail-dead-letter) に残る。溜まっていないかを、ダッシュボードで見る。
  • RESEND_API_KEY がないとき、ローカル (APP_URL が localhost) だけは、メールを送らずに宛先と件名をログに出す。それ以外 (本番) ではエラーにして、再試行とデッドレターキューに回す。黙って送らないと、メールが失われるのに送信済みになってしまうため。

設定

名前 内容
RESEND_API_KEY Resend の API キー (シークレット)
REMINDER_FROM 送信元アドレス (wrangler.jsonc の vars、既定は onboarding@resend.dev)。本番は独自ドメインの検証が必要
APP_URL メールのリンクの先 (wrangler.jsonc の vars、既定は http://localhost:8787)。本番は公開しているアプリの URL に変える

開発中の onboarding@resend.dev は、Resend のアカウントのメールアドレス宛にしか送れない。

未了

メールを実際に送れる状態にするには、アカウントやドメインの作業が要る。コードの側は済んでいる。リソースの作り方とシークレットの設定は デプロイとプレビュー にある。#8 で扱う。

  • Resend のアカウントで API キーを作り、RESEND_API_KEY を設定する
  • 送信元のドメインを Resend で検証し、REMINDER_FROM を変える
  • APP_URL を本番の URL に変える
  • 本番で、実際にメールが届くことを確認する