diff options
author | René 'Necoro' Neumann <necoro@necoro.eu> | 2020-05-03 00:41:36 +0200 |
---|---|---|
committer | René 'Necoro' Neumann <necoro@necoro.eu> | 2020-05-03 00:41:36 +0200 |
commit | 168cce8a935de864eef95f423f128a7bf49aafda (patch) | |
tree | 9cc240dd479b1e85fbb55e1cda4a14d3a938d50e /internal/msg | |
parent | fec3ecd257c34fba37703b2999ab5ea902314657 (diff) | |
download | feed2imap-go-168cce8a935de864eef95f423f128a7bf49aafda.tar.gz feed2imap-go-168cce8a935de864eef95f423f128a7bf49aafda.tar.bz2 feed2imap-go-168cce8a935de864eef95f423f128a7bf49aafda.zip |
Update support for IMAP
Diffstat (limited to 'internal/msg')
-rw-r--r-- | internal/msg/msg.go | 64 |
1 files changed, 64 insertions, 0 deletions
diff --git a/internal/msg/msg.go b/internal/msg/msg.go new file mode 100644 index 0000000..c71ddaf --- /dev/null +++ b/internal/msg/msg.go @@ -0,0 +1,64 @@ +package msg + +import ( + "fmt" + + "github.com/Necoro/feed2imap-go/internal/imap" + "github.com/Necoro/feed2imap-go/pkg/log" +) + +// headers +const ( + VersionHeader = "X-Feed2Imap-Version" + ReasonHeader = "X-Feed2Imap-Reason" + IdHeader = "X-Feed2Imap-Item" +) + +type Messages []Message + +type Message struct { + Content string + IsUpdate bool + ID string +} + +func (m Messages) Upload(client *imap.Client, folder imap.Folder, reupload bool) error { + toStore := make([]string, 0, len(m)) + + msgs := make(chan Message, 5) + ok := make(chan bool) + go func() { + errHappened := false + for msg := range msgs { + if err := client.Replace(folder, IdHeader, msg.ID, msg.Content, reupload); err != nil { + log.Errorf("Error while updating mail with id '%s' in folder '%s'. Skipping.: %s", + msg.ID, folder, err) + errHappened = true + } + } + + ok <- errHappened + }() + + for _, msg := range m { + if !msg.IsUpdate { + toStore = append(toStore, msg.Content) + } else { + msgs <- msg + } + } + + close(msgs) + + putErr := client.PutMessages(folder, toStore) + updOk := <-ok + + if putErr != nil { + return putErr + } + if updOk { + return fmt.Errorf("Errors during updating mails.") + } + + return nil +} |