SMTP しか話せない機器からのメールを、スマホの Push 通知に変換するサービスです。
NAS、UPS、ルータ、Jenkins、監視ソフト——「アラートをメールで送る」ことしかできない機器は まだたくさんあります。そのメール送信先に mail2push が発行したアドレスを設定しておくと、 届いたメールがそのままスマホの通知として表示されます。専用アプリのインストールは不要で、 受信側は PWA(ホーム画面に追加する Web アプリ)です。
機器 (SMTP)
→ Cloudflare Email Routing (catch-all)
→ Email Worker … 宛先の HMAC 署名を検証して Queue に積む
→ Queue Consumer … VAPID 署名 + RFC 8291 暗号化して Push 送信
→ PWA (Service Worker) … 通知を表示
- 機器ごとにアドレスを発行できます。UPS 用、Jenkins 用、と分けておけば通知のタイトルで どこから来たか分かりますし、不要になったものだけ失効できます。
- パスワードなし。メールアドレスにログインコードが届く方式です。
- 見逃した通知を読み返せます。直近 7 日分だけ保存し、それ以降は自動で削除されます。
- Cloudflare の無料枠に収まる構成で動いています(Workers / D1 / Queues / Email Routing)。
対応環境は iOS 16.4 以降、および Android の Chrome です。iOS ではホーム画面に追加してからで ないと通知を受け取れません(Web Push の仕様上の制約です)。
使い方でつまずいたときは よくある質問 を参照してください。
ARCHITECTURE.md に、実装前の技術調査と、実機検証で分かったことを
まとめてあります。Cloudflare Email Workers から Web Push を送る際の落とし穴(web-push npm が
Workers で動かない、SPF/DKIM の検証結果が Worker に渡ってこない、メールの宛先が配送経路で
小文字化される、など)は、同じ構成を組む人には役に立つかもしれません。
cd worker
npm install
cp .dev.vars.example .dev.vars # 中身のコメントを参照(最低限 HMAC_SECRET と SESSION_SECRET)
npm run dev # wrangler dev(Email Worker のローカル起動を含む)ローカル DB の初期化:
npx wrangler d1 migrations apply mail2push-db --local
npx wrangler d1 execute mail2push-db --local --file=seed.sqlwrangler dev 起動中は、/cdn-cgi/handler/email に POST することで受信メールを
シミュレートできます(test/fixtures/*.eml にサンプルがあります)。
その他のコマンド:
npm run typecheck
npm run deploy
npm run tail # 本番ログの追跡src/icons.ts / src/og-image.ts / src/screenshots.ts は、PNG を base64 で
埋め込んだものです(外部ストレージを使わず Worker 単体で配信するため)。
ランディングページのスクリーンショットは、ローカルの wrangler dev に
ダミーデータを入れて Playwright で撮影しています。本番のデータベースから
撮ると実在のメールアドレスや通知本文が公開ページに載るため、絶対に行わない
でください。アプリの UI を変えたら撮り直さないと、内容が実物と食い違います。
VAPID_PUBLIC_KEY など公開してよい値は wrangler.jsonc の vars に置いてあります。
秘密の値は wrangler secret put で設定するもので、リポジトリには含まれません:
| 名前 | 用途 |
|---|---|
HMAC_SECRET |
受信アドレスの署名。これが漏れると任意のアドレスを偽造できます |
SESSION_SECRET |
セッション Cookie の署名 |
VAPID_PRIVATE_KEY |
Web Push の VAPID 署名 |
RESEND_API_KEY |
ログインコードのメール送信(Resend) |
Cloudflare 側に、リポジトリからは作れないものがいくつかあります:
- ドメインを Cloudflare に置き、Email Routing を有効化する
- catch-all ルールの宛先を「Send to a Worker」にしてこの Worker を指定する
npx wrangler d1 create mail2push-dbして、返ってきたdatabase_idをwrangler.jsoncに書くnpx wrangler queues create mail2push-notifications- 上表の secret を 4 つ設定する(VAPID 鍵ペアは
npx web-push generate-vapid-keysで生成できます)