{"id":51697395,"url":"https://github.com/3lang3/email","last_synced_at":"2026-07-16T06:06:26.493Z","repository":{"id":353687801,"uuid":"1212570370","full_name":"3lang3/email","owner":"3lang3","description":null,"archived":false,"fork":false,"pushed_at":"2026-04-25T01:46:21.000Z","size":7,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-06-20T12:03:43.825Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"JavaScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/3lang3.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"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,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2026-04-16T14:06:46.000Z","updated_at":"2026-04-25T01:46:25.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/3lang3/email","commit_stats":null,"previous_names":["3lang3/email"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/3lang3/email","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/3lang3%2Femail","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/3lang3%2Femail/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/3lang3%2Femail/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/3lang3%2Femail/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/3lang3","download_url":"https://codeload.github.com/3lang3/email/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/3lang3%2Femail/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":35532675,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"online","status_checked_at":"2026-07-16T02:00:06.687Z","response_time":83,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"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":[],"created_at":"2026-07-16T06:06:26.353Z","updated_at":"2026-07-16T06:06:26.487Z","avatar_url":"https://github.com/3lang3.png","language":"JavaScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Cloudflare Email Worker\n\n接收邮件并存储到 [D1 数据库](https://developers.cloudflare.com/d1/)，通过 HTTP API 查询、删除和发送邮件。\n\n## 快速部署\n\n### 前置条件\n\n1. 安装 [Node.js](https://nodejs.org/)（\u003e= 18）\n2. 拥有 [Cloudflare 账号](https://dash.cloudflare.com/sign-up) 并将域名托管在 Cloudflare\n3. 登录 [Wrangler CLI](https://developers.cloudflare.com/workers/wrangler/)：\n\n```bash\nnpx wrangler login\n```\n\n浏览器会自动打开 [Cloudflare OAuth 授权页面](https://developers.cloudflare.com/workers/wrangler/commands/#login)，完成登录后终端会提示 `Successfully logged in`。\n\n### 一键部署\n\n```bash\n./deploy.sh\n```\n\n或手动执行：\n\n```bash\nnpm install\nnpx wrangler d1 create email-db          # 创建 D1 数据库（首次）\n# 将返回的 database_id 填入 wrangler.jsonc\nnpx wrangler d1 execute email-db --remote --file=schema.sql  # 建表\nnpx wrangler deploy                       # 部署 Worker\n```\n\n\u003e 详见 [D1 快速入门](https://developers.cloudflare.com/d1/get-started/) 和 [Workers 部署文档](https://developers.cloudflare.com/workers/get-started/guide/)。\n\n## 配置邮件路由\n\n部署后需在 Cloudflare Dashboard 中配置 [Email Routing](https://developers.cloudflare.com/email-routing/)，将目标域名的邮件路由到此 Worker：\n\n1. 进入 [Dashboard](https://dash.cloudflare.com/) → 选择域名 → **Email** → **Email Routing**\n2. 在 **Routing rules** 中添加规则，Action 选择 \"Send to a Worker\"，选择 `email-worker`\n\n\u003e 详见 [Email Routing 配置文档](https://developers.cloudflare.com/email-routing/setup/) 和 [Email Workers 文档](https://developers.cloudflare.com/email-routing/email-workers/)。\n\n## 配置邮件发送\n\n发送邮件功能使用 Cloudflare 的 [Send Email 绑定](https://developers.cloudflare.com/email-routing/email-workers/send-email-workers/)，需满足：\n\n1. `from` 地址所在域名已在 Cloudflare [Email Routing](https://developers.cloudflare.com/email-routing/setup/) 中完成验证\n2. `wrangler.jsonc` 中已配置 `send_email` 绑定（默认已配置）\n\n## API 说明\n\n### 查询邮件列表\n\n**GET** `/api/emails`  \n**POST** `/api/emails`（JSON body）\n\n| 参数 | 类型 | 说明 |\n|------|------|------|\n| `from` | string | 发件人地址（精确匹配） |\n| `to` | string | 收件人地址（精确匹配） |\n| `subject` | string | 主题关键词（模糊匹配） |\n| `minutes` | number | 最近 X 分钟内的邮件 |\n| `search` | string | 全文搜索（主题 + 正文） |\n| `limit` | number | 返回数量，默认 50，最大 200 |\n| `offset` | number | 偏移量，默认 0 |\n\n默认按收件时间倒序返回，最新邮件排在最前面。\n\n**示例：**\n\n```bash\n# GET 查询\ncurl \"https://email-worker.YOUR_SUBDOMAIN.workers.dev/api/emails?to=me@example.com\u0026minutes=10\"\n\n# POST 查询\ncurl -X POST \"https://email-worker.YOUR_SUBDOMAIN.workers.dev/api/emails\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\"from\": \"noreply@example.com\", \"subject\": \"验证码\", \"minutes\": 5}'\n```\n\n### 查询单封邮件\n\n**GET** `/api/emails/:id`\n\n```bash\ncurl \"https://email-worker.YOUR_SUBDOMAIN.workers.dev/api/emails/1\"\n```\n\n### 删除全部邮件\n\n**GET** `/api/emails/delete`\n\n```bash\ncurl \"https://email-worker.YOUR_SUBDOMAIN.workers.dev/api/emails/delete\"\n```\n\n### 发送（回复）邮件\n\n**POST** `/api/emails/send`\n\n| 参数 | 类型 | 必填 | 说明 |\n|------|------|------|------|\n| `from` | string | 是 | 发件人地址（须为已验证域名下的地址） |\n| `to` | string | 是 | 收件人地址 |\n| `subject` | string | 是 | 邮件主题 |\n| `body` | string | 是 | 邮件正文（纯文本） |\n| `inReplyTo` | string | 否 | 原邮件 Message-ID（用于回复时设置线程关联） |\n\n```bash\n# 发送邮件\ncurl -X POST \"https://email-worker.YOUR_SUBDOMAIN.workers.dev/api/emails/send\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\"from\": \"noreply@yourdomain.com\", \"to\": \"user@example.com\", \"subject\": \"Hello\", \"body\": \"你好！\"}'\n\n# 回复邮件（设置 inReplyTo 关联原邮件）\ncurl -X POST \"https://email-worker.YOUR_SUBDOMAIN.workers.dev/api/emails/send\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\"from\": \"noreply@yourdomain.com\", \"to\": \"user@example.com\", \"subject\": \"Re: Hello\", \"body\": \"收到，谢谢！\", \"inReplyTo\": \"\u003coriginal-message-id@example.com\u003e\"}'\n```\n\n\u003e **注意**：发送邮件需要 `from` 地址所在域名已在 Cloudflare [Email Routing](https://developers.cloudflare.com/email-routing/setup/) 中完成验证，详见[发送邮件文档](https://developers.cloudflare.com/email-routing/email-workers/send-email-workers/)。\n\n## 数据库结构\n\n| 字段 | 类型 | 说明 |\n|------|------|------|\n| `id` | INTEGER | 自增主键 |\n| `message_id` | TEXT | 邮件 Message-ID |\n| `sender` | TEXT | 发件人 |\n| `recipient` | TEXT | 收件人 |\n| `subject` | TEXT | 主题 |\n| `body` | TEXT | 正文内容 |\n| `received_at` | TEXT | 收件时间（ISO 8601） |\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2F3lang3%2Femail","html_url":"https://awesome.ecosyste.ms/projects/github.com%2F3lang3%2Femail","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2F3lang3%2Femail/lists"}