102 lines
2.3 KiB
Markdown
102 lines
2.3 KiB
Markdown
|
|
# 项目配置与用户配置分离讨论
|
|||
|
|
|
|||
|
|
**日期**: 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 命令逻辑
|
|||
|
|
- [ ] 更新文档
|