From: Michael Tremer Date: Tue, 20 Jan 2026 17:19:07 +0000 (+0000) Subject: messages: Add a VERP address as Return-Path: X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=365541fec46d23014556245fd2b755c927725c21;p=ipfire.org.git messages: Add a VERP address as Return-Path: Signed-off-by: Michael Tremer --- diff --git a/src/backend/messages.py b/src/backend/messages.py index 681457df..2bfe857a 100644 --- a/src/backend/messages.py +++ b/src/backend/messages.py @@ -365,12 +365,18 @@ class Queue(misc.Object): msg.get("Subject"), msg.get("To"), )) + # Fetch the recipient + recipient = msg["To"] + + # Parse the recipient's address + return_path = self.make_verp_address(recipient) + error_messages = [] rejected_recipients = {} # Try delivering the email try: - rejected_recipients = self.relay.send_message(msg) + rejected_recipients = self.relay.send_message(msg, from_addr=return_path) except smtplib.SMTPRecipientsRefused as e: rejected_recipients = e.recipients @@ -403,3 +409,13 @@ class Queue(misc.Object): self.db.execute("DELETE FROM messages \ WHERE time_sent IS NOT NULL AND time_sent <= NOW() - '30 day'::interval") + + @staticmethod + def make_verp_address(recipient): + """ + Creates a VERP address which we will use for reliable bounce processing + """ + # Parse the address + name, recipient = email.utils.parseaddr(recipient) + + return "bounces+%s@ipfire.org" % recipient.replace("@", "=")