fix(imap): UIDVALIDITY 改为持久化随机值,修复数据库重建后客户端缓存永不失效
根因:Status() 硬编码 UidValidity=1。数据库重建后消息 ID 空间 完全变化(uid 2-166 对应完全不同的邮件),但 UIDVALIDITY 不变, Thunderbird 认为本地缓存(旧 uid 1-166)仍然有效,只下载"新增" (uid 167:*)与"缺失"(2,4,8,9)的少数邮件——列表只剩 1-3 封, 每次刷新数量随机。 修复(RFC 3501 UIDVALIDITY 语义):新增 mailbox_states 表, 每(用户,文件夹)首次访问随机生成并持久化 UIDVALIDITY;数据库 重建后新值触发客户端丢弃缓存全量重同步。0 值修正,不同用户/ 文件夹互相独立。 新增 TestMailboxStateUidValidity 单元测试。
This commit is contained in:
@@ -170,3 +170,21 @@ type Attachment struct {
|
||||
func (Attachment) TableName() string {
|
||||
return "attachments"
|
||||
}
|
||||
|
||||
// MailboxState 记录每个邮箱(用户+文件夹)的持久化 IMAP 状态。
|
||||
// UidValidity 在首次访问时随机生成并持久化:数据库重建(消息 ID 空间
|
||||
// 变化)后该值随之改变,客户端(Thunderbird 等)会据此丢弃本地缓存
|
||||
// 并全量重新同步。此前硬编码为 1,数据库重建后客户端缓存永不失效,
|
||||
// 导致只显示/下载少量"缺失"邮件。
|
||||
type MailboxState struct {
|
||||
UserID uint `gorm:"primaryKey" json:"user_id"`
|
||||
Folder string `gorm:"primaryKey;size:64" json:"folder"`
|
||||
UidValidity uint32 `gorm:"not null" json:"uid_validity"`
|
||||
CreatedAt time.Time
|
||||
UpdatedAt time.Time
|
||||
}
|
||||
|
||||
// TableName specifies the table name for MailboxState.
|
||||
func (MailboxState) TableName() string {
|
||||
return "mailbox_states"
|
||||
}
|
||||
Reference in New Issue
Block a user