fix(imap): 升级 go-imap v2 + \Deleted 落库,修复删除邮件只复制到垃圾桶
删除流程(Apple Mail/iOS 等):UID COPY→Trash + UID STORE \Deleted + UID EXPUNGE。此前 go-imap v1.2.1 不支持 UID EXPUNGE(回 Command unsupported with UID),且 \Deleted 只存内存会话 map(重选/ 重连即丢失),导致 EXPUNGE 不删原邮件——垃圾桶只有副本、INBOX 原封 不动。 - 依赖:go-imap v1.2.1 → go-imap/v2 v2.0.0-beta.8(原生支持 UID EXPUNGE,且库为 race-clean,移除集成测试 !race 标签) - Message 新增 IsDeleted 字段持久化 \Deleted 标记(AutoMigrate 自动 加列,SQLite/MySQL 通用;migrate 工具随模型字段自动复制) - IMAP 层重写为 v2 imapserver.Session 架构(session.go 替代 backend.go):SELECT/STATUS/LIST/FETCH/SEARCH/STORE/COPY/MOVE/ APPEND/EXPUNGE/Poll/Idle;EXPUNGE 按数据库 IsDeleted 删除,UID EXPUNGE 只删集合内已标记消息 - server.go:显式能力集(IMAP4rev1+UIDPLUS+MOVE+LITERAL++CHILDREN+ SPECIAL-USE);自实现 mailboxHub 跨会话推送(含来源排除,避免 v2 库 MailboxTracker 对 EXPUNGE/EXISTS 的回声重复响应);Pusher 接口 签名不变,Web/SMTP/POP3 调用方零改动;DisconnectByAddr 改用会话 注册表 + conn.Bye() - 测试:集成测试改用 v2 imapclient,新增删除流程/跨会话持久化/MOVE 回归用例;notify_test 适配 hub 推送模型并覆盖来源排除与 allowExpunge 语义
This commit is contained in:
@@ -83,8 +83,8 @@ mail_go/
|
||||
│ ├── smtp_server/
|
||||
│ │ └── server.go # SMTP 服务端(go-smtp Backend 实现)
|
||||
│ ├── imap_server/
|
||||
│ │ ├── server.go # IMAP 服务端启动
|
||||
│ │ └── backend.go # go-imap Backend/User/Mailbox/Message 实现
|
||||
│ │ ├── server.go # IMAP 服务端启动(监听器/能力/跨会话推送)
|
||||
│ │ └── session.go # go-imap/v2 imapserver.Session 实现
|
||||
│ ├── pop3_server/
|
||||
│ │ └── server.go # POP3 服务端(TCP 监听 + 文本协议)
|
||||
│ ├── web/
|
||||
@@ -373,11 +373,11 @@ func (s *smtpSession) Logout() error
|
||||
#### IMAP Backend 接口(go-imap/v2 要求)
|
||||
|
||||
```go
|
||||
// internal/imap_server/backend.go
|
||||
// internal/imap_server/session.go
|
||||
|
||||
// 实现 go-imap/v2 的 backend.Backend 接口
|
||||
type imapBackend struct {
|
||||
userStore store.UserStore
|
||||
// 实现 go-imap/v2 的 imapserver.Session 接口
|
||||
type imapSession struct {
|
||||
stores *store.Stores
|
||||
mailStore store.MailStore
|
||||
domainStore store.DomainStore
|
||||
attStore store.AttachmentStore
|
||||
@@ -557,7 +557,7 @@ sequenceDiagram
|
||||
| Task ID | 任务名称 | 依赖 | 涉及文件 | 优先级 |
|
||||
|---------|---------|------|---------|--------|
|
||||
| T01 | 项目基础设施:go.mod + 入口 + 配置系统 + 数据库层 | — | go.mod, main.go, config/config.go, config/defaults.go, internal/db/db.go, internal/db/models.go, internal/store/*.go | P0 |
|
||||
| T02 | 邮件协议服务端(SMTP + IMAP + POP3) | T01 | internal/smtp_server/server.go, internal/imap_server/server.go, internal/imap_server/backend.go, internal/pop3_server/server.go | P0 |
|
||||
| T02 | 邮件协议服务端(SMTP + IMAP + POP3) | T01 | internal/smtp_server/server.go, internal/imap_server/server.go, internal/imap_server/session.go, internal/pop3_server/server.go | P0 |
|
||||
| T03 | Web 服务核心:路由 + 中间件 + 认证 + 邮件页面 | T01 | internal/web/server.go, internal/web/middleware/auth.go, internal/web/middleware/admin.go, internal/web/handlers/auth.go, internal/web/handlers/mail.go | P0 |
|
||||
| T04 | 管理后台 + 附件存储 + 模板 | T01, T03 | internal/web/handlers/admin.go, internal/storage/attachment.go, internal/web/templates/*.html | P0 |
|
||||
| T05 | 集成调试 + 安装脚本 | T02, T03, T04 | main.go(更新), scripts/install.sh | P1 |
|
||||
@@ -614,7 +614,7 @@ go 1.22
|
||||
|
||||
require (
|
||||
github.com/emersion/go-smtp v0.21.0
|
||||
github.com/emersion/go-imap/v2 v2.0.0-beta.5
|
||||
github.com/emersion/go-imap/v2 v2.0.0-beta.8
|
||||
github.com/emersion/go-message v0.18.0
|
||||
github.com/gin-gonic/gin v1.10.0
|
||||
github.com/gin-contrib/sessions v0.0.5
|
||||
|
||||
Reference in New Issue
Block a user