asgard.git

commit 7274f3f6fa66d8ba48e669122c3fc1d2411d7a71

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)
 	}