Skip to content

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

41 Commits
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

mail2push

SMTP しか話せない機器からのメールを、スマホの Push 通知に変換するサービスです。

NAS、UPS、ルータ、Jenkins、監視ソフト——「アラートをメールで送る」ことしかできない機器は まだたくさんあります。そのメール送信先に mail2push が発行したアドレスを設定しておくと、 届いたメールがそのままスマホの通知として表示されます。専用アプリのインストールは不要で、 受信側は PWA(ホーム画面に追加する Web アプリ)です。

https://push.sogo.dev

機器 (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.sql

wrangler 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.jsoncvars に置いてあります。 秘密の値は wrangler secret put で設定するもので、リポジトリには含まれません:

名前 用途
HMAC_SECRET 受信アドレスの署名。これが漏れると任意のアドレスを偽造できます
SESSION_SECRET セッション Cookie の署名
VAPID_PRIVATE_KEY Web Push の VAPID 署名
RESEND_API_KEY ログインコードのメール送信(Resend)

自分の環境で動かす場合

Cloudflare 側に、リポジトリからは作れないものがいくつかあります:

  1. ドメインを Cloudflare に置き、Email Routing を有効化する
  2. catch-all ルールの宛先を「Send to a Worker」にしてこの Worker を指定する
  3. npx wrangler d1 create mail2push-db して、返ってきた database_idwrangler.jsonc に書く
  4. npx wrangler queues create mail2push-notifications
  5. 上表の secret を 4 つ設定する(VAPID 鍵ペアは npx web-push generate-vapid-keys で生成できます)

ライセンス

MIT

About

SMTPしか話せない機器からのメールを、スマホのWeb Push通知に変える。Cloudflare Workers + D1 + Queues の無料枠で動くPWA。

Topics

Resources

Security policy

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages