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

102 lines
2.3 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 项目配置与用户配置分离讨论
**日期**: 2026-04-10
## 背景
在实现 IMAP ID 命令功能时需要在连接时发送客户端身份信息。这些信息name、version、vendor属于**应用开发配置**,而非用户运行时配置。
如果将这些信息放在用户配置文件中:
- 用户可以看到但不需要修改这些"隐藏"配置
- 暴露了应用内部实现细节
- 用户可能误修改导致功能异常
## 讨论内容
### 配置文件分离
| 配置文件 | 用途 | 位置 | 内容 |
|---------|------|------|------|
| **用户配置** | 运行时用户数据 | `~/.config/pop/config.yml` | 账户、邮箱服务、默认行为 |
| **项目配置** | 应用开发相关 | `config/project.go` | 客户端信息、需要 ID 命令的 provider 集合 |
### 用户配置示例
```yaml
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)
```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 行为:
```yaml
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 命令逻辑
- [ ] 更新文档