繁体   English   中英

emersion / go-imap-将邮件标记为已看到

[英]emersion/go-imap - Mark message as seen

我正在尝试将邮件标记为使用此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尝试执行类似于“商店”示例的操作。

该如何解决?

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

邮箱,错误:= serverGmail.cliente.Select(label,true)

完成此操作后,在提取邮件(使用UidFetch)后,该邮件将自动标记为“已看到”

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM