如何搜索所有未读邮件IMAP CMD / go

时间:2014-07-24 14:56:57

标签: go imap

我正在开发一个电子邮件客户端,由于某些原因,IMAP服务器并没有将所有未读邮件发回给我。在2915封电子邮件中,它仅发回2888封。我已经尝试将它们连续标记为已读/未读,而且似乎是"阅读"命令工作并标记它们全部读取,未读也可以工作,但当我搜索未读消息时,我得不到其中的27个。

有关为何会发生这种情况的任何暗示?我怀疑有一个IMAP故障。

一些代码

const (
    //serch
    SearchUnseen = "UNSEEN"
    SearchSeen   = "SEEN"
    SearchALL    = "ALL"
)
const (
    FlagSeen   = `\Seen`
    FlagUnseen = `\Unseen`
)

const (
    //flag types
    FlagSet    = "+FLAGS"
    FlagRemove = "-FLAGS"
)

type Request struct {
    Label string //label: INBOX, Sent
    Attr  string //attr: RFC822.HEADER , []BODY if is Fetch
    //OR "ALL", "UNSEEN" if is SEARCH
    //http://tools.ietf.org/html/rfc3501#section-6.4.4
    SqID string //sequences 1:44 , 1:*, 1,2,3 (UID)
}

cmd, err = c.UIDSearch(set, r.Attr)



cmd, err := imap.Wait(c.UIDStore(set, flagAction, imap.NewFlagSet(flag)))
    if err != nil {
        log.Error(err)
        return
    }

1 个答案:

答案 0 :(得分:0)

你正在做一些非常奇怪的事情,你应该阅读Imap和lib如何工作。

总结一下。

您必须根据要实现的目标选择邮箱。如果您只想下载电子邮件,请将其选为只读。如果要更新某些电子邮件(已查看,已删除),请将其选为可写邮件。请参阅我的回答here

如果您想下载UIDS列表,只需使用UIDSearch,只需一个arg指定您想要获得的范围。您可以使用UIDSearch("1:*")

如果您想获取未读电子邮件的UID:UIDSearch("1:* NOT SEEN")

UIDSearch不关心Attr,因为它只会获得UIDS而不是身体。

如果您需要正文,请使用UIDFetch并为其指定一个*imap.SeqSet,其中包含您要获取的不同属性。示例:UIDFetch(set, "RFC822.HEADER", "UID")

总结一下,请阅读documentation或使用sourceGraph浏览代码(非常棒)