From b5bed794a1a39ad65dc7b4610b30a8a0f98e4254 Mon Sep 17 00:00:00 2001 From: windvalley Date: Mon, 3 Jul 2023 12:31:15 +0800 Subject: [PATCH] fix: fix parse error --- CHANGELOG.md | 6 ++++++ README.md | 20 +++++++++----------- mailparser.go | 17 +++++++++++++++-- 3 files changed, 30 insertions(+), 13 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index e26c301..9f85152 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,6 +7,12 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## [Unreleased] +## v0.2.2 + +### Fixed + +- 修复解析邮件内容报错的问题 + ## v0.2.1 ### Changed diff --git a/README.md b/README.md index 5caa757..a54bbdd 100644 --- a/README.md +++ b/README.md @@ -18,20 +18,15 @@ package main import ( "fmt" "log" + "strings" - "github.com/knadh/go-pop3" + "github.com/bytbox/go-pop3" "github.com/windvalley/go-mailparser" ) func main() { - p := pop3.New(pop3.Opt{ - Host: "mail.xxx.com", - Port: 110, - TLSEnabled: false, - }) - - c, err := p.NewConn() + c, err := pop3.Dial("mail.xxx.com:110") if err != nil { log.Fatal(err) } @@ -45,20 +40,23 @@ func main() { log.Fatal(err) } - msgs, err := c.List(0) + msgs, _, err := c.ListAll() if err != nil { log.Fatal(err) } for _, v := range msgs { - b, err := c.Cmd("RETR", true, v.ID) + msg, err := c.Retr(v) if err != nil { fmt.Println(err) continue } + // string to io.Reader + msgReader := strings.NewReader(msg) + // parse email - res, err := mailparser.Parse(b) + res, err := mailparser.Parse(msgReader) if err != nil { fmt.Println(err) continue diff --git a/mailparser.go b/mailparser.go index 9bed6f6..7cfed7a 100644 --- a/mailparser.go +++ b/mailparser.go @@ -53,12 +53,17 @@ type MailMessage struct { // Parse mail message. func Parse(r io.Reader) (*MailMessage, error) { - header, err := ParseHeader(r) + m, err := mail.ReadMessage(r) + if err != nil { + return nil, err + } + + header, err := parseHeader(m) if err != nil { return nil, err } - body, attachments, err := ParseBody(r) + body, attachments, err := parseBody(m) if err != nil { return nil, err } @@ -77,6 +82,10 @@ func ParseHeader(r io.Reader) (*Header, error) { return nil, err } + return parseHeader(m) +} + +func parseHeader(m *mail.Message) (*Header, error) { dec := new(mime.WordDecoder) dec.CharsetReader = charsetReader @@ -141,6 +150,10 @@ func ParseBody(r io.Reader) (string, []*Attachment, error) { return "", nil, err } + return parseBody(m) +} + +func parseBody(m *mail.Message) (string, []*Attachment, error) { contentType := m.Header.Get("Content-Type") if contentType == "" { contentType = "text/plain"