3 回答

TA貢獻(xiàn)1893條經(jīng)驗(yàn) 獲得超10個(gè)贊
需要注意的幾件事,請確保您實(shí)際上是在 imap 請求中請求 flags 字段。如果你發(fā)出取,那么你就必須在傳遞"FLAGS"作為參數(shù)Fetch,另外,在標(biāo)志屬性Attrs是大小寫敏感的,所以你需要rsp.MessageInfo().Attrs["FLAGS"]。下面是一個(gè)在 Gmail 中使用 imap 和 go-imap 庫的工作示例,運(yùn)行它GMAIL_EMAIL=email.address GMAIL_PASSWD=mypassword go run go_file.go
package main
import (
"code.google.com/p/go-imap/go1/imap"
"crypto/rand"
"crypto/tls"
"fmt"
"os"
"time"
)
func main() {
label := "INBOX"
email := os.Getenv("GMAIL_EMAIL")
passwd := os.Getenv("GMAIL_PASSWD")
conf := &tls.Config{
Rand: rand.Reader,
}
c, err := imap.DialTLS("imap.gmail.com:993", conf)
if err != nil {
panic("Failed to connect")
}
defer c.Logout(30 * time.Second)
c.Data = nil
if c.Caps["STARTTLS"] {
c.StartTLS(nil)
}
// Authenticate
if c.State() == imap.Login {
c.Login(email, passwd)
}
if c.State() != imap.Auth {
panic("Authentication error")
}
c.Select(label, true)
set, _ := imap.NewSeqSet("*")
cmd, err := c.Fetch(set, "FLAGS", "UID")
if err != nil {
panic("Bad fetch command")
}
_, err = cmd.Result(imap.OK)
if err != nil {
panic("Bad fetch response")
}
for _, rsp := range cmd.Data {
seen := false
for _, flag := range imap.AsList(rsp.MessageInfo().Attrs["FLAGS"]) {
if flag == "\\Seen" {
seen = true
}
}
if seen {
fmt.Printf("Message %d has been read!\n", imap.AsNumber(rsp.MessageInfo().Attrs["UID"]))
} else {
fmt.Printf("Message %d has been not been read!\n", imap.AsNumber(rsp.MessageInfo().Attrs["UID"]))
}
}
}

TA貢獻(xiàn)1829條經(jīng)驗(yàn) 獲得超7個(gè)贊
每條消息在 IMAP 中都有一個(gè)標(biāo)志列表,其中一個(gè)稱為\seen(不區(qū)分大小寫,IMAP 中的大多數(shù)內(nèi)容也是如此)。如果標(biāo)志列表不包含該標(biāo)志,則消息不可見。
@jstedfast 的回答解釋了如何獲取標(biāo)志列表。剩下的就是在空白處拆分并檢查列表中的任何單詞是否等于\seen。

TA貢獻(xiàn)1813條經(jīng)驗(yàn) 獲得超2個(gè)贊
fmt.Println(rsp.MessageInfo().Attrs["Flags"])
<nil>
因?yàn)闆]有設(shè)置標(biāo)志,所以為你打印,這意味著消息是“看不見的”。
- 3 回答
- 0 關(guān)注
- 228 瀏覽
添加回答
舉報(bào)