emersion / go-message

✉️ A streaming Go library for the Internet Message Format and mail messages
MIT License
373 stars 108 forks source link

panic: message: HeaderFields method called before Next #145

Closed mooijtech closed 2 years ago

mooijtech commented 2 years ago

Hello emersion,

I want to get all the header fields.

func main() {
    inputFile, err := os.Open("/home/bot/dncleaks/emails/4.eml")

    // Create a new mail reader
    mr, err := mail.CreateReader(inputFile)

    if err != nil {
        log.Fatal(err)
    }

    // Read each mail's part
    for {
        p, err := mr.NextPart()
        if err == io.EOF {
            break
        } else if err != nil {
            log.Fatal(err)
        }

        switch h := p.Header.(type) {
        case *mail.InlineHeader:
            b, _ := ioutil.ReadAll(p.Body)
            log.Printf("Got text: %v\n", string(b))

            for p.Header.(*mail.InlineHeader).Fields().Next() {
                log.Printf("Field: %s\n", p.Header.(*mail.InlineHeader).Fields().Value())
            }
        case *mail.AttachmentHeader:
            filename, _ := h.Filename()
            log.Printf("Got attachment: %v\n", filename)
        }
    }
}

But it's giving me an error:

panic: message: HeaderFields method called before Next

What am I doing wrong?

Kind regards, Marten Mooij

emersion commented 2 years ago

p.Header.(*mail.InlineHeader).Fields() returns an iterator. You need to store it in a variable, and use the same iterator when calling Value.

mooijtech commented 2 years ago

Thanks, that fixed it!