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