# HG changeset patch
# User Christophe de Vienne <christophe@cdevienne.info>
# Date 1735054809 -3600
#      Tue Dec 24 16:40:09 2024 +0100
# Node ID 4b4ddf71ece69bf93ee1157cb79e2d1e41db2e75
# Parent  32fb74f6e7336777666a867ed5ef3d71a43504d2
email_queue: add message-ID and headers handling

diff --git a/lib/redner.go b/lib/redner.go
--- a/lib/redner.go
+++ b/lib/redner.go
@@ -119,7 +119,7 @@
 		return err
 	}
 
-	if err := models.QueueMail(db, "", []string{doc.Metadata["to"]}, buf.Bytes()); err != nil {
+	if err := models.QueueMail(db, "", "", []string{doc.Metadata["to"]}, nil, buf.Bytes()); err != nil {
 		return err
 	}
 
diff --git a/migration/scripts/0018_email_queue.up.sql b/migration/scripts/0018_email_queue.up.sql
new file mode 100644
--- /dev/null
+++ b/migration/scripts/0018_email_queue.up.sql
@@ -0,0 +1,2 @@
+ALTER TABLE email_queue 
+  ADD COLUMN message_id VARCHAR NOT NULL DEFAULT '';
diff --git a/models/email_queue.go b/models/email_queue.go
--- a/models/email_queue.go
+++ b/models/email_queue.go
@@ -1,6 +1,7 @@
 package models
 
 import (
+	"strings"
 	"time"
 
 	"github.com/jackc/pgtype"
@@ -10,6 +11,7 @@
 // dbtable:"email_queue" dbpkey:"id"
 type Email struct {
 	ID            int              `db:"id"`
+	MessageID     string           `db:"message_id"`
 	CreatedAt     time.Time        `db:"created_at"`
 	From          string           `db:"from_"`
 	To            pgtype.TextArray `db:"to_"`
@@ -21,8 +23,28 @@
 	ReattemptAt   time.Time        `db:"reattempt_at"`
 }
 
-func QueueMail(db database.SQLHelper, from string, to []string, msg []byte) error {
+func QueueMail(
+	db database.SQLHelper, messageID string,
+	from string, to []string,
+	headers Metadata,
+	msg []byte,
+) error {
+	sHeaders := "Message-ID: " + messageID + "\n"
+
+	if len(headers) != 0 {
+		for k, v := range headers {
+			if strings.ToLower(k) != "message-id" {
+				sHeaders += k + ": " + v + "\n"
+			}
+		}
+	}
+
+	sHeaders += "\n"
+
+	msg = append([]byte(sHeaders), msg...)
+
 	email := Email{
+		MessageID:     messageID,
 		CreatedAt:     time.Now().UTC(),
 		From:          from,
 		Msg:           msg,
diff --git a/models/metadata_extra.go b/models/metadata_extra.go
--- a/models/metadata_extra.go
+++ b/models/metadata_extra.go
@@ -3,8 +3,20 @@
 import (
 	"io"
 	"slices"
+	"strings"
 )
 
+func (m Metadata) Get(name string) string {
+	name = strings.ToLower(name)
+	for k, v := range m {
+		if strings.ToLower(k) == name {
+			return v
+		}
+	}
+
+	return ""
+}
+
 func (m *Metadata) Add(name, value string) {
 	if *m == nil {
 		*m = make(Metadata)