如何使用go-imap v2下载电子邮件附件?

问题描述 投票:0回答:1

我正在尝试使用 Go 实现此工作流程(使用 go-imap v2):

  1. 扫描收件箱,查找来自某个发件人的电子邮件,例如 [电子邮件受保护]
  2. 下载Excel附件
  3. 解析 Excel,将其提供给另一个 API

这是我的代码。第 1 部分大致完成了。

package main

import (
    "fmt"

    "github.com/emersion/go-imap/v2"
    "github.com/emersion/go-imap/v2/imapclient"
)

func generateIdRange(startIdx, endIdx uint32) []uint32 {
    var x uint32
    var theSize = endIdx - startIdx
    var theSlice = make([]uint32, theSize)
    for x = 0; x < theSize; x++ {
        theSlice[x] = startIdx + x
    }
    return theSlice
}


func main() {

    client, client_err := imapclient.DialTLS("xxx.xxx.xxx:993", nil)
    if client_err != nil {
        fmt.Printf("Failed to dial IMAP server: %v", client_err)
    } else {
        fmt.Printf("Succesfully connected to IMAP server...\n")
    }
    defer client.Close()

    if client_err := client.Login("xxxxx", "xxxxx").Wait(); client_err != nil {
        fmt.Printf("Failed to login: %v", client_err)
    } else {
        fmt.Printf("Succesfully logged in...\n")
    }

    mailboxes, client_err := client.List("", "%", nil).Collect()
    if client_err != nil {
        fmt.Printf("Failed to list mailboxes: %v\n", client_err)
    } else {
        fmt.Printf("Found %v mailboxes\n", len(mailboxes))
        for _, mbox := range mailboxes {
            fmt.Printf(" - %v\n", mbox.Mailbox)
        }
    }

    selectedMbox, client_err := client.Select("INBOX", nil).Wait()
    if client_err != nil {
        fmt.Printf("Failed to select INBOX: %v\n", client_err)
    } else {
        fmt.Printf("INBOX contains %v messages\n", selectedMbox.NumMessages)
    }

    if selectedMbox.NumMessages > 0 {

        theArr := generateIdRange(1, selectedMbox.NumMessages)
        seqSet := imap.SeqSetNum(theArr...)

        fetchOptions := &imap.FetchOptions{Envelope: true}
        messages, client_err := client.Fetch(seqSet, fetchOptions).Collect()
        if client_err != nil {
            fmt.Printf("Failed to fetch first message in INBOX: %v\n", client_err)
        } else {
            var x uint32
            for x = 0; x < selectedMbox.NumMessages-1; x++ {
                var sender = messages[x].Envelope.Sender[0].Mailbox + "@" + messages[x].Envelope.Sender[0].Host
                if sender == "[email protected]" {
                    // OK this is email from [email protected]
                    // Next step is grab the Excel attachment..... 
                }
            }
        }
    }

    if err := client.Logout().Wait(); err != nil {
        fmt.Printf("Failed to logout: %v\n", err)
    }
}

现在我的问题是如何抓取Excel附件?我找到了这个例子:获取消息。复制粘贴它会导致错误,例如:

未定义:imap.BodySectionName

未定义:imap.FetchItem

这是我修改后的代码,顺便说一句: https://gist.github.com/anta40/6c04227c7a28b781e6210da3f2757d57

go email-attachments go-imap
1个回答
© www.soinside.com 2019 - 2024. All rights reserved.