diff --git a/lib/msgstore.go b/lib/msgstore.go index 3c77c49..c6cd2c3 100644 --- a/lib/msgstore.go +++ b/lib/msgstore.go @@ -1,6 +1,8 @@ package lib import ( + "time" + "github.com/emersion/go-imap" "github.com/mohamedattahri/mail" @@ -91,10 +93,22 @@ func (store *MessageStore) FetchBodies(uids []uint32, func (store *MessageStore) merge( to *types.MessageInfo, from *types.MessageInfo) { - // TODO: Merge more shit + if from.BodyStructure != nil { + to.BodyStructure = from.BodyStructure + } if from.Envelope != nil { to.Envelope = from.Envelope } + if len(from.Flags) != 0 { + to.Flags = from.Flags + } + if from.Size != 0 { + to.Size = from.Size + } + var zero time.Time + if from.InternalDate != zero { + to.InternalDate = from.InternalDate + } } func (store *MessageStore) Update(msg types.WorkerMessage) { diff --git a/worker/imap/fetch.go b/worker/imap/fetch.go index 884ab73..d229126 100644 --- a/worker/imap/fetch.go +++ b/worker/imap/fetch.go @@ -12,6 +12,7 @@ func (imapw *IMAPWorker) handleFetchMessageHeaders( imapw.worker.Logger.Printf("Fetching message headers") items := []imap.FetchItem{ + imap.FetchBodyStructure, imap.FetchEnvelope, imap.FetchInternalDate, imap.FetchFlags, @@ -57,10 +58,11 @@ func (imapw *IMAPWorker) handleFetchMessages( }, nil) } else { imapw.worker.PostMessage(&types.MessageInfo{ - Envelope: _msg.Envelope, - Flags: _msg.Flags, - InternalDate: _msg.InternalDate, - Uid: _msg.Uid, + BodyStructure: _msg.BodyStructure, + Envelope: _msg.Envelope, + Flags: _msg.Flags, + InternalDate: _msg.InternalDate, + Uid: _msg.Uid, }, nil) } } diff --git a/worker/types/messages.go b/worker/types/messages.go index f38bb22..b1d1485 100644 --- a/worker/types/messages.go +++ b/worker/types/messages.go @@ -2,6 +2,7 @@ package types import ( "crypto/x509" + "io" "time" "github.com/emersion/go-imap" @@ -86,6 +87,12 @@ type FetchMessageBodies struct { Uids imap.SeqSet } +type FetchMessageBodyPart struct { + Message + Uid uint32 + Part int +} + type DeleteMessages struct { Message Uids imap.SeqSet @@ -120,11 +127,12 @@ type DirectoryContents struct { type MessageInfo struct { Message - Envelope *imap.Envelope - Flags []string - InternalDate time.Time - Size uint32 - Uid uint32 + BodyStructure *imap.BodyStructure + Envelope *imap.Envelope + Flags []string + InternalDate time.Time + Size uint32 + Uid uint32 } type MessageBody struct { @@ -133,6 +141,12 @@ type MessageBody struct { Uid uint32 } +type MessageBodyPart struct { + Message + Reader *io.Reader + Uid uint32 +} + type MessagesDeleted struct { Message Uids []uint32