---
Hi! I have personal interest in getting this patch upstream because it is biting a few of my users.
Hi! Thanks for your patch!
This is a proof of concept Message-ID implementation, mostly for discussion.
The format is partially gleaned from https://talk.begriffs.com/pipermail/friends/2020-August/001144.html
This patch doesn't work exactly as provided, but is a rough draft of the idea - I'm sure you'd like to see
generateMessageID moved to a different place, for example, but I wasn't sure where. So, here are my questions.
todo: currently the domain isn't stripped from the from addr, but it should be trivial to do.
0. do you want have plans for this or am i stepping on toes here?
The reason I haven't done this yet is that I wanted to retain any previous
Message-Id, if the draft was composed from another client (to allow clients to
track draft changes). But I'm perfectly fine with overwriting it as a first
step.
1. would you like the helper functions moved to a different place? If so, where?
2. would you prefer to encode in base70? I chose base64 because the stdlib makes it easy.
go-message already has a helper to generate Message-Id header fields:
https://godoc.org/github.com/emersion/go-message/mail#GenerateMessageID
Can we use it instead?
plugins/base/smtp.go | 21 ++++++++++++++++++++-
1 file changed, 20 insertions(+), 1 deletion(-)
diff --git a/plugins/base/smtp.go b/plugins/base/smtp.go
index 19c9e0b..8d0ba2b 100644
--- a/plugins/base/smtp.go
+++ b/plugins/base/smtp.go
@@ -3,9 +3,12 @@ package alpsbase
import (
"bufio"
"bytes"
+ b64 "encoding/base64"
+ "encoding/binary"
"fmt"
"io"
"io/ioutil"
+ "math/rand"
"mime"
"mime/multipart"
"strings"
@@ -120,6 +123,21 @@ func writeAttachment(mw *mail.Writer, att Attachment) error {
return nil
}
+// Message-ID format is base64 encoded epoch.rand@example.com
+func generateMessageID(domain string) string {
+ epoch := time.Now().Unix()
+ rand := rand.Int63()
+
+ messageID := base64Encode(epoch) + "." + base64Encode(rand) + domain
+ return messageID
+}
+
+func base64Encode(i int64) string {
+ buf := make([]byte, 8)
+ binary.LittleEndian.PutUint64(buf, uint64(i))
+ return b64.URLEncoding.EncodeToString(buf)
+}
+
func (msg *OutgoingMessage) WriteTo(w io.Writer) error {
from := []*mail.Address{{"", msg.From}}
@@ -138,7 +156,8 @@ func (msg *OutgoingMessage) WriteTo(w io.Writer) error {
if msg.InReplyTo != "" {
h.Set("In-Reply-To", msg.InReplyTo)
}
- // TODO: set Message-ID
+
+ h.Set("Message-ID", generateMessageID(msg.From))
mw, err := mail.CreateWriter(w, h)
if err != nil {
--
2.28.0