forked from Silverfish/proton-bridge
GODT-1650: Send extras
This commit is contained in:
@ -30,6 +30,7 @@ import (
|
||||
"github.com/ProtonMail/go-rfc5322"
|
||||
"github.com/ProtonMail/gopenpgp/v2/crypto"
|
||||
"github.com/ProtonMail/proton-bridge/v2/pkg/algo"
|
||||
"github.com/bradenaw/juniper/xslices"
|
||||
"github.com/emersion/go-message"
|
||||
"github.com/emersion/go-message/textproto"
|
||||
"github.com/pkg/errors"
|
||||
@ -440,8 +441,10 @@ func getMessageHeader(msg liteapi.Message, opts JobOptions) message.Header { //n
|
||||
|
||||
// Include the message ID in the references (supposedly this somehow improves outlook support...).
|
||||
if opts.AddMessageIDReference {
|
||||
if references := hdr.Get("References"); !strings.Contains(references, msg.ID) {
|
||||
hdr.Set("References", references+" <"+msg.ID+"@"+InternalIDDomain+">")
|
||||
if refs := hdr.Values("References"); xslices.IndexFunc(refs, func(ref string) bool {
|
||||
return strings.Contains(ref, msg.ID)
|
||||
}) < 0 {
|
||||
hdr.Set("References", strings.Join(append(refs, "<"+msg.ID+"@"+InternalIDDomain+">"), " "))
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@ -43,12 +43,11 @@ type MIMEBody string
|
||||
type Body string
|
||||
|
||||
type Message struct {
|
||||
Header mail.Header
|
||||
MIMEBody MIMEBody
|
||||
RichBody Body
|
||||
PlainBody Body
|
||||
Time int64
|
||||
ExternalID string
|
||||
MIMEBody MIMEBody
|
||||
RichBody Body
|
||||
PlainBody Body
|
||||
Attachments []Attachment
|
||||
MIMEType rfc822.MIMEType
|
||||
|
||||
Subject string
|
||||
Sender *mail.Address
|
||||
@ -57,8 +56,8 @@ type Message struct {
|
||||
BCCList []*mail.Address
|
||||
ReplyTos []*mail.Address
|
||||
|
||||
MIMEType rfc822.MIMEType
|
||||
Attachments []Attachment
|
||||
References []string
|
||||
ExternalID string
|
||||
}
|
||||
|
||||
func (m *Message) Recipients() []string {
|
||||
@ -447,16 +446,7 @@ func getPlainBody(part *parser.Part) []byte {
|
||||
func parseMessageHeader(h message.Header) (Message, error) { //nolint:funlen
|
||||
var m Message
|
||||
|
||||
mimeHeader, err := toMailHeader(h)
|
||||
if err != nil {
|
||||
return Message{}, err
|
||||
}
|
||||
|
||||
m.Header = mimeHeader
|
||||
|
||||
fields := h.Fields()
|
||||
|
||||
for fields.Next() {
|
||||
for fields := h.Fields(); fields.Next(); {
|
||||
switch strings.ToLower(fields.Key()) {
|
||||
case "subject":
|
||||
s, err := fields.Text()
|
||||
@ -473,6 +463,7 @@ func parseMessageHeader(h message.Header) (Message, error) { //nolint:funlen
|
||||
if err != nil {
|
||||
return Message{}, errors.Wrap(err, "failed to parse from")
|
||||
}
|
||||
|
||||
if len(sender) > 0 {
|
||||
m.Sender = sender[0]
|
||||
}
|
||||
@ -482,6 +473,7 @@ func parseMessageHeader(h message.Header) (Message, error) { //nolint:funlen
|
||||
if err != nil {
|
||||
return Message{}, errors.Wrap(err, "failed to parse to")
|
||||
}
|
||||
|
||||
m.ToList = toList
|
||||
|
||||
case "reply-to":
|
||||
@ -489,6 +481,7 @@ func parseMessageHeader(h message.Header) (Message, error) { //nolint:funlen
|
||||
if err != nil {
|
||||
return Message{}, errors.Wrap(err, "failed to parse reply-to")
|
||||
}
|
||||
|
||||
m.ReplyTos = replyTos
|
||||
|
||||
case "cc":
|
||||
@ -496,6 +489,7 @@ func parseMessageHeader(h message.Header) (Message, error) { //nolint:funlen
|
||||
if err != nil {
|
||||
return Message{}, errors.Wrap(err, "failed to parse cc")
|
||||
}
|
||||
|
||||
m.CCList = ccList
|
||||
|
||||
case "bcc":
|
||||
@ -503,17 +497,16 @@ func parseMessageHeader(h message.Header) (Message, error) { //nolint:funlen
|
||||
if err != nil {
|
||||
return Message{}, errors.Wrap(err, "failed to parse bcc")
|
||||
}
|
||||
m.BCCList = bccList
|
||||
|
||||
case "date":
|
||||
date, err := rfc5322.ParseDateTime(fields.Value())
|
||||
if err != nil {
|
||||
return Message{}, errors.Wrap(err, "failed to parse date")
|
||||
}
|
||||
m.Time = date.Unix()
|
||||
m.BCCList = bccList
|
||||
|
||||
case "message-id":
|
||||
m.ExternalID = regexp.MustCompile("<(.*)>").ReplaceAllString(fields.Value(), "$1")
|
||||
|
||||
case "references":
|
||||
m.References = append(m.References, xslices.Map(strings.Fields(fields.Value()), func(ref string) string {
|
||||
return strings.Trim(ref, "<>")
|
||||
})...)
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@ -581,10 +581,13 @@ func TestParseEncodedContentTypeBad(t *testing.T) {
|
||||
require.Error(t, err)
|
||||
}
|
||||
|
||||
type panicReader struct{}
|
||||
func TestParseMessageReferences(t *testing.T) {
|
||||
f := getFileReader("references.eml")
|
||||
|
||||
func (panicReader) Read(p []byte) (int, error) {
|
||||
panic("lol")
|
||||
m, err := Parse(f)
|
||||
require.NoError(t, err)
|
||||
|
||||
assert.Len(t, m.References, 2)
|
||||
}
|
||||
|
||||
func TestParsePanic(t *testing.T) {
|
||||
@ -603,3 +606,9 @@ func getFileReader(filename string) io.Reader {
|
||||
|
||||
return f
|
||||
}
|
||||
|
||||
type panicReader struct{}
|
||||
|
||||
func (panicReader) Read(p []byte) (int, error) {
|
||||
panic("lol")
|
||||
}
|
||||
|
||||
27
pkg/message/testdata/references.eml
vendored
Normal file
27
pkg/message/testdata/references.eml
vendored
Normal file
@ -0,0 +1,27 @@
|
||||
Content-Type: multipart/mixed;
|
||||
boundary=987c7102dcaf02d01860ce777b465f86d39ec16a3b4e12605eb6b0eb200a
|
||||
X-Original-To: someone@protonmail.com
|
||||
Delivered-To: someone@protonmail.com
|
||||
Date: Sun, 04 Aug 2019 13:03:26 +0000
|
||||
From: ProtonVPN <support@protonvpn.something.com>
|
||||
Reply-To: ProtonVPN <support+id493949@protonvpn.something.com>
|
||||
To: someone <someone@protonmail.com>
|
||||
Message-Id: <OEUOEUOUOU_5d46d79df036f_1d78b3fd8f42bcf2014719e_sprut@something.com>
|
||||
In-Reply-To: <OEUOEUEOUOUOU770B9QNZWFVGM@protonmail.ch>
|
||||
References: <PMZV4VZMRM@something.com> <OEUOEUEOUOUOU770B9QNZWFVGM@protonmail.ch>
|
||||
Subject: Some test subject
|
||||
Mime-Version: 1.0
|
||||
|
||||
--987c7102dcaf02d01860ce777b465f86d39ec16a3b4e12605eb6b0eb200a
|
||||
Content-Transfer-Encoding: quoted-printable
|
||||
Content-Type: text/html; charset=utf-8
|
||||
|
||||
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.=
|
||||
w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
|
||||
<html>
|
||||
<body>
|
||||
test test test
|
||||
</body>
|
||||
</html>
|
||||
|
||||
--987c7102dcaf02d01860ce777b465f86d39ec16a3b4e12605eb6b0eb200a--
|
||||
Reference in New Issue
Block a user