Skip to content

Cloudflare Workers上でweb UIとAPIを備えた独自ドメインのメールサービスを構築できます。 / Host your own email service on Cloudflare Workers with a web UI, an API, and your own domain.

License

Notifications You must be signed in to change notification settings

shinosaki/workers-mail

Repository files navigation

Workers Mail

Workers Mail は、 Cloudflare Workers 上で独自ドメインの電子メール ホスティングを行うアプリケーションです。 API とフロントエンドを提供しており、簡単にあなたのドメイン名のメールアドレスを管理できます。

メールの送受信には Cloudflare の Email Routing 機能を使用します。

Demo

Workers Mail(mail.lain.im)

2023-10-02.19-42-24.24fps.cleaned.mp4

ToDo

  • メール作成
  • メール送信
  • ラベリング
  • メッセージ検索
  • アクセスログ
  • エンドツーエンド暗号化 (ProtonMail-like)

Web UI

Web UIは SvelteKitTailwind CSS で構築されたシングルページアプリケーションです。

NoJSバージョン

Workers Mailには、JavaScriptが無効な環境でも動作するNoJSバージョンのWeb UIが存在します。
Tor BrowserをSafest設定で使用している場合は、NoJSバージョンでの利用を推奨します。

API

APIは Hono を利用しています。 Hono は Cloudflare Workers などのエッジ環境で API などを構築するためのフレームワークです。

API ドキュメントは API.md を参照してください。

設定

環境に合わせてwrangler.tomlの内容を編集してください。

[route]

  • pattern: WorkerにアクセスするためのURL(例: mail.example.com)
  • custom_domain: patternを設定するならtrue

Workerに*.workers.devというアドレスを割り当てたくない場合、workers_devfalseを設定してください。

[vars]

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

1. リポジトリのクローン

  1. このリポジトリをダウンロード git clone https://github.com/shinosaki/workers-mail.git
  2. 作業ディレクトリを移動
    cd ./workers-mail/

2. DKIM鍵の生成

メールの送信機能を使用する場合、DKIMキーが必要です。

  1. DKIMキーの生成
    npm run dkim
  2. Workerのシークレット環境変数(DKIM_PRIV_B64)を設定
    npm run secret:dkim

3. KVとD1の初期設定

KVはセッション管理に、D1はユーザデータとメールデータの保存に必要です。

  • KV

    1. KVネームスペースの作成
      npm run kv:init
      Add the following to your configuration file in your kv_namespaces array:
      kv_namespaces = [
        { binding = "SESSION", id = "e29b263ab50e42ce9b637fa8370175e8" }
      ]
      
    2. 出力されたidをwrangler.tomlに設定
      [[ kv_namespaces ]]
      binding = "SESSION"
      id = "<Your KV ID Here>" 👈ここにidを設定
      preview_id = "local"
      
  • D1

    1. 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"
      
    2. 出力された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"
      

4. データベースの初期化

  • npm run deploy:migration

5. デプロイ

  • npm run deploy

DNSレコードの設定 (SPF, DKIM, DMARC etc.)

DKIM

DKIMセレクタ名はwrangler.toml内のDKIM_SELECTORの値を設定します。

dkim.json2. DKIM鍵の生成ステップで生成されています。

タイプ レコード名 内容
TXT <DKIMセレクタ名>._domainkey dkim.json"dns"の値をコピペ

SPF

設定値はCloudflareのドキュメントに従い、メールの送信をCloudflareとMailChannelsのサーバのみに制限します。

タイプ レコード名 内容
TXT @ v=spf1 include:_spf.mx.cloudflare.net include:relay.mailchannels.net -all

DMARC

タイプ レコード名 内容
TXT _dmarc v=DMARC1; p=none; rua=mailto:<DMARCレポートを受け取るアドレス>

MailChannels

通常は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™を参照してください。

Email Routingの設定

Cloudflareの公式ドキュメントに従ってEmail Routingを有効化し、Catch-all addressのActionをSend to a Workerに、Worker名にworkers-mailを設定します。

Cloudflare Email Routingの設定画面

また、Destination addressesにCATCH_ALL_ADDRESSで設定したメールアドレスを設定し、認証してください。
認証メールを受信するには、先ほどデプロイしたWorker Mailに当該ユーザのアカウントを作成しておく必要があります(例えば、CATCH_ALL_ADDRESSadmin@example.comなら、adminというユーザを事前に作成しておいてください)。

Author

Shinosaki

Dependencies

API

Web UI

Development

License

MIT

About

Cloudflare Workers上でweb UIとAPIを備えた独自ドメインのメールサービスを構築できます。 / Host your own email service on Cloudflare Workers with a web UI, an API, and your own domain.

Topics

Resources

License

Stars

Watchers

Forks

Packages

No packages published

Languages