Workers Mail は、 Cloudflare Workers 上で独自ドメインの電子メール ホスティングを行うアプリケーションです。 API とフロントエンドを提供しており、簡単にあなたのドメイン名のメールアドレスを管理できます。
メールの送受信には Cloudflare の Email Routing 機能を使用します。
2023-10-02.19-42-24.24fps.cleaned.mp4
- メール作成
- メール送信
- ラベリング
- メッセージ検索
- アクセスログ
- エンドツーエンド暗号化 (ProtonMail-like)
Web UIは SvelteKit と Tailwind CSS で構築されたシングルページアプリケーションです。
Workers Mailには、JavaScriptが無効な環境でも動作するNoJSバージョンのWeb UIが存在します。
Tor BrowserをSafest設定で使用している場合は、NoJSバージョンでの利用を推奨します。
APIは Hono を利用しています。 Hono は Cloudflare Workers などのエッジ環境で API などを構築するためのフレームワークです。
API ドキュメントは API.md を参照してください。
環境に合わせてwrangler.toml
の内容を編集してください。
pattern
: WorkerにアクセスするためのURL(例:mail.example.com
)custom_domain
:pattern
を設定するならtrue
Workerに*.workers.dev
というアドレスを割り当てたくない場合、workers_dev
にfalse
を設定してください。
Workerの環境変数です。
新規登録や送信機能を一時的に許可・拒否したい場合は、Cloudflareのダッシュボードから環境変数を変更することも可能です。
変数名 | 値 | 説明 |
---|---|---|
CATCH_ALL_ADDRESS |
"admin@example.com" |
設定されている場合、存在しないユーザ宛てのメールをこのアドレスに転送します。 |
EMAIL_DOMAINS |
[ "hello.com", "world.jp" ] |
設定したドメイン名のメールアドレスを利用できます。 |
REGISTRATION |
true or false |
新規登録を許可する場合true (規定値はfalse )。 |
SENDING |
true or false |
メールの送信を許可する場合true (規定値はfalse )。 |
DKIM_SELECTOR |
任意の半角英数文字列 | DKIMのセレクタ名 |
DKIM_PRIV_B64 |
Base64エンコードされたDKIM秘密鍵 | 特別な理由がない限りこの値は設定しないでください。 |
$ git clone https://github.com/shinosaki/workers-mail.git
$ cd workers-mail
// If you not login wrangler
$ wrangler login
$ npm run dkim
$ npm run secret:dkim
$ npm run kv:init
$ npm run db:init
// Append KV/D1's id in wrangler.toml
$ vi ./wrangler.toml
$ npm run db:generate
$ npm run deploy:migration
$ npm run deploy
- このリポジトリをダウンロード
git clone https://github.com/shinosaki/workers-mail.git
- 作業ディレクトリを移動
cd ./workers-mail/
メールの送信機能を使用する場合、DKIMキーが必要です。
- DKIMキーの生成
npm run dkim
- Workerのシークレット環境変数(
DKIM_PRIV_B64
)を設定
npm run secret:dkim
KVはセッション管理に、D1はユーザデータとメールデータの保存に必要です。
-
KV
- KVネームスペースの作成
npm run kv:init
Add the following to your configuration file in your kv_namespaces array: kv_namespaces = [ { binding = "SESSION", id = "e29b263ab50e42ce9b637fa8370175e8" } ]
- 出力されたidを
wrangler.toml
に設定[[ kv_namespaces ]] binding = "SESSION" id = "<Your KV ID Here>" 👈ここにidを設定 preview_id = "local"
- KVネームスペースの作成
-
D1
- D1データベースの作成
npm run db:init
✅ Successfully created DB 'worker-mail-db'! Add the following to your wrangler.toml to connect to it from a Worker: [[ d1_databases ]] binding = "DB" # i.e. available in your Worker on env.DB database_name = "workers-mail-db" database_id = "efb92fcb-1aee-4214-9e50-756cd9de8e7e"
- 出力されたidを
wrangler.toml
に設定[[ d1_databases ]] binding = "DB" database_name = "workers-mail-db" database_id = "<Your D1 Database ID Here>" 👈ここにidを設定 preview_database_id = "local" migrations_dir = "./drizzle"
- D1データベースの作成
npm run deploy:migration
npm run deploy
DKIMセレクタ名はwrangler.toml
内のDKIM_SELECTOR
の値を設定します。
dkim.json
は2. DKIM鍵の生成ステップで生成されています。
タイプ | レコード名 | 内容 |
---|---|---|
TXT | <DKIMセレクタ名>._domainkey |
dkim.json の"dns" の値をコピペ |
設定値はCloudflareのドキュメントに従い、メールの送信をCloudflareとMailChannelsのサーバのみに制限します。
タイプ | レコード名 | 内容 |
---|---|---|
TXT | @ |
v=spf1 include:_spf.mx.cloudflare.net include:relay.mailchannels.net -all |
タイプ | レコード名 | 内容 |
---|---|---|
TXT | _dmarc |
v=DMARC1; p=none; rua=mailto:<DMARCレポートを受け取るアドレス> |
通常はCloudflareに登録したドメイン名をcfid
に指定してください。
タイプ | レコード名 | 内容 |
---|---|---|
TXT | _mailchannels |
v=mc1 cfid=<ドメイン名> |
このレコードを追加しないと、MailChannelsは「Failed to send email: 550 5.7.1 This sender is not authorized to send from example.com. See https://bit.ly/domain-lockdown. cfid=example.com」というエラーを返します。
レコードを設定したのにこのエラーが表示される場合、エラーメッセージ末尾のcfid=
を改めてDNSレコードに設定してください。
詳細はHow to Use Domain Lockdown™を参照してください。
Cloudflareの公式ドキュメントに従ってEmail Routingを有効化し、Catch-all addressのActionをSend to a Worker
に、Worker名にworkers-mail
を設定します。
また、Destination addressesにCATCH_ALL_ADDRESS
で設定したメールアドレスを設定し、認証してください。
認証メールを受信するには、先ほどデプロイしたWorker Mailに当該ユーザのアカウントを作成しておく必要があります(例えば、CATCH_ALL_ADDRESS
がadmin@example.com
なら、admin
というユーザを事前に作成しておいてください)。