Email 适配器
wesgine 的 Email 适配器为每个 Cell 提供邮箱账号管理和发送能力。
API 端点
GET /cells/{id}/email 邮箱账号列表
POST /cells/{id}/email 添加邮箱账号
DELETE /cells/{id}/email/{address} 删除邮箱账号
POST /cells/{id}/email/{address}/test SMTP 测试
Cell Handle
cell.Email() → EmailHandle
.List(ctx)
.Add(ctx, config)
.Delete(ctx, address)
.Test(ctx, address)
配额管理
Email 账号受 CellQuotas.MaxEmailAccounts 限制。
配额判据在唯一增长点 email.Store.PutAccount(INV-QUOTA-05):
- 适配器不知道 cap 数值,只收
QuotaFn(current, delta) error - 覆盖已有名字
delta=0(upsert 是编辑手势) - 卡在上限的 Cell 仍能轮换凭据
Seed Declaration(INV-SEED-01)
CellSpec.Email 是出生声明,不是常驻状态:
- 仅在 Cell 首次 boot 播种进
wes_email_configs - 此后存储是唯一权威
- 声明不再被读
这防止了运行时改的密码被声明覆盖。
IMAP 收信
IMAP 收信注册与温度 imapWarmnessCount 一律读存储(不读声明):
- 读声明会让 UI 新增的账号重启后收不到信
- 仅探测失败时退回声明作估计(偏多 = 钉住 Warm,安全一侧)
Per-Cell 隔离
每个 Cell 拥有独立的邮箱账号配置:
- Cell A 的邮箱不可被 Cell B 使用
- 企业部署中不同部门可配不同邮箱
反模式
| 禁止 | 正确做法 |
|---|---|
在 Cell.Start 校验 len(spec.Email) | 运行时在 PutAccount 校验 |
| 运行时读 CellSpec.Email 声明 | 读存储 |
| 跨 Cell 共享邮箱配置 | Per-Cell 独立 |