go - emersion/go-imap - 将消息标记为可见

标签 go imap

我正在尝试使用此 IMAP 协议(protocol)实现将消息标记为可见,但它没有按预期工作。

我有一个打印看不见的消息的功能,我的意图是到最后,它将每条消息标记为已看到。

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),它将自动标记为“已读”

关于go - emersion/go-imap - 将消息标记为可见,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49017250/

相关文章:

go - 我正在使用 Antlr4 创建一种语言,然后我想用它生成 LLVM IR。我是否需要手写 LLVM IR 来响应我的访问者事件?

authentication - 无法登录 SMTP 服务器 Postfix/Imap Courier/Plesk

java - 使用带有 IMAP 的 javax.mail 从 GMail 获取消息的 UID

python - imaplib SSL 连接在关闭后卡在 CLOSE_WAIT

algorithm - GoLang 堆和堆排序

amazon-web-services - 即使控制台关闭也继续运行 golang 项目

docker - 无法使用 docker 存储库中 vendor 目录中的包

unit-testing - 如何在 Golang 中仅模拟特定方法

python - imaplib.错误 : b'LOGIN failed' when trying to login using imaplib in python