如何获取一个主题gmail中的所有对话
How to fetch all conversations in one subject gmail
我使用 emersion/go-imap
在 gmail 中获取数据时遇到一个问题。我不能像这样接受所有消息(在主题中回复)
我只能收到发件人的最后一条消息。有任何解决方案来获取所有回复消息吗?
我的代码模式轮流提供大约 5 个邮件数据 min/round,如果发件人在一个主题中发送超过 1 个回复,就会出现这个问题。我无法收到第一条消息。我只能收到发件人的最后一条消息
一些代码:
// List mailboxes ลิสต์ mailbox ของแต่ละ channel
mailboxes := make(chan *imap.MailboxInfo, 10)
done := make(chan error, 1)
go func() {
done <- c.List("", "*", mailboxes)
}()
log.Println("Mailboxes:")
for m := range mailboxes {
log.Println("* " + m.Name)
}
if err := <-done; err != nil {
log.Fatal(err)
}
listBox := "INBOX"
// Select INBOX
mbox, err := c.Select(listBox, false)
if err != nil {
log.Fatal(err)
}
// set range for feed
seqSet := new(imap.SeqSet)
// is for testing get lastone only
seqSet.AddRange(mbox.Messages, mbox.Messages)
log.Println("message lens : ", (mbox.Messages))
// Get the whole message body
var section imap.BodySectionName
items := []imap.FetchItem{section.FetchItem(), imap.FetchEnvelope}
// criteria := imap.NewSearchCriteria()
messages := make(chan *imap.Message, 10)
go func() {
if err := c.Fetch(seqSet, items, messages); err != nil {
log.Fatal(err)
}
}()
msg := <-messages
if msg == nil {
log.Fatal("Server didn't returned message")
}
// Create a new mail reader
mailReader, err := mail.CreateReader(msg.GetBody(§ion))
if err != nil {
log.Fatal(err)
}
// Print some info about the message
header := mailReader.Header
if ID, err := header.MessageID(); err == nil {
log.Println("ID:", ID)
}
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)
}
// Process each message's part
count := 0
for {
p, err := mailReader.NextPart()
if err == io.EOF {
break
} else if err != nil {
panic(err)
}
switch h := p.Header.(type) {
case *mail.InlineHeader:
// This is the message's text (can be plain-text or HTML)
b, _ := ioutil.ReadAll(p.Body)
fmt.Printf("Got text: %v\n", string(b))
case *mail.AttachmentHeader:
// This is an attachment
filename, _ := h.Filename()
fmt.Printf("Got attachment: %v\n", filename)
// set filename
file, err := os.Create(filename)
if err != nil {
panic(err)
}
defer file.Close()
// create file
// using io.Copy instead of io.ReadAll to avoid insufficient memory issues
size, err := io.Copy(file, p.Body)
if err != nil {
panic(err)
}
fmt.Printf("Saved %v bytes into %v\n", size, filename)
}
count++
}
fmt.Printf("\n\nRound of mail : %v", count)
我找到了一种在 gmail 中提供所有对话的方法。 Gmail 有关于邮件分组的设置。我关掉了这个设置邮件的回复会一封一封显示,可以得到我想要的数据。
转到设置 --> 对话视图。
我使用 emersion/go-imap
在 gmail 中获取数据时遇到一个问题。我不能像这样接受所有消息(在主题中回复)
我只能收到发件人的最后一条消息。有任何解决方案来获取所有回复消息吗?
我的代码模式轮流提供大约 5 个邮件数据 min/round,如果发件人在一个主题中发送超过 1 个回复,就会出现这个问题。我无法收到第一条消息。我只能收到发件人的最后一条消息
一些代码:
// List mailboxes ลิสต์ mailbox ของแต่ละ channel
mailboxes := make(chan *imap.MailboxInfo, 10)
done := make(chan error, 1)
go func() {
done <- c.List("", "*", mailboxes)
}()
log.Println("Mailboxes:")
for m := range mailboxes {
log.Println("* " + m.Name)
}
if err := <-done; err != nil {
log.Fatal(err)
}
listBox := "INBOX"
// Select INBOX
mbox, err := c.Select(listBox, false)
if err != nil {
log.Fatal(err)
}
// set range for feed
seqSet := new(imap.SeqSet)
// is for testing get lastone only
seqSet.AddRange(mbox.Messages, mbox.Messages)
log.Println("message lens : ", (mbox.Messages))
// Get the whole message body
var section imap.BodySectionName
items := []imap.FetchItem{section.FetchItem(), imap.FetchEnvelope}
// criteria := imap.NewSearchCriteria()
messages := make(chan *imap.Message, 10)
go func() {
if err := c.Fetch(seqSet, items, messages); err != nil {
log.Fatal(err)
}
}()
msg := <-messages
if msg == nil {
log.Fatal("Server didn't returned message")
}
// Create a new mail reader
mailReader, err := mail.CreateReader(msg.GetBody(§ion))
if err != nil {
log.Fatal(err)
}
// Print some info about the message
header := mailReader.Header
if ID, err := header.MessageID(); err == nil {
log.Println("ID:", ID)
}
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)
}
// Process each message's part
count := 0
for {
p, err := mailReader.NextPart()
if err == io.EOF {
break
} else if err != nil {
panic(err)
}
switch h := p.Header.(type) {
case *mail.InlineHeader:
// This is the message's text (can be plain-text or HTML)
b, _ := ioutil.ReadAll(p.Body)
fmt.Printf("Got text: %v\n", string(b))
case *mail.AttachmentHeader:
// This is an attachment
filename, _ := h.Filename()
fmt.Printf("Got attachment: %v\n", filename)
// set filename
file, err := os.Create(filename)
if err != nil {
panic(err)
}
defer file.Close()
// create file
// using io.Copy instead of io.ReadAll to avoid insufficient memory issues
size, err := io.Copy(file, p.Body)
if err != nil {
panic(err)
}
fmt.Printf("Saved %v bytes into %v\n", size, filename)
}
count++
}
fmt.Printf("\n\nRound of mail : %v", count)
我找到了一种在 gmail 中提供所有对话的方法。 Gmail 有关于邮件分组的设置。我关掉了这个设置邮件的回复会一封一封显示,可以得到我想要的数据。
转到设置 --> 对话视图。