対象: 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 がタスクを共有したときにメッセージを積む。
scheduledが、次の条件をすべて満たすタスクを D1 から探す。- リマインドがオン (
remind_before_minutesが NULL でない)。既定はオフ - 未完了
- 「締め切り −
remind_before_minutes」の時刻を過ぎていて、締め切りはまだ先 - まだリマインドをキューに積んでいない (
reminder_queued_atが NULL)
- リマインドがオン (
- 見つかったタスクを Queues に積み、
reminder_queued_atに時刻を記録する。 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 に変える- 本番で、実際にメールが届くことを確認する