npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2026 – Pkg Stats / Ryan Hefner

mails

v1.5.3

Published

Email infrastructure for AI agents

Downloads

2,529

Readme

mails

面向 AI Agent 的邮件基础设施。通过编程方式收发邮件。

npm license

English | 日本語

工作原理

                        发送                                        接收

  Agent                                               外部发件人
    |                                                   |
    |  mails send --to [email protected]                 |  发送邮件到 [email protected]
    |                                                   |
    v                                                   v
+--------+         +----------+              +-------------------+
|  CLI   |-------->|  Resend  |              | Cloudflare Email  |
|  /SDK  |         | (外部)  |              |     Routing       |
+--------+         +----------+              +-------------------+
    |                    ^                              |
    |  /v1/send          |  发送 API                    |  email() handler
    |  /api/send         |                              |
    v                    |                              v
+-----------------------------------------------------------+
|                       Worker                              |
|                                                           |
|  mails.dev(托管)            或      自己部署(自部署)     |
|  +-----------------------------------------+              |
|  |  +----------+    +----------------+     |  +---------+ |
|  |  |  db9.ai  |    |  fs9(文件)    |     |  |   D1    | |
|  |  | 全文搜索  |    | (附件存储)    |     |  | (存储) | |
|  |  | 高级查询  |    +----------------+     |  +---------+ |
|  |  +----------+                           |              |
|  +-----------------------------------------+              |
+-----------------------------------------------------------+
          |                           |
   通过 CLI/SDK 查询            mails sync
    (remote provider)       (拉取到本地)
          |                           |
          v                     +-----+------+
       Agent                    |            |
                          +---------+  +-----------+
                          | SQLite  |  |  db9.ai   |
                          | (本地) |  | (云端)   |
                          +---------+  +-----------+
                           离线查询     全文搜索
                           本地备份     高级过滤

特性

  • 发送邮件 — 通过 Resend,支持附件
  • 接收邮件 — 通过 Cloudflare Email Routing Worker
  • 搜索收件箱 — 按关键词搜索主题、正文、发件人、验证码
  • 验证码自动提取 — 自动从邮件中提取验证码(支持中/英/日/韩)
  • 附件 — CLI --attach 或 SDK 发送,Worker 自动解析 MIME 附件
  • 存储 Provider — 本地 SQLite、db9.ai 云端 PostgreSQL、或远程 Worker API
  • 零运行时依赖 — Resend provider 仅使用原生 fetch()
  • 托管服务 — 通过 mails claim 免费获取 @mails.dev 邮箱
  • 自部署 — 部署自己的 Worker,并使用 mailbox 级 token 鉴权

安装

npm install -g mails
# 或
bun install -g mails
# 或直接使用
npx mails

快速开始

托管模式 (mails.dev)

mails claim myagent                  # 免费认领 [email protected]
mails send --to [email protected] --subject "Hello" --body "World"  # 每月 100 封免费
mails inbox                          # 查看收件箱
mails inbox --query "密码"            # 搜索邮件
mails code --to [email protected]    # 等待验证码

无需 Resend key — 托管用户每月 100 封免费发件。无限发送请配置自己的 key:mails config set resend_api_key re_YOUR_KEY

自部署模式

cd worker && wrangler deploy             # 部署你自己的 Worker
wrangler secret put RESEND_API_KEY       # 在 Worker 上设置 Resend 密钥(用于发送)
# 单邮箱:
#   [email protected]
#   AUTH_TOKEN=YOUR_MAILBOX_TOKEN
# 多邮箱:
#   AUTH_TOKENS_JSON={"[email protected]":"token1","[email protected]":"token2"}
mails config set worker_url https://your-worker.example.com
mails config set worker_token YOUR_MAILBOX_TOKEN
mails config set mailbox [email protected]
mails send --to [email protected] --subject "Hello" --body "Hi"  # 通过 Worker 发送
mails inbox                              # 查询 Worker API
mails sync                               # 下载邮件到本地 SQLite

CLI 参考

claim

mails claim <name>                   # 认领 [email protected](每人最多 10 个)

send

mails send --to <email> --subject <subject> --body <text>
mails send --to <email> --subject <subject> --html "<h1>Hello</h1>"
mails send --from "Name <email>" --to <email> --subject <subject> --body <text>
mails send --to <email> --subject "Report" --body "See attached" --attach report.pdf

inbox

mails inbox                                  # 最近邮件列表
mails inbox --mailbox [email protected]         # 指定邮箱
mails inbox --query "password reset"         # 全文搜索(按相关性排序)
mails inbox --query "invoice" --direction inbound --limit 10
mails inbox <id>                             # 查看邮件详情 + 附件

# 高级过滤(mails.dev 托管 / db9)
mails inbox --has-attachments                # 只看带附件的邮件
mails inbox --attachment-type pdf            # 按附件类型过滤
mails inbox --from github.com               # 按发件人过滤
mails inbox --since 2026-03-01 --until 2026-03-20  # 时间范围
mails inbox --header "X-Mailer:sendgrid"    # 按邮件头过滤

# 任意组合
mails inbox --from github.com --has-attachments --since 2026-03-13
mails inbox --query "deploy" --attachment-type log --direction inbound

stats

mails stats senders                          # 按发件人频率排行

code

mails code --to [email protected]              # 等待验证码(默认 30 秒)
mails code --to [email protected] --timeout 60 # 自定义超时

验证码输出到 stdout,方便管道使用:CODE=$(mails code --to [email protected])

config

mails config                    # 查看所有配置
mails config set <key> <value>  # 设置配置项
mails config get <key>          # 获取配置项

sync

mails sync                              # 从 Worker 同步邮件到本地存储
mails sync --since 2026-03-01           # 从指定日期同步
mails sync --from-scratch               # 全量重新同步

从 Worker(托管或自部署)拉取邮件到本地 SQLite。适用于离线访问或本地备份。

SDK 用法

import { send, getInbox, searchInbox, waitForCode } from 'mails'

// 发送
const result = await send({
  to: '[email protected]',
  subject: 'Hello',
  text: 'World',
})

// 发送附件
await send({
  to: '[email protected]',
  subject: 'Report',
  text: 'See attached',
  attachments: [{ path: './report.pdf' }],
})

// 收件箱列表
const emails = await getInbox('[email protected]', { limit: 10 })

// 搜索收件箱(全文搜索,按相关性排序)
const results = await searchInbox('[email protected]', {
  query: 'password reset',
  direction: 'inbound',
})

// 高级过滤(mails.dev 托管 / db9)
const pdfs = await getInbox('[email protected]', {
  has_attachments: true,
  attachment_type: 'pdf',
  since: '2026-03-01',
})

// 等待验证码
const code = await waitForCode('[email protected]', { timeout: 30 })
if (code) console.log(code.code) // "123456"

Email Worker

worker/ 目录包含用于接收邮件的 Cloudflare Email Routing Worker。

部署

cd worker
bun install
wrangler d1 create mails
# 编辑 wrangler.toml — 设置你的 D1 数据库 ID
wrangler d1 execute mails --file=schema.sql
wrangler deploy

然后在 Cloudflare Email Routing 中配置转发到该 Worker。

安全配置

# 单邮箱:
#   [email protected]
#   AUTH_TOKEN=YOUR_MAILBOX_TOKEN
# 多邮箱:
#   AUTH_TOKENS_JSON={"[email protected]":"token1","[email protected]":"token2"}

所有 /api/* 端点都需要 Authorization: Bearer <mailbox-token>。这个 token 必须和 ?to=、被读取的邮件、或发送时的 from 邮箱一致。/health 始终公开。若未配置 mailbox token,访问 /api/* 会返回 503

Worker API

| 端点 | 说明 | |------|------| | GET /api/inbox?to=<addr>&limit=20 | 邮件列表 | | GET /api/inbox?to=<addr>&query=<text> | 搜索邮件 | | GET /api/code?to=<addr>&timeout=30 | 长轮询等待验证码 | | GET /api/email?id=<id> | 邮件详情(含附件) | | POST /api/send | 通过 Resend 发送邮件(需要 RESEND_API_KEY) | | GET /api/sync?to=<addr>&since=<iso> | 增量邮件同步(含附件) | | GET /health | 健康检查(始终公开) |

存储 Provider

CLI 自动检测存储 Provider:

  • 配置了 api_key → 远程(mails.dev 托管)
  • 配置了 worker_url → 远程(自部署 Worker)
  • 否则 → 本地 SQLite

SQLite(默认)

本地数据库,路径 ~/.mails/mails.db。零配置。

db9.ai

面向 AI Agent 的云端 PostgreSQL。支持全文搜索(按相关性排序)、附件内容搜索和高级过滤。

mails config set storage_provider db9
mails config set db9_token YOUR_TOKEN
mails config set db9_database_id YOUR_DB_ID

使用 db9 后可获得:

  • 加权全文搜索 — 主题(最高权重)> 发件人 > 正文 > 附件文本
  • 附件过滤 — 按类型、按名称、有/无附件
  • 发件人 & 时间过滤--from--since--until
  • 邮件头查询 — 搜索 JSONB 邮件头
  • 发件人统计 — 所有发件人的频率排行

Remote(Worker API)

直接查询 Worker HTTP API。配置了 api_keyworker_url 时自动启用。

配置项

| 键 | 默认值 | 说明 | |---|--------|------| | mailbox | | 接收邮箱地址 | | api_key | | mails.dev 托管服务 API key | | worker_url | | 自部署 Worker URL | | worker_token | | 自部署 Worker 的 mailbox token | | resend_api_key | | Resend API 密钥 | | default_from | | 默认发件人地址 | | storage_provider | auto | sqlitedb9remote |

测试

bun test              # 单元 + E2E 测试(无需外部依赖)
bun test:coverage     # 附带覆盖率报告
bun test:live         # 实时 E2E 测试(需要 .env 配置)
bun test:all          # 全部测试(包括实时 E2E)

198 个单元测试 + 27 个 E2E 测试 = 225 个测试,覆盖全部 Provider。

各 Provider E2E 覆盖情况

| | SQLite | db9 | Remote (OSS) | Remote (托管) | |---------------------------|--------|-------|--------------|---------------| | 存储 inbound 邮件 | ✅ | ✅ | N/A | N/A | | 存储邮件 + 附件 | ✅ | ✅ | N/A | N/A | | 发送 → 接收(真实链路) | ✅ | — | ✅ | ✅ | | 收件箱列表 | ✅ | ✅ | ✅ | ✅ | | has_attachments 标记 | ✅ | ✅ | ✅ | ✅ | | 方向过滤 | ✅ | ✅ | ✅ | ✅ | | 分页 | ✅ | ✅ | ✅ | ✅ | | 邮件详情 | ✅ | ✅ | ✅ | ✅ | | 附件元数据 | ✅ | ✅ | ✅ | ✅ | | 搜索 | ✅ | ✅ | ✅ | ✅ | | 附件内容搜索 | ✅ | ✅ | — | — | | 验证码 | ✅ | ✅ | ✅ | ✅ | | 附件下载 | ✅ | ✅ | — | ✅ | | 保存到磁盘 (--save) | ✅ | — | — | ✅ | | 邮箱隔离 | ✅ | ✅ | — | — | | Outbound 记录 | ✅ | — | ✅ | N/A | | 通过 Worker 发送 (/api/send)| — | — | ✅ | — | | 同步到本地 | — | — | ✅ | — |

许可证

MIT