From 382abe55ac110c83927346b6c299b5627eb7be1b Mon Sep 17 00:00:00 2001 From: smail Date: Sun, 6 Sep 2026 07:50:11 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E5=A4=8DIMAP=E5=8A=A8=E6=80=81UID?= =?UTF-8?q?=E5=8F=96=E5=80=BC=E9=80=82=E9=85=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- backend/listen/imap_server/session_fetch.go | 25 +++++++++++++++++++-- 1 file changed, 23 insertions(+), 2 deletions(-) diff --git a/backend/listen/imap_server/session_fetch.go b/backend/listen/imap_server/session_fetch.go index 20adc6f..6b6331d 100644 --- a/backend/listen/imap_server/session_fetch.go +++ b/backend/listen/imap_server/session_fetch.go @@ -143,10 +143,31 @@ func (s *serverSession) Fetch(w *imapserver.FetchWriter, numSet imap.NumSet, opt case imap.UIDSet: uidSet := numSet.(imap.UIDSet) + maxUID := 0 + if uidSet.Dynamic() { + var err error + maxUID, err = list.GetMaxUIDByMailbox(s.ctx, s.currentMailbox) + if err != nil { + log.WithContext(s.ctx).WithError(err).Error("query IMAP maximum UID for fetch failed") + return &imap.Error{Type: imap.StatusResponseTypeNo, Text: "Fetch failed"} + } + } for _, uid := range uidSet { + start := cast.ToInt(uint32(uid.Start)) + end := cast.ToInt(uint32(uid.Stop)) + if uid.Stop == 0 { + if uid.Start == 0 { + start = maxUID + end = maxUID + } else if maxUID == 0 || uid.Start > imap.UID(maxUID) { + continue + } else { + end = maxUID + } + } emailList, err := list.GetEmailListByGroup(s.ctx, s.currentMailbox, list.ImapListReq{ - Star: cast.ToInt(uint32(uid.Start)), - End: cast.ToInt(uint32(uid.Stop)), + Star: start, + End: end, }, true) if err != nil { log.WithContext(s.ctx).WithError(err).Error("query IMAP messages for UID fetch failed")