From 8837dca5d3a03429ae51b0c1b4890cc23ca3666a Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?C=C3=A9lestin=20Matte?= <dev@cmatte.me>
Date: Fri, 24 Apr 2026 10:31:38 +0200
Subject: [PATCH] Use template to forward emails to mailing list owners via a
 system address

Relaying the email directly breaks SPF/DMARC. To avoid this issue,
embbed the email in a moderation email sent from the moderation
address.
---
 lib/handlers/mailhandler.py     | 26 ++++++++++++++++++++------
 mailtemplates/owner_forward.txt |  7 +++++++
 2 files changed, 27 insertions(+), 6 deletions(-)
 create mode 100644 mailtemplates/owner_forward.txt

diff --git a/lib/handlers/mailhandler.py b/lib/handlers/mailhandler.py
index 71a7d4e..beb2cb0 100644
--- a/lib/handlers/mailhandler.py
+++ b/lib/handlers/mailhandler.py
@@ -15,7 +15,7 @@ from baselib.lists import CcPolicies, BccPolicies
 from mailutil.header import decode_mime_header
 from mailutil.body import get_truncated_body
 from mailutil.attachment import get_attachment_info
-from baselib.misc import generate_random_token, log, format_size
+from baselib.misc import generate_random_token, log, format_size, obfuscate_email_address
 from baselib.config import config
 from baselib.template import send_mailtemplate
 
@@ -911,12 +911,26 @@ ORDER BY 1""",
         # pass the mail on to there.
         with self.conn.cursor() as curs:
             mods = self.mlist.get_moderators()
+            context = {
+                'sender': obfuscate_email_address(self.sender),
+                'from': obfuscate_email_address(self.fromaddr),
+                'subject': self.subject,
+                'body': self._get_truncated_body(),
+                'list_name': self.mlist.name,
+                'moderator_address': self.mlist.moderator_notice_address()
+            }
+
             for email, name in mods:
-                curs.execute("INSERT INTO raw_out (sender, recipient, contents) VALUES (%(sender)s, %(recipient)s, %(contents)s)", {
-                    'sender': self.sender,
-                    'recipient': email,
-                    'contents': self.bio.getvalue(),
-                })
+                send_mailtemplate(
+                    curs,
+                    self.mlist.moderator_notice_address(),
+                    self.mlist.moderator_notice_name(),
+                    email,
+                    name,
+                    f"Email received on {self.mlist.name} list moderators address",
+                    'owner_forward.txt',
+                    context
+                )
             log(curs, 0, 'mail',
                 'Mail to list owner of {0} delivered to {1} moderators.'.format(self.mlist.name, len(mods)),
                 self.messageid)
diff --git a/mailtemplates/owner_forward.txt b/mailtemplates/owner_forward.txt
new file mode 100644
index 0000000..d122038
--- /dev/null
+++ b/mailtemplates/owner_forward.txt
@@ -0,0 +1,7 @@
+The following email was received on the list moderators address ($moderator_address):
+
+Sender:  $from ($sender)
+Subject: $subject
+List: $list_name
+
+$body
-- 
2.53.0

