Add files via upload

This commit is contained in:
mskatoni
2026-03-22 17:22:51 +08:00
committed by GitHub
parent afd7a5dbce
commit 5d2a330d52
5 changed files with 179 additions and 14 deletions

3
.gitignore vendored Normal file
View File

@@ -0,0 +1,3 @@
node_modules/
.wrangler/
dist/

17
LICENSE
View File

@@ -30,7 +30,7 @@
"Object" form shall mean any form resulting from mechanical
transformation or translation of a Source form, including but
not limited to compiled object code, generated documentation,
and conversions to other media types.
and conversions to other media formats.
"Work" shall mean the work of authorship, whether in Source or
Object form, made available under the License, as indicated by a
@@ -122,7 +122,7 @@
You may add Your own copyright statement to Your modifications and
may provide additional or different license terms and conditions
for use, reproduction, or distribution of Your modifications, or
for use, reproduction, or distribution of your modifications, or
for any such Derivative Works as a whole, provided Your use,
reproduction, and distribution of the Work otherwise complies with
the conditions stated in this License.
@@ -155,7 +155,7 @@
unless required by applicable law (such as deliberate and grossly
negligent acts) or agreed to in writing, shall any Contributor be
liable to You for damages, including any direct, indirect, special,
incidental, or consequential damages of any character arising as a
incidental, or exemplary damages of any character arising as a
result of this License or out of the use or inability to use the
Work (including but not limited to damages for loss of goodwill,
work stoppage, computer failure or malfunction, or any and all
@@ -175,17 +175,6 @@
END OF TERMS AND CONDITIONS
APPENDIX: How to apply the Apache License to your work.
To apply the Apache License to your work, attach the following
boilerplate notice, with the fields enclosed by brackets "[]"
replaced with your own identifying information. (Don't include
the brackets!) The text should be enclosed in the appropriate
comment syntax for the file format. We also recommend that a
file or class name and description of purpose be included on the
same "printed page" as the copyright notice for easier
identification within third-party archives.
Copyright [yyyy] [name of copyright owner]
Licensed under the Apache License, Version 2.0 (the "License");

138
README.md Normal file
View File

@@ -0,0 +1,138 @@
# mail-worker
一個極簡的 Cloudflare Worker用於接收域名郵件並提供 HTTP API 讀取。
無需資料庫、無需前端、無需 JWT部署後即可通過 API 取得最新郵件內容。
## 特性
- 📨 通過 Cloudflare Email Routing 接收郵件
- 🗄️ 使用 KV 儲存,最多保留 50 封
- 🔑 API Key 鑑權
- 🌐 支持多個自定義域名(域名需托管在 Cloudflare
- 📦 僅依賴 `postal-mime`,無其他依賴
## 前置條件
- 域名已托管在 Cloudflare
- 已啟用 Cloudflare Email Routing
## 部署
### 方式一Cloudflare 一鍵部署
[![Deploy to Cloudflare Workers](https://deploy.workers.cloudflare.com/button)](https://deploy.workers.cloudflare.com/?url=https://github.com/OWNER/REPO)
點擊按鈕後Cloudflare 會自動 Fork 此 repo 並完成代碼部署。
部署完成後,還需手動完成以下兩步:
**1. 建立 KV Namespace 並綁定**
```bash
wrangler kv:namespace create MAIL_KV
```
複製輸出的 `id`,前往 Cloudflare 控制台 → Workers & Pages → 你的 worker → Settings → Bindings → 新增 KV Namespace名稱填 `MAIL_KV`,選擇剛建立的 namespace。
**2. 設定環境變數**
Cloudflare 控制台 → Workers & Pages → 你的 worker → Settings → Variables → 新增:
| 變數名 | 值 |
|---|---|
| `AUTH_KEY` | 自訂一個密碼 |
---
### 方式二:本地 CLI 部署
**1. 安裝依賴**
```bash
npm install wrangler postal-mime
```
**2. 建立 KV Namespace**
```bash
wrangler kv:namespace create MAIL_KV
```
複製輸出的 `id`,填入 `wrangler.toml`
**3. 配置 `wrangler.toml`**
```toml
[vars]
AUTH_KEY = "換成你的密碼"
[[kv_namespaces]]
binding = "MAIL_KV"
id = "貼上剛才的 KV ID"
```
**4. 部署**
```bash
wrangler deploy
```
**5. 設定 Email Routing**
Cloudflare 控制台 → Email → Email Routing → Catch-all rule → Action: Send to Worker → 選擇 `mail-worker`
## 自定義域名(可選)
> 域名必須已托管在 Cloudflare無需手動建立 DNS 記錄Cloudflare 會自動處理並簽發 SSL。
`wrangler.toml` 中取消注釋並填入你的子域名,支持多個:
```toml
[[routes]]
pattern = "mail.domain-a.com"
custom_domain = true
[[routes]]
pattern = "mail.domain-b.com"
custom_domain = true
```
重新部署後即可通過自定義域名訪問 API。多個域名收到的郵件共用同一個 inbox`to` 欄位可用於區分來源域名。
## API
所有請求需帶上 Header`X-Auth-Key: 你的密碼`
| 方法 | 路徑 | 說明 |
|---|---|---|
| GET | `/latest` | 取得最新一封完整郵件 |
| GET | `/mails?limit=10` | 取得最近 N 封郵件列表(不含正文) |
| GET | `/mail/:id` | 取得單封完整郵件(含 html/text |
| DELETE | `/mails` | 清空收件匣 |
**範例**
```bash
# 使用自定義域名取得最新郵件
curl https://mail.yourdomain.com/latest \
-H "X-Auth-Key: 你的密碼"
# 回應範例
{
"id": "uuid-xxxx",
"receivedAt": "2025-03-22T10:00:00.000Z",
"from": "[email protected]",
"to": "[email protected]",
"subject": "驗證碼123456",
"text": "你的驗證碼是 123456",
"html": "<p>你的驗證碼是 123456</p>",
"attachments": [
{ "filename": "report.pdf", "mimeType": "application/pdf", "size": 102400 }
]
}
```
## License
Apache License 2.0

16
package.json Normal file
View File

@@ -0,0 +1,16 @@
{
"name": "mail-worker",
"version": "1.0.0",
"description": "Minimal Cloudflare Worker for receiving and reading emails via API",
"main": "src/worker.js",
"scripts": {
"deploy": "wrangler deploy",
"dev": "wrangler dev"
},
"dependencies": {
"postal-mime": "^2.2.9"
},
"devDependencies": {
"wrangler": "^3.0.0"
}
}

19
wrangler.toml Normal file
View File

@@ -0,0 +1,19 @@
name = "mail-worker"
main = "src/worker.js"
compatibility_date = "2024-09-23"
compatibility_flags = ["nodejs_compat"]
# ── 自定義域名(域名需已托管在 Cloudflare────────────────────────
# Cloudflare 會自動建立 DNS 記錄並簽發 SSL無需手動操作
# 取消下面兩行注釋並填入你的域名即可
# [[routes]]
# pattern = "mail.yourdomain.com"
# custom_domain = true
# ─────────────────────────────────────────────────────────────────
[vars]
AUTH_KEY = "換成你的密碼"
[[kv_namespaces]]
binding = "MAIL_KV"
id = "貼上你的 KV Namespace ID"