diff --git a/worker/imap/fetch.go b/worker/imap/fetch.go index af9d3b1..a799f2a 100644 --- a/worker/imap/fetch.go +++ b/worker/imap/fetch.go @@ -46,50 +46,46 @@ func (imapw *IMAPWorker) handleFetchMessages( msg types.WorkerMessage, uids *imap.SeqSet, items []imap.FetchItem, section *imap.BodySectionName) { + messages := make(chan *imap.Message) + go func() { - messages := make(chan *imap.Message) - done := make(chan error, 1) - go func() { - done <- imapw.client.UidFetch(uids, items, messages) - }() - go func() { - for _msg := range messages { - imapw.seqMap[_msg.SeqNum-1] = _msg.Uid - switch msg.(type) { - case *types.FetchMessageHeaders: - imapw.worker.PostMessage(&types.MessageInfo{ - Message: types.RespondTo(msg), - BodyStructure: _msg.BodyStructure, - Envelope: _msg.Envelope, - Flags: _msg.Flags, - InternalDate: _msg.InternalDate, - Uid: _msg.Uid, - }, nil) - case *types.FetchFullMessages: - reader := _msg.GetBody(section) - imapw.worker.PostMessage(&types.FullMessage{ - Message: types.RespondTo(msg), - Reader: reader, - Uid: _msg.Uid, - }, nil) - case *types.FetchMessageBodyPart: - reader := _msg.GetBody(section) - imapw.worker.PostMessage(&types.MessageBodyPart{ - Message: types.RespondTo(msg), - Reader: reader, - Uid: _msg.Uid, - }, nil) - } - } - if err := <-done; err != nil { - imapw.worker.PostMessage(&types.Error{ - Message: types.RespondTo(msg), - Error: err, + for _msg := range messages { + imapw.seqMap[_msg.SeqNum-1] = _msg.Uid + switch msg.(type) { + case *types.FetchMessageHeaders: + imapw.worker.PostMessage(&types.MessageInfo{ + Message: types.RespondTo(msg), + BodyStructure: _msg.BodyStructure, + Envelope: _msg.Envelope, + Flags: _msg.Flags, + InternalDate: _msg.InternalDate, + Uid: _msg.Uid, + }, nil) + case *types.FetchFullMessages: + reader := _msg.GetBody(section) + imapw.worker.PostMessage(&types.FullMessage{ + Message: types.RespondTo(msg), + Reader: reader, + Uid: _msg.Uid, + }, nil) + case *types.FetchMessageBodyPart: + reader := _msg.GetBody(section) + imapw.worker.PostMessage(&types.MessageBodyPart{ + Message: types.RespondTo(msg), + Reader: reader, + Uid: _msg.Uid, }, nil) - } else { - imapw.worker.PostMessage( - &types.Done{types.RespondTo(msg)}, nil) } - }() + } }() + + if err := imapw.client.UidFetch(uids, items, messages); err != nil { + imapw.worker.PostMessage(&types.Error{ + Message: types.RespondTo(msg), + Error: err, + }, nil) + } else { + imapw.worker.PostMessage( + &types.Done{types.RespondTo(msg)}, nil) + } } diff --git a/worker/imap/list.go b/worker/imap/list.go index eff3d49..22addc3 100644 --- a/worker/imap/list.go +++ b/worker/imap/list.go @@ -8,11 +8,8 @@ import ( func (imapw *IMAPWorker) handleListDirectories(msg *types.ListDirectories) { mailboxes := make(chan *imap.MailboxInfo) - done := make(chan error, 1) imapw.worker.Logger.Println("Listing mailboxes") - go func() { - done <- imapw.client.List("", "*", mailboxes) - }() + go func() { for mbox := range mailboxes { imapw.worker.PostMessage(&types.Directory{ @@ -21,14 +18,15 @@ func (imapw *IMAPWorker) handleListDirectories(msg *types.ListDirectories) { Attributes: mbox.Attributes, }, nil) } - if err := <-done; err != nil { - imapw.worker.PostMessage(&types.Error{ - Message: types.RespondTo(msg), - Error: err, - }, nil) - } else { - imapw.worker.PostMessage( - &types.Done{types.RespondTo(msg)}, nil) - } }() + + if err := imapw.client.List("", "*", mailboxes); err != nil { + imapw.worker.PostMessage(&types.Error{ + Message: types.RespondTo(msg), + Error: err, + }, nil) + } else { + imapw.worker.PostMessage( + &types.Done{types.RespondTo(msg)}, nil) + } } diff --git a/worker/imap/open.go b/worker/imap/open.go index 3705bc0..dc5d6d1 100644 --- a/worker/imap/open.go +++ b/worker/imap/open.go @@ -8,17 +8,16 @@ import ( func (imapw *IMAPWorker) handleOpenDirectory(msg *types.OpenDirectory) { imapw.worker.Logger.Printf("Opening %s", msg.Directory) - go func() { - _, err := imapw.client.Select(msg.Directory, false) - if err != nil { - imapw.worker.PostMessage(&types.Error{ - Message: types.RespondTo(msg), - Error: err, - }, nil) - } else { - imapw.worker.PostMessage(&types.Done{types.RespondTo(msg)}, nil) - } - }() + + _, err := imapw.client.Select(msg.Directory, false) + if err != nil { + imapw.worker.PostMessage(&types.Error{ + Message: types.RespondTo(msg), + Error: err, + }, nil) + } else { + imapw.worker.PostMessage(&types.Done{types.RespondTo(msg)}, nil) + } } func (imapw *IMAPWorker) handleFetchDirectoryContents( @@ -26,25 +25,23 @@ func (imapw *IMAPWorker) handleFetchDirectoryContents( imapw.worker.Logger.Printf("Fetching UID list") - go func() { - seqSet := &imap.SeqSet{} - seqSet.AddRange(1, imapw.selected.Messages) - uids, err := imapw.client.UidSearch(&imap.SearchCriteria{ - SeqNum: seqSet, - }) - if err != nil { - imapw.worker.PostMessage(&types.Error{ - Message: types.RespondTo(msg), - Error: err, - }, nil) - } else { - imapw.worker.Logger.Printf("Found %d UIDs", len(uids)) - imapw.seqMap = make([]uint32, len(uids)) - imapw.worker.PostMessage(&types.DirectoryContents{ - Message: types.RespondTo(msg), - Uids: uids, - }, nil) - imapw.worker.PostMessage(&types.Done{types.RespondTo(msg)}, nil) - } - }() + seqSet := &imap.SeqSet{} + seqSet.AddRange(1, imapw.selected.Messages) + uids, err := imapw.client.UidSearch(&imap.SearchCriteria{ + SeqNum: seqSet, + }) + if err != nil { + imapw.worker.PostMessage(&types.Error{ + Message: types.RespondTo(msg), + Error: err, + }, nil) + } else { + imapw.worker.Logger.Printf("Found %d UIDs", len(uids)) + imapw.seqMap = make([]uint32, len(uids)) + imapw.worker.PostMessage(&types.DirectoryContents{ + Message: types.RespondTo(msg), + Uids: uids, + }, nil) + imapw.worker.PostMessage(&types.Done{types.RespondTo(msg)}, nil) + } }