Files
mail/doc/003-config-separation.md
titor 52c5eb5ae8 feat: 重构配置文件格式并添加 IMAP ID 命令支持
- 配置文件分离:用户配置与项目配置分离,项目级配置(客户端信息、需要 ID 命令的 provider)放在代码中
- 新增 check_id 字段:用户可选择禁用单个账户的 ID 命令发送
- 简化 provider:只保留 163 和 QQ,移除未使用的 Gmail/Outlook/188 等
- 修复 163 邮箱收件箱问题:通过发送 IMAP ID 命令解决 Unsafe Login 错误

BREAKING CHANGE: 配置文件格式变化,旧配置不兼容
2026-04-10 00:39:06 +08:00

2.3 KiB
Raw Permalink Blame History

项目配置与用户配置分离讨论

日期: 2026-04-10

背景

在实现 IMAP ID 命令功能时需要在连接时发送客户端身份信息。这些信息name、version、vendor属于应用开发配置,而非用户运行时配置。

如果将这些信息放在用户配置文件中:

  • 用户可以看到但不需要修改这些"隐藏"配置
  • 暴露了应用内部实现细节
  • 用户可能误修改导致功能异常

讨论内容

配置文件分离

配置文件 用途 位置 内容
用户配置 运行时用户数据 ~/.config/pop/config.yml 账户、邮箱服务、默认行为
项目配置 应用开发相关 config/project.go 客户端信息、需要 ID 命令的 provider 集合

用户配置示例

from:
  account: work

defaults:
  encryption: ssl
  insecure: false

unsafe_html: false

accounts:
  - name: work
    email: foolsecret@163.com
    provider: "163"
    username: foolsecret@163.com
    password: xxx
    imap:
      host: imap.163.com
      port: 993
    smtp:
      host: smtp.163.com
      port: 465

项目配置示例 (config/project.go)

var ProjectConfig = struct {
    Info                       Info
    ProvidersNeedingCheckID    map[string]bool
}{
    Info: Info{
        Name:    "pop",
        Version: "1.0",
        Vendor:  "charmbracelet",
    },
    ProvidersNeedingCheckID: map[string]bool{
        "163": true,
        "QQ":  true,
    },
}

CheckID 覆盖机制

用户可以在账户级别覆盖 CheckID 行为:

accounts:
  - name: work
    check_id: false  # 禁用该账户的 ID 命令发送

逻辑优先级:

  1. 用户明确设置 check_id: false → 不发送
  2. 用户明确设置 check_id: true → 发送
  3. 未设置 → 使用项目配置的 ProvidersNeedingCheckID 判断

扩展场景

未来可以扩展项目配置:

  • 环境变量控制
  • 调试模式开关
  • 不同 provider 的特殊处理

结论

项目配置与用户配置分离是合理的架构设计:

  • 职责分离:开发者配置 vs 用户配置
  • 安全性:隐藏实现细节
  • 可维护性:修改项目配置不影响用户数据

待处理

  • 实现 config/project.go
  • 修改 config.go 移除敏感字段
  • 修改 imap.go 添加 ID 命令逻辑
  • 更新文档