Use Postfix queue-id as log message-id

This commit is contained in:
Son NK 2021-06-04 17:15:59 +02:00
parent d53796c8d9
commit 79d0ef8906
4 changed files with 32 additions and 2 deletions

View File

@ -13,7 +13,7 @@ from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText from email.mime.text import MIMEText
from email.utils import make_msgid, formatdate, parseaddr from email.utils import make_msgid, formatdate, parseaddr
from smtplib import SMTP, SMTPServerDisconnected from smtplib import SMTP, SMTPServerDisconnected
from typing import Tuple, List from typing import Tuple, List, Optional
import arrow import arrow
import dkim import dkim
@ -1198,3 +1198,20 @@ def sl_sendmail(
) )
else: else:
raise raise
def get_queue_id(msg: Message) -> Optional[str]:
"""Get the Postfix queue-id from a message"""
received_header = msg["Received"]
if not received_header:
return
# received_header looks like 'from mail-wr1-x434.google.com (mail-wr1-x434.google.com [IPv6:2a00:1450:4864:20::434])\r\n\t(using TLSv1.3 with cipher TLS_AES_128_GCM_SHA256 (128/128 bits))\r\n\t(No client certificate requested)\r\n\tby mx1.simplelogin.co (Postfix) with ESMTPS id 4FxQmw1DXdz2vK2\r\n\tfor <jglfdjgld@alias.com>; Fri, 4 Jun 2021 14:55:43 +0000 (UTC)'
search_result = re.search("with ESMTPS id [0-9a-zA-Z]{1,}", received_header)
if not search_result:
return
# the "with ESMTPS id 4FxQmw1DXdz2vK2" part
with_esmtps = received_header[search_result.start() : search_result.end()]
return with_esmtps[len("with ESMTPS id ") :]

View File

@ -18,7 +18,7 @@ _MESSAGE_ID = ""
def set_message_id(message_id): def set_message_id(message_id):
global _MESSAGE_ID global _MESSAGE_ID
print("set message_id", message_id) LOG.d("set message_id %s", message_id)
_MESSAGE_ID = message_id _MESSAGE_ID = message_id

View File

@ -106,6 +106,7 @@ from app.email_utils import (
spf_pass, spf_pass,
sl_sendmail, sl_sendmail,
sanitize_header, sanitize_header,
get_queue_id,
) )
from app.extensions import db from app.extensions import db
from app.greylisting import greylisting_needed from app.greylisting import greylisting_needed
@ -1535,6 +1536,9 @@ def handle(envelope: Envelope) -> str:
envelope.rcpt_tos = rcpt_tos envelope.rcpt_tos = rcpt_tos
msg = email.message_from_bytes(envelope.original_content) msg = email.message_from_bytes(envelope.original_content)
postfix_queue_id = get_queue_id(msg)
if postfix_queue_id:
set_message_id(postfix_queue_id)
# sanitize email headers # sanitize email headers
sanitize_header(msg, "from") sanitize_header(msg, "from")

View File

@ -27,6 +27,7 @@ from app.email_utils import (
should_disable, should_disable,
decode_text, decode_text,
parse_id_from_bounce, parse_id_from_bounce,
get_queue_id,
) )
from app.extensions import db from app.extensions import db
from app.models import User, CustomDomain, Alias, Contact, EmailLog from app.models import User, CustomDomain, Alias, Contact, EmailLog
@ -720,3 +721,11 @@ def test_parse_id_from_bounce():
assert parse_id_from_bounce("bounces+1234+@local") == 1234 assert parse_id_from_bounce("bounces+1234+@local") == 1234
assert parse_id_from_bounce("anything+1234+@local") == 1234 assert parse_id_from_bounce("anything+1234+@local") == 1234
assert parse_id_from_bounce(BOUNCE_EMAIL.format(1234)) == 1234 assert parse_id_from_bounce(BOUNCE_EMAIL.format(1234)) == 1234
def test_get_queue_id():
msg = email.message_from_string(
"Received: from mail-wr1-x434.google.com (mail-wr1-x434.google.com [IPv6:2a00:1450:4864:20::434])\r\n\t(using TLSv1.3 with cipher TLS_AES_128_GCM_SHA256 (128/128 bits))\r\n\t(No client certificate requested)\r\n\tby mx1.simplelogin.co (Postfix) with ESMTPS id 4FxQmw1DXdz2vK2\r\n\tfor <jglfdjgld@alias.com>; Fri, 4 Jun 2021 14:55:43 +0000 (UTC)"
)
assert get_queue_id(msg) == "4FxQmw1DXdz2vK2"