From f8bb80a8031938e2703d5fdb6d5fe6c1c0d53166 Mon Sep 17 00:00:00 2001 From: Erik Winter Date: Sat, 21 Aug 2021 11:03:30 +0200 Subject: [PATCH] fastmail imap double message fix --- pkg/mstore/imap.go | 14 +++++++++++++- pkg/mstore/mstore.go | 14 ++++++++++++++ 2 files changed, 27 insertions(+), 1 deletion(-) diff --git a/pkg/mstore/imap.go b/pkg/mstore/imap.go index 4dc4386..6857633 100644 --- a/pkg/mstore/imap.go +++ b/pkg/mstore/imap.go @@ -210,7 +210,19 @@ func (im *IMAP) Messages(folder string) ([]*Message, error) { return []*Message{}, fmt.Errorf("%w: %v", ErrIMAPServerProblem, err) } - return messages, nil + // for reasons yet unknown, with some imap providers (i.e. Fastmail) the code + // above sometimes returns the same message twice, but with a different uid. + dedupMessages := []*Message{} + for _, m := range messages { + for _, dm := range dedupMessages { + if m.Equal(dm) { + continue + } + } + dedupMessages = append(dedupMessages, m) + } + + return dedupMessages, nil } func (im *IMAP) Add(folder, subject, body string) error { diff --git a/pkg/mstore/mstore.go b/pkg/mstore/mstore.go index 51e82a1..3f9e3d9 100644 --- a/pkg/mstore/mstore.go +++ b/pkg/mstore/mstore.go @@ -23,6 +23,20 @@ func (m *Message) Valid() bool { return m.Uid != 0 && m.Subject != "" && m.Folder != "" } +func (m *Message) Equal(n *Message) bool { + if m.Folder != n.Folder { + return false + } + if m.Subject != n.Subject { + return false + } + if m.Body != n.Body { + return false + } + + return true +} + type MStorer interface { Folders() ([]string, error) Messages(folder string) ([]*Message, error)