用例:我們有一個郵箱,我們可以在其中接收來自客戶的郵件。在進一步處理之前,我必須檢查它們是否符合協議(主題必須匹配正則表達式,每封郵件只有一個附件等)我有以下申請:import ( "fmt" "imaptest/src/db" "io" "log" "path/filepath" "strings" "github.com/emersion/go-imap" "github.com/emersion/go-imap/client" "github.com/emersion/go-message" "github.com/iglin/go-config")(...)//Channel for the messagesmessages := make(chan *imap.Message, 10)//Channel for retrieve if an error appeareddone := make(chan error, 1)go func() { seqset := new(imap.SeqSet) seqset.AddRange(1, mbox.Messages) //Fetch the messages and push them into the channel done <- c.Fetch(seqset, []imap.FetchItem{imap.FetchEnvelope, imap.FetchRFC822}, messages)}()//SeqSet for invalid messagesseqsetErrorMessages := new(imap.SeqSet)//SeqSet for valid messagesseqsetValidMessages := new(imap.SeqSet)for msg := range messages { //Different checks like are there attachments //Matches the subject with a specific regex if isMessageValid(msg) { //Message is valid seqsetValidMessages.AddNum(msg.SeqNum) } else { //Message is invalid seqsetErrorMessages.AddNum(msg.SeqNum) }}//Check if there was an error when fetching the messagesif err := <-done; err != nil { log.Fatal(err)}//Move all invalid messages to errorif !seqsetErrorMessages.Empty() { if err := c.Move(seqsetErrorMessages, FOLDER_ERROR); err != nil { log.Fatalf("Error on move to %s: %v", FOLDER_ERROR, err) }}//Move all valid messages to toExportif !seqsetValidMessages.Empty() { if err := c.Move(seqsetValidMessages, FOLDER_OUT); err != nil { log.Fatalf("Error on move to %s: %v", FOLDER_OUT, err) }}FOLDER_OUT 和 FOLDER_ERROR 是此郵箱中現有文件夾的常量字符串。在源文件夾的所有郵件都有效(或無效)的情況下,一切都很好,所有郵件都被移動了。但是如果我遇到同時存在有效郵件和無效郵件的情況,我會收到以下錯誤:移動到錯誤時出錯:指定的消息集無效。我還嘗試使用“msg.Uid”和“c.UidMove()”代替“msg.Seqnum”和“c.Move()”,但這會導致相同的結果。這怎么能解決?
1 回答

森欄
TA貢獻1810條經驗 獲得超5個贊
使用 UID 是此處的正確答案,但請確保您有 UID?!?,4,9”作為 MSN 集和 UID 集均有效,但兩者不可互換。您不能從服務器請求 MSN 集,然后將其與 UID 命令一起使用。
如果郵箱中恰好有兩封郵件,并且您想將其中第一封移至 FOLDER_ERROR,將第二封移至 FOLDER_OUT,那么您看到的問題很容易解釋。您發送一條命令“將郵箱中的第一條消息移至 FOLDER_ERROR”,服務器會執行此操作。然后你發送“將郵箱中的第二條消息移至 FOLDER_OUT”,服務器告訴你“此郵箱中只有一條消息,沒有我可以移動的第二條消息”。
使用 UID 可以解決這個問題,因為它們是穩定的。無論您移動了哪些其他消息,消息都會保留其 UID。
- 1 回答
- 0 關注
- 214 瀏覽
添加回答
舉報
0/150
提交
取消