emersion / go-imap - 将消息标记为已显示

时间:2018-02-27 20:18:28

标签: go imap

我正在尝试使用此IMAP协议实现标记消息,但它无法按预期工作。

我有一个打印看不见的消息的功能,我的目的是在最后,它标记每条消息。

package main

import (
    "emailmonitor/util"
    "fmt"
)

func main() {

    serverGmail := util.NewServerGmail()

    serverGmail.Connect()
    serverGmail.Login()
    serverGmail.ListUnseenMessages()

}

//-----------------------------------------

package util

import (
    "io/ioutil"
    "log"
    "net/mail"
    "net/smtp"

    imap "github.com/emersion/go-imap"
    "github.com/emersion/go-imap/client"
)

type ServerGmail struct {
    user    string
    pass    string
    erro    string
    cliente *client.Client
}

func NewServerGmail() *ServerGmail {
    serverGmail := &ServerGmail{}
    serverGmail.user = "xxxxxx@gmail.com"
    serverGmail.pass = "xxxxx"
    serverGmail.erro = ""

    return serverGmail
}

func (serverGmail *ServerGmail) Connect() {
    // Connect to server
    cliente, erro := client.DialTLS("smtp.gmail.com:993", nil)
    if erro != nil {
        serverGmail.erro = erro.Error()
    }
    log.Println("Connected")

    serverGmail.cliente = cliente

}

func (serverGmail *ServerGmail) Login() {
    // Login
    if erro := serverGmail.cliente.Login(serverGmail.user, serverGmail.pass); erro != nil {
        serverGmail.erro = erro.Error()
    }
    log.Println("Logged")

}

func (serverGmail *ServerGmail) setLabelBox(label string) *imap.MailboxStatus {
    mailbox, erro := serverGmail.cliente.Select(label, true)
    if erro != nil {
        serverGmail.erro = erro.Error()
    }
    return mailbox
}

func (serverGmail *ServerGmail) ListUnseenMessages() {
    // set mailbox to INBOX
    serverGmail.setLabelBox("INBOX")
    // criteria to search for unseen messages
    criteria := imap.NewSearchCriteria()
    criteria.WithoutFlags = []string{"\\Seen"}

    uids, err := serverGmail.cliente.UidSearch(criteria)
    if err != nil {
        log.Println(err)
    }
    seqSet := new(imap.SeqSet)
    seqSet.AddNum(uids...)
    section := &imap.BodySectionName{}
    items := []imap.FetchItem{imap.FetchEnvelope, imap.FetchFlags, imap.FetchInternalDate, section.FetchItem()}
    messages := make(chan *imap.Message)
    go func() {
        if err := serverGmail.cliente.UidFetch(seqSet, items, messages); err != nil {
            log.Fatal(err)
        }
    }()

    for message := range messages {

        log.Println(message.Uid)

        if message == nil {
            log.Fatal("Server didn't returned message")
        }

        r := message.GetBody(section)
        if r == nil {
            log.Fatal("Server didn't returned message body")
        }

        // Create a new mail reader
        mr, err := mail.CreateReader(r)
        if err != nil {
            log.Fatal(err)
        }

        // Print some info about the message
        header := mr.Header

        if date, err := header.Date(); err == nil {
            log.Println("Date:", date)
        }
        if from, err := header.AddressList("From"); err == nil {
            log.Println("From:", from)
        }
        if to, err := header.AddressList("To"); err == nil {
            log.Println("To:", to)
        }
        if subject, err := header.Subject(); err == nil {
            log.Println("Subject:", subject)
        }

// MARK "SEEN" ------- STARTS HERE  ---------

        seqSet.Clear()
        seqSet.AddNum(message.Uid)
        item := imap.FormatFlagsOp(imap.AddFlags, true)
        flags := []interface{}{imap.SeenFlag}
        erro := serverGmail.cliente.UidStore(seqSet, item, flags, nil)
        if erro != nil {
            panic("error!")
        }

    }

}

文档链接:https://godoc.org/github.com/emersion/go-imap/client#Client.UidStore 试图做类似Store实例的事情。

可以做些什么来解决它?

1 个答案:

答案 0 :(得分:0)

通过将true更改为false来修改以下行

mailbox,erro:= serverGmail.cliente.Select(label,true)

完成此操作后,当获取邮件时(使用UidFetch),它将自动标记为“看到”