Author: Adam <git@apiote.xyz>
get text/plain part in mímir
go.mod | 2 ++ mímir.go | 47 +++++++++++++++++++++++++++++++++++++----------
diff --git a/go.mod b/go.mod index 024ee0c8ff9622e480aef1fd8f77c432aace1fad..9a9ac82bd9a2a7121718f5b84dfbec7b94b68117 100644 --- a/go.mod +++ b/go.mod @@ -7,6 +7,7 @@ apiote.xyz/p/go-dirty v0.0.0-20211022164923-8652e7927cd7 github.com/ProtonMail/gopenpgp/v2 v2.2.4 github.com/emersion/go-imap v1.2.0 github.com/emersion/go-imap-move v0.0.0-20210907172020-fe4558f9c872 + github.com/emersion/go-message v0.15.0 github.com/emersion/go-msgauth v0.6.5 github.com/emersion/go-smtp v0.15.0 github.com/mattn/go-sqlite3 v1.14.9 @@ -17,6 +18,7 @@ require ( github.com/ProtonMail/go-crypto v0.0.0-20210920160938-87db9fbc61c7 // indirect github.com/ProtonMail/go-mime v0.0.0-20190923161245-9b5a4261663a // indirect github.com/emersion/go-sasl v0.0.0-20211008083017-0b9dcfb154ac // indirect + github.com/emersion/go-textwrapper v0.0.0-20200911093747-65d896831594 // indirect github.com/pkg/errors v0.9.1 // indirect github.com/sirupsen/logrus v1.8.1 // indirect golang.org/x/crypto v0.0.0-20210921155107-089bfa567519 // indirect diff --git a/mímir.go b/mímir.go index b5c8958c5f2bec249069d3046832f76487f82d58..6b356863b11c0508b353380ca5b990a4fa4fd9b1 100644 --- a/mímir.go +++ b/mímir.go @@ -2,18 +2,19 @@ package main import ( "bytes" + "database/sql" "errors" "fmt" "io" "log" "net/http" - "net/mail" "regexp" "strings" - "database/sql" "github.com/emersion/go-imap" "github.com/emersion/go-imap/client" + "github.com/emersion/go-message" + _ "github.com/emersion/go-message/charset" "github.com/emersion/go-msgauth/dkim" ) @@ -41,7 +42,36 @@ } return "", errors.New("Unknown category") } -func archiveInbox(mboxName string, c *client.Client, config Config) error { +func getPlainTextPart(r io.Reader) (io.Reader, error) { + m, err := message.Read(r) + if err != nil { + log.Fatal(err) + } + + if mr := m.MultipartReader(); mr != nil { + for { + p, err := mr.NextPart() + if err == io.EOF { + break + } else if err != nil { + log.Fatal(err) + } + + t, _, _ := p.Header.ContentType() + if t == "text/plain" { + return p.Body, nil + } + } + } else { + t, _, _ := m.Header.ContentType() + if t == "text/plain" { + return m.Body, nil + } + } + return nil, errors.New("text/plain no found") +} + +func archiveInbox(db *sql.DB, mboxName string, c *client.Client, config Config) error { mbox, err := c.Select(mboxName, true) if err != nil { return err @@ -65,7 +95,7 @@ done <- c.Fetch(seqset, items, messages) }() for msg := range messages { recipients := append(msg.Envelope.To, msg.Envelope.Cc...) - project, err := checkRecipientTemplate(recipients, config) + category, err := checkRecipientTemplate(recipients, config) if err != nil { return err } @@ -96,17 +126,14 @@ } } r = bytes.NewReader(messageBytes) - m, err := mail.ReadMessage(r) + bodyReader, err := getPlainTextPart(r) if err != nil { - fmt.Println("tere") return err } - body, err := io.ReadAll(m.Body) + body, err := io.ReadAll(bodyReader) if err != nil { - fmt.Println("tee") return err } - // select part text/plain from body addArchiveEntry(messageID, project, subject, body, date, inReplyTo, dkimStatus, sender, recipients) } @@ -128,7 +155,7 @@ if err := c.Login(config.Mímir.ImapUsername, config.Mímir.ImapPassword); err != nil { log.Fatalln(err) } log.Println("Logged in") - err = archiveInbox(config.Mímir.ImapInbox, c, config) + err = archiveInbox(db, config.Mímir.ImapInbox, c, config) if err != nil { log.Fatalln(err) }