OmniMail 文档 概览 API 端点目录 架构 凭据 更新日志 GitHub Web 1.2.0 · 024e150

NAVER Mail 接入计划

本文保留初版方案记录。当前实现已移除 IMAP 环境开关:有效邮箱密钥即可启用,入口默认显示, 系统设置只控制显示。本计划中的部署开关和默认关闭策略已废弃;部署请遵循 设置指南。

1. 目标与成功标准

在不影响 OmniMail 主邮箱及现有 iCloud、Gmail、Microsoft、QQ 和 Linux DO Mail 工作区的 前提下,允许当前登录用户连接自己有权访问的个人 NAVER Mail,并在独立工作区中完成:

  1. 使用个人 @naver.com 地址和 NAVER 生成的应用专用密码验证并保存账号。
  2. 聚合当前用户的多个 NAVER 账号,后台同步有限的 INBOX 元数据。
  3. 支持账号范围切换、元数据搜索、稳定游标分页、按需正文和附件读取。
  4. 正文成功读取后,使用独立且可降级的 IMAP 会话尝试同步远端已读状态。
  5. 凭据、账号、索引、审计和 API 全程按 OmniMail 用户隔离。
  6. 单个 NAVER 账号故障不能阻断其他账号或其他邮件工作区。

首版完成必须同时满足:

SMTP 发信不作为 IMAP 首版完成条件。只有独立 SMTP 验收通过后才开放发信入口。

2. 官方要求与已确认参数

实施时必须再次以 NAVER 官方帮助中心为准。2026-08-28 调研结果如下:

项目 官方要求或参数
支持范围 本计划只支持个人 @naver.com 邮箱
IMAP 主机 imap.naver.com
IMAP 端口 993,直接 SSL/TLS
SMTP 主机 smtp.naver.com
SMTP 首选端口 587,TLS/STARTTLS
SMTP 备选端口 465,直接 SSL/TLS;只作为实测后的兼容方案
IMAP/SMTP 开关 用户必须在 NAVER Mail 设置中启用 IMAP/SMTP
账号安全 必须先开启 NAVER 两步验证
密码字段 必须使用应用专用密码,不能使用 NAVER 登录密码
用户名 官方客户端指南要求使用 NAVER ID;实现时由邮箱本地部分派生并实测确认

自 2025-11-19 起,NAVER 已结束旧登录密码的过渡期,POP3/IMAP/SMTP 连接需要两步验证和 应用专用密码。应用专用密码生成后不能再次查看;禁用两步验证会一并删除已生成的应用密码。

NAVER 还说明:如果连续 90 天存在异常登录尝试,或外部应用连接状态异常,IMAP/SMTP 可能被 自动改为停用。因此,阶段 0 必须从真实生产 Worker 验证动态出口 IP、重复登录频率和长期稳定性, 不能只依据本机测试判断可上线。

官方资料:

3. Cloudflare 可行性结论

3.1 无凭据远程探测结果

2026-08-28 已从 Cloudflare Wrangler 远程预览环境执行不带账号和密码的协议探测:

探测项 结果
imap.naver.com:993 直接 TLS 成功
IMAP greeting 与 CAPABILITY 成功,声明 IMAP4rev1 和 ID
smtp.naver.com:465 直接 TLS + EHLO 成功,声明认证能力
smtp.naver.com:587 明文 greeting + STARTTLS + TLS 后 EHLO 成功,声明认证能力

探测没有提交 NAVER ID、邮箱或应用专用密码,也没有部署生产 Worker。临时诊断文件和远程会话 已清理。

这证明 Cloudflare Workers 的 TCP/TLS 能力与 NAVER 公开端点兼容,但不能证明真实登录一定 通过。Cloudflare 说明 connect() 的出站 TCP 地址来自未包含在其公开 IP 列表中的地址前缀, 因此 NAVER 仍可能针对某些出口或地区触发风控。

3.2 当前 go/no-go 判断

目前结论是“可以进入真实账号验证”,不是“可以直接开发上线”。只有阶段 0 全部通过后,才允许 增加 D1 表、API 和 UI。

如果真实 NAVER 应用密码在本机成功、但在 Cloudflare Worker 持续失败,处理方式应与网易问题 一致:停止纯 Worker 方案,另行评估固定出口连接器。不得加入用户自定义代理、任意 IMAP 主机、 关闭证书校验或绕过 NAVER 风控的代码。

4. 范围假设与产品决策

决策项 推荐默认值 说明
账号类型 仅个人 @naver.com NAVER Works、团体账号、企业域名需单独调研
工作区 独立“NAVER Mail”入口 不混入 OmniMail 主收件箱
多账号 支持 不预设产品上限,受同步和风控容量约束
同步范围 仅 INBOX,有限元数据 不做全量历史镜像或完整文件夹树
远端写操作 仅正文打开后尝试标记 \Seen 不删除、移动、归档或管理文件夹
发信 第二阶段 IMAP 稳定性验证通过后再开放 SMTP
登录方式 NAVER ID + 应用专用密码 不接收 NAVER 主密码,不做网页登录自动化
客户端 仅 Web Android 与浏览器扩展分别立项

明确不在本计划范围内:

5. 阶段 0:真实账号协议验证

这是强制 go/no-go 阶段。准备一个专门联调、可随时撤销应用密码的个人 NAVER 测试账号。 凭据只能通过交互式 Secret 或临时请求内存传入,不得写入仓库、命令历史、日志、截图、D1 或 R2。

5.1 用户侧准备

  1. 在 NAVER 手机应用中开启两步验证。
  2. 在 NAVER Mail PC 设置中启用 IMAP/SMTP。
  3. 为 OmniMail 单独生成应用专用密码并当场保存。
  4. 不复用已用于其他客户端的应用密码。
  5. 准备可识别的普通邮件、HTML 邮件、中文/韩文主题、附件和内嵌图片样本。

5.2 IMAP 验证矩阵

从实际部署的测试 Worker 执行:

  1. 建立 imap.naver.com:993 TLS 连接,使用默认严格证书校验。
  2. 读取 greeting 并执行 CAPABILITY。
  3. 分别确认官方要求的 NAVER ID 登录形式;不要静默尝试多种用户名导致风控。
  4. 使用应用专用密码执行一次 LOGIN。
  5. 根据能力执行固定客户端信息的 ID,确认是否必需或允许。
  6. EXAMINE INBOX,确认 UIDVALIDITY、UIDNEXT、EXISTS 返回形式。
  7. 有界执行 UID SEARCH / UID FETCH,读取少量标准元数据。
  8. 使用 BODY.PEEK[] 读取一封正文,确认不会提前标记已读。
  9. 对专用测试邮件执行一次精确的 UID STORE ... +FLAGS.SILENT (\Seen)。
  10. 验证普通附件、韩文/中文文件名、内嵌图片和 MIME 边界。
  11. 撤销应用密码后确认错误可识别为凭据失效;新密码验证成功后确认可恢复。

5.3 稳定性验证

5.4 SMTP 验证矩阵

IMAP 稳定后再执行:

  1. 优先连接 smtp.naver.com:587,执行 EHLO、STARTTLS、TLS 后再次 EHLO。
  2. 确认实际支持的认证机制,并使用应用专用密码登录。
  3. 只向测试收件地址发送纯文本、HTML、回复和小附件样本。
  4. 验证发件地址必须与登录账号一致;不支持任意 From。
  5. 验证 421 临时错误、IP block、频率限制、535 凭据错误和投递结果不确定。
  6. 仅当 587 在生产 Worker 不稳定且 NAVER 官方仍明确支持时,测试 465 直接 TLS 作为备选。

5.5 通过条件

只有以下条件全部满足才进入业务实现:

6. 推荐架构

Web NaverMailWorkspace
  ├─ NaverMailAccountDialog:连接、验证、更新应用密码、断开
  ├─ NaverMailScopeSwitcher:全部 NAVER / 单账号
  ├─ NaverMailSearchField:D1 元数据搜索
  ├─ 聚合列表与稳定 keyset 分页
  └─ NaverMailReader:按需正文、附件与已读反馈

Worker /api/naver-mail
  ├─ naver-mail-account-api.ts:账号操作
  ├─ naver-mail-message-api.ts:列表、正文、附件
  ├─ naver-mail-credentials.ts:应用密码加解密
  ├─ naver-mail-imap.ts:固定 NAVER IMAP 协议
  ├─ naver-mail-store.ts:用户作用域数据访问
  ├─ naver-mail-sync.ts:Queue/Cron、租约和有限索引
  └─ naver-mail-smtp.ts:第二阶段受控 SMTP

Cloudflare
  ├─ D1:账号、有限元数据索引、验证频率状态
  ├─ Queue:连接、手动和定时同步任务
  ├─ Cron:复用现有调度入口,按 15 分钟账号周期筛选
  └─ Secret:NAVER_MAIL_CREDENTIALS_KEY

NAVER 邮件不写入主邮箱 messages 表。原始 MIME、正文和附件不复制到 D1 或 R2,正文与附件 按需从 NAVER 读取。

7. 现有代码复用与最小改动

7.1 可直接复用

7.2 不能直接复制

7.3 SMTP STARTTLS 最小扩展

当前共享 ControlledSmtpClient 固定使用直接 TLS,无法正确实现官方首选的 587 STARTTLS。第二阶段 只增加一个明确的传输选项:

transport: 'tls' | 'starttls'

starttls 流程必须是:明文连接 → greeting → EHLO → 确认 STARTTLS → STARTTLS 命令 → socket.startTls() → 重建 reader/writer → 再次 EHLO → AUTH。QQ 和 Linux DO Mail 保持现有 tls 默认值,现有行为和测试不能改变。

8. 标准 IMAP 协议边界

邮件身份使用:

account_id + uid_validity + imap_uid

Message-ID 仅为辅助字段,不能作为唯一键。UIDVALIDITY 变化时清除该账号旧 UID 索引并执行 有限重建,不能将新 UID 映射到旧正文。

9. D1 数据设计

使用 NAVER 专用表。迁移编号在真正开始实现时依据目标分支最新状态分配,本计划不预占编号, 避免与保留中的网易邮箱分支发生迁移号冲突。

9.1 naver_mail_accounts

建议字段:

约束和索引:

9.2 naver_mail_messages

保存有限 INBOX 元数据:账号、UID、UIDVALIDITY、Message-ID、发件人、收件人、抄送、主题、 预览、时间、大小、Flags、已读、星标和附件标记。

约束和索引:

9.3 naver_mail_validation_limits

沿用现有验证限速模型,以 user_id + IP 的哈希身份为键,只保存窗口、次数和更新时间。不得保存 完整 IP、NAVER ID、邮箱或应用专用密码。

10. 凭据和输入安全

11. 同步和读取策略

11.1 首次同步

  1. 获取账号同步租约。
  2. EXAMINE INBOX 并读取 UID 边界。
  3. 从 UIDNEXT 向前按有限 UID 区间搜索,最多收集最新 100 封。
  4. 每批最多 20 个 UID,读取标准元数据和 BODYSTRUCTURE。
  5. Upsert D1 元数据,更新游标、同步时间和下次同步时间。
  6. 不下载完整正文或附件。

11.2 增量同步

11.3 正文、附件与已读

12. API 草案

方法与路径 用途
GET /api/naver-mail/accounts 返回功能状态和当前用户账号,不返回凭据
POST /api/naver-mail/accounts 验证 IMAP、加密保存并加入首次同步
PATCH /api/naver-mail/accounts/{id} 修改展示名称
PUT /api/naver-mail/accounts/{id}/app-password 验证成功后替换应用专用密码
DELETE /api/naver-mail/accounts/{id} 删除本地账号、密文和索引
POST /api/naver-mail/accounts/{id}/verify 使用已保存凭据重新验证
POST /api/naver-mail/accounts/{id}/sync 受限请求异步同步
GET /api/naver-mail/messages 聚合列表、账号筛选、搜索和 cursor 分页
GET /api/naver-mail/accounts/{accountId}/messages/{messageId} 按需正文并尝试同步已读
GET /api/naver-mail/accounts/{accountId}/messages/{messageId}/attachments/{partId} 下载受限附件
POST /api/naver-mail/accounts/{accountId}/messages 第二阶段受控 SMTP 发信

连接请求草案:

{
  "name": "Personal NAVER Mail",
  "email": "owner@naver.com",
  "appPassword": "NAVER 生成的应用专用密码"
}

消息搜索仅覆盖 D1 已保存的发件人、收件人、抄送和主题元数据,不暗示支持正文全文搜索。

13. Web、配置与运维

13.1 Web 工作区

13.2 功能开关

公开配置必须区分部署能力是否可用和管理员是否允许显示。

13.3 错误分类

建议至少包括:

前端不得展示 NAVER 原始协议响应。管理员日志只记录内部账号 ID、错误类别、阶段、耗时和 Cloudflare 区域,不记录用户凭据或邮件内容。

13.4 回滚

  1. 设置 NAVER_MAIL_IMAP_ENABLED=false,停止入口和新任务。
  2. 让已消费任务自然结束,不删除 D1 表中断执行。
  3. 保留账号密文和索引,修复后可恢复;用户主动断开时才级联删除。
  4. D1 迁移保持前向兼容,回滚 Worker 时不执行破坏性 DROP。

14. 测试计划

14.1 单元与 Worker 测试

14.2 API、UI 与 E2E

14.3 验证命令

npm run docs:api
npm run check
npm test
npm run test:worker
npm run build
npm run test:e2e -- e2e/naver-mail-workspace.e2e.ts

任何自动化测试都不能连接真实 NAVER;真实账号只用于阶段 0 和发布验收。

15. 分阶段实施顺序

阶段 A:真实协议闸门

阶段 B:只读 IMAP MVP

阶段 C:生产灰度

阶段 D:SMTP 发信

阶段 E:文档与发布

16. 合并前检查清单

17. 最终建议

NAVER Mail 值得继续推进。与网易邮箱不同,Cloudflare 远程环境已经完成 IMAP 和两种 SMTP 加密握手,官方也明确提供应用专用密码,技术路径清晰。当前唯一不能跳过的不确定性是:真实应用 密码从 Cloudflare 动态 TCP 出口登录时是否长期稳定。

因此推荐先完成阶段 A,再决定是否编写业务代码。若阶段 A 通过,首版应保持“个人 @naver.com + 有限 INBOX + 按需正文/附件”的最小范围;SMTP 独立后置。若阶段 A 失败,保留 本计划和脱敏测试结论,不把不稳定功能合并到 main。