{"id":15723469,"url":"https://github.com/shinosaki/workers-mail","last_synced_at":"2025-05-13T04:31:10.423Z","repository":{"id":185123698,"uuid":"673038377","full_name":"shinosaki/workers-mail","owner":"shinosaki","description":"Cloudflare Workers上でweb UIとAPIを備えた独自ドメインのメールサービスを構築できます。 / Host your own email service on Cloudflare Workers with a web UI, an API, and your own domain.","archived":false,"fork":false,"pushed_at":"2023-10-10T03:35:08.000Z","size":261,"stargazers_count":20,"open_issues_count":2,"forks_count":2,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-04-20T22:32:42.235Z","etag":null,"topics":["api","cloudflare-workers","email","email-hosting","frontend","hono","sveltekit","tailwindcss"],"latest_commit_sha":null,"homepage":"https://mail.lain.im","language":"JavaScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/shinosaki.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2023-07-31T18:17:34.000Z","updated_at":"2025-04-08T14:49:02.000Z","dependencies_parsed_at":"2023-07-31T20:21:59.899Z","dependency_job_id":"b9bccc50-97b8-4a7e-b5fa-d0f322739ecb","html_url":"https://github.com/shinosaki/workers-mail","commit_stats":null,"previous_names":["shinosaki/workers-mail"],"tags_count":2,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/shinosaki%2Fworkers-mail","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/shinosaki%2Fworkers-mail/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/shinosaki%2Fworkers-mail/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/shinosaki%2Fworkers-mail/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/shinosaki","download_url":"https://codeload.github.com/shinosaki/workers-mail/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":253876647,"owners_count":21977629,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["api","cloudflare-workers","email","email-hosting","frontend","hono","sveltekit","tailwindcss"],"created_at":"2024-10-03T22:11:50.372Z","updated_at":"2025-05-13T04:31:10.393Z","avatar_url":"https://github.com/shinosaki.png","language":"JavaScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Workers Mail\r\n\r\nWorkers Mail は、 Cloudflare Workers 上で独自ドメインの電子メール ホスティングを行うアプリケーションです。 API とフロントエンドを提供しており、簡単にあなたのドメイン名のメールアドレスを管理できます。  \r\n\r\nメールの送受信には Cloudflare の [Email Routing](https://developers.cloudflare.com/email-routing/email-workers/) 機能を使用します。\r\n\r\n## Demo\r\n[Workers Mail(mail.lain.im)](https://mail.lain.im/)  \r\n\r\nhttps://github.com/shinosaki/workers-mail/assets/88357168/59d76515-708c-41e5-850d-5bffee8a5f7b\r\n\r\n## ToDo\r\n- [x] メール作成\r\n- [x] メール送信\r\n- [ ] ラベリング\r\n- [ ] メッセージ検索\r\n- [ ] アクセスログ\r\n- [ ] エンドツーエンド暗号化 (ProtonMail-like)\r\n\r\n## Web UI\r\n~~Web UIは [SvelteKit](https://kit.svelte.dev/) と [Tailwind CSS](https://tailwindcss.com/) で構築されたシングルページアプリケーションです。~~  \r\n\r\n### NoJSバージョン\r\nWorkers Mailには、JavaScriptが無効な環境でも動作するNoJSバージョンのWeb UIが存在します。  \r\nTor BrowserをSafest設定で使用している場合は、NoJSバージョンでの利用を推奨します。\r\n\r\n## API\r\nAPIは [Hono](https://hono.dev/) を利用しています。 Hono は Cloudflare Workers などのエッジ環境で API などを構築するためのフレームワークです。\r\n\r\n~~API ドキュメントは [API.md](./docs/API.md) を参照してください。~~  \r\n\r\n## 設定\r\n環境に合わせて`wrangler.toml`の内容を編集してください。\r\n\r\n### `[route]`\r\n- `pattern`: WorkerにアクセスするためのURL(例: `mail.example.com`)\r\n- `custom_domain`: `pattern`を設定するなら`true`\r\n\r\nWorkerに`*.workers.dev`というアドレスを割り当てたくない場合、`workers_dev`に`false`を設定してください。\r\n\r\n### `[vars]`\r\nWorkerの環境変数です。  \r\n新規登録や送信機能を一時的に許可・拒否したい場合は、Cloudflareのダッシュボードから環境変数を変更することも可能です。\r\n\r\n| 変数名 | 値 | 説明 |\r\n| --- | --- | --- |\r\n| `CATCH_ALL_ADDRESS` | `\"admin@example.com\"` | 設定されている場合、存在しないユーザ宛てのメールをこのアドレスに転送します。 |\r\n| `EMAIL_DOMAINS` | `[ \"hello.com\", \"world.jp\" ]` | 設定したドメイン名のメールアドレスを利用できます。 |\r\n| `REGISTRATION` | `true` or `false` | 新規登録を許可する場合`true`(規定値は`false`)。 |\r\n| `SENDING` | `true` or `false` | メールの送信を許可する場合`true`(規定値は`false`)。 |\r\n| `DKIM_SELECTOR` | 任意の半角英数文字列 | DKIMのセレクタ名 |\r\n| `DKIM_PRIV_B64` | Base64エンコードされたDKIM秘密鍵 | 特別な理由がない限りこの値は設定しないでください。 |\r\n\r\n## デプロイ\r\n```\r\n$ git clone https://github.com/shinosaki/workers-mail.git\r\n$ cd workers-mail\r\n\r\n// If you not login wrangler\r\n$ wrangler login\r\n\r\n$ npm run dkim\r\n$ npm run secret:dkim\r\n\r\n$ npm run kv:init\r\n$ npm run db:init\r\n// Append KV/D1's id in wrangler.toml\r\n$ vi ./wrangler.toml\r\n\r\n$ npm run db:generate\r\n$ npm run deploy:migration\r\n$ npm run deploy\r\n```\r\n\r\n### 1. リポジトリのクローン\r\n1. このリポジトリをダウンロード\r\n   `git clone https://github.com/shinosaki/workers-mail.git`\r\n2. 作業ディレクトリを移動  \r\n   `cd ./workers-mail/`\r\n\r\n### 2. DKIM鍵の生成\r\nメールの送信機能を使用する場合、DKIMキーが必要です。\r\n\r\n1. DKIMキーの生成  \r\n   `npm run dkim`\r\n2. Workerのシークレット環境変数(`DKIM_PRIV_B64`)を設定  \r\n   `npm run secret:dkim`\r\n\r\n### 3. KVとD1の初期設定\r\nKVはセッション管理に、D1はユーザデータとメールデータの保存に必要です。\r\n\r\n- KV\r\n  1. KVネームスペースの作成  \r\n     `npm run kv:init`  \r\n     ```\r\n     Add the following to your configuration file in your kv_namespaces array:\r\n     kv_namespaces = [\r\n       { binding = \"SESSION\", id = \"e29b263ab50e42ce9b637fa8370175e8\" }\r\n     ]\r\n     ```\r\n  2. 出力されたidを`wrangler.toml`に設定  \r\n     ```\r\n     [[ kv_namespaces ]]\r\n     binding = \"SESSION\"\r\n     id = \"\u003cYour KV ID Here\u003e\" 👈ここにidを設定\r\n     preview_id = \"local\"\r\n     ```\r\n\r\n- D1\r\n  1. D1データベースの作成  \r\n     `npm run db:init`  \r\n     ```\r\n     ✅ Successfully created DB 'worker-mail-db'!\r\n     \r\n     Add the following to your wrangler.toml to connect to it from a Worker:\r\n     \r\n     [[ d1_databases ]]\r\n     binding = \"DB\" # i.e. available in your Worker on env.DB\r\n     database_name = \"workers-mail-db\"\r\n     database_id = \"efb92fcb-1aee-4214-9e50-756cd9de8e7e\"\r\n     ```\r\n  2. 出力されたidを`wrangler.toml`に設定\r\n     ```\r\n     [[ d1_databases ]]\r\n     binding = \"DB\"\r\n     database_name = \"workers-mail-db\"\r\n     database_id = \"\u003cYour D1 Database ID Here\u003e\" 👈ここにidを設定\r\n     preview_database_id = \"local\"\r\n     migrations_dir = \"./drizzle\"\r\n     ```\r\n\r\n### 4. データベースの初期化\r\n- `npm run deploy:migration`\r\n\r\n### 5. デプロイ\r\n- `npm run deploy`\r\n\r\n## DNSレコードの設定 (SPF, DKIM, DMARC etc.)\r\n### DKIM\r\nDKIMセレクタ名は`wrangler.toml`内の`DKIM_SELECTOR`の値を設定します。  \r\n\r\n`dkim.json`は[2. DKIM鍵の生成](#2DKIM鍵の生成)ステップで生成されています。\r\n\r\n| タイプ | レコード名 | 内容 |\r\n| --- | --- | --- |\r\n| TXT | `\u003cDKIMセレクタ名\u003e._domainkey` | `dkim.json`の`\"dns\"`の値をコピペ |\r\n\r\n### SPF\r\n設定値は[Cloudflareのドキュメント](https://developers.cloudflare.com/pages/platform/functions/plugins/mailchannels/#spf-support-for-mailchannels)に従い、メールの送信をCloudflareとMailChannelsのサーバのみに制限します。\r\n\r\n| タイプ | レコード名 | 内容 |\r\n| --- | --- | --- |\r\n| TXT | `@` | `v=spf1 include:_spf.mx.cloudflare.net include:relay.mailchannels.net -all` |\r\n\r\n### DMARC\r\n| タイプ | レコード名 | 内容 |\r\n| --- | --- | --- |\r\n| TXT | `_dmarc` | `v=DMARC1; p=none; rua=mailto:\u003cDMARCレポートを受け取るアドレス\u003e` |\r\n\r\n### MailChannels\r\n通常はCloudflareに登録したドメイン名を`cfid`に指定してください。\r\n\r\n| タイプ | レコード名 | 内容 |\r\n| --- | --- | --- |\r\n| TXT | `_mailchannels` | `v=mc1 cfid=\u003cドメイン名\u003e` |\r\n\r\nこのレコードを追加しないと、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」というエラーを返します。  \r\nレコードを設定したのにこのエラーが表示される場合、エラーメッセージ末尾の`cfid=`を改めてDNSレコードに設定してください。  \r\n詳細は[How to Use Domain Lockdown™](https://support.mailchannels.com/hc/en-us/articles/16918954360845#h_01HAD21C0BVYNDQQY6BM6FX36V)を参照してください。\r\n\r\n## Email Routingの設定\r\nCloudflareの[公式ドキュメント](https://developers.cloudflare.com/email-routing/email-workers/enable-email-workers/)に従ってEmail Routingを有効化し、Catch-all addressのActionを`Send to a Worker`に、Worker名に`workers-mail`を設定します。  \r\n\r\n![Cloudflare Email Routingの設定画面](./docs/email-routing-dashboard.png)\r\n\r\nまた、Destination addressesに`CATCH_ALL_ADDRESS`で設定したメールアドレスを設定し、認証してください。  \r\n**認証メールを受信するには、先ほどデプロイしたWorker Mailに当該ユーザのアカウントを作成しておく必要があります**（例えば、`CATCH_ALL_ADDRESS`が`admin@example.com`なら、`admin`というユーザを事前に作成しておいてください）。\r\n\r\n## Author\r\n\r\n[Shinosaki](https://shinosaki.com/)\r\n\r\n## Dependencies\r\n\r\n### API\r\n- [hono](https://hono.dev/)\r\n- [hono-kv-session](https://github.com/shinosaki/hono-kv-session)\r\n- [bcryptjs](https://github.com/dcodeIO/bcrypt.js)\r\n- [zod](https://zod.dev/)\r\n- [drizzle-orm](https://orm.drizzle.team/)\r\n- [mimetext](https://muratgozel.github.io/MIMEText/)\r\n- [postal-mime](https://github.com/postalsys/postal-mime)\r\n\r\n### Web UI\r\n- [tailwindcss](https://tailwindcss.com/)\r\n- [sveltekit](https://kit.svelte.dev/)\r\n- [tabler-icons](https://tabler-icons.io/)\r\n- [dayjs](https://day.js.org/)\r\n- Fonts\r\n  - [Roboto](https://fontsource.org/fonts/roboto)\r\n  - [Kosugi Maru](https://fontsource.org/fonts/kosugi-maru)\r\n\r\n### Development\r\n- [wrangler](https://github.com/cloudflare/workers-sdk)\r\n- [drizzle-kit](https://orm.drizzle.team/kit-docs/overview)\r\n- [vite](https://vitejs.dev/)\r\n\r\n## License\r\n\r\n[MIT](https://raw.githubusercontent.com/shinosaki/workers-mail/main/LICENSE)\r\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fshinosaki%2Fworkers-mail","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fshinosaki%2Fworkers-mail","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fshinosaki%2Fworkers-mail/lists"}