From 57020eebbe3eb1e415bcf4bc7c1e2baca1ebf9f8 Mon Sep 17 00:00:00 2001 From: Dominik Chilla Date: Sun, 10 Dec 2023 01:04:42 +0100 Subject: [PATCH] init --- .gitignore | 131 +++++++++++++++++++++++++++++++++++++ app/dsn_processor.py | 85 ++++++++++++++++++++++++ requirements.txt | 1 + tests/DELAY.eml | 95 +++++++++++++++++++++++++++ tests/FAILURE.eml | 92 ++++++++++++++++++++++++++ tests/MULTI.eml | 59 +++++++++++++++++ tests/MULTI_body.txt | 51 +++++++++++++++ tests/SUCCESS.eml | 122 ++++++++++++++++++++++++++++++++++ tests/miltertest_multi.lua | 70 ++++++++++++++++++++ 9 files changed, 706 insertions(+) create mode 100644 .gitignore create mode 100644 app/dsn_processor.py create mode 100644 requirements.txt create mode 100644 tests/DELAY.eml create mode 100644 tests/FAILURE.eml create mode 100644 tests/MULTI.eml create mode 100644 tests/MULTI_body.txt create mode 100644 tests/SUCCESS.eml create mode 100644 tests/miltertest_multi.lua diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..c42b4c7 --- /dev/null +++ b/.gitignore @@ -0,0 +1,131 @@ +# Byte-compiled / optimized / DLL files +__pycache__/ +*.py[cod] +*$py.class + +# C extensions +*.so + +# Distribution / packaging +.Python +build/ +develop-eggs/ +dist/ +downloads/ +eggs/ +.eggs/ +lib/ +lib64/ +parts/ +sdist/ +var/ +wheels/ +pip-wheel-metadata/ +share/python-wheels/ +*.egg-info/ +.installed.cfg +*.egg +MANIFEST + +# PyInstaller +# Usually these files are written by a python script from a template +# before PyInstaller builds the exe, so as to inject date/other infos into it. +*.manifest +*.spec + +# Installer logs +pip-log.txt +pip-delete-this-directory.txt + +# Unit test / coverage reports +htmlcov/ +.tox/ +.nox/ +.coverage +.coverage.* +.cache +nosetests.xml +coverage.xml +*.cover +*.py,cover +.hypothesis/ +.pytest_cache/ + +# Translations +*.mo +*.pot + +# Django stuff: +*.log +local_settings.py +db.sqlite3 +db.sqlite3-journal + +# Flask stuff: +instance/ +.webassets-cache + +# Scrapy stuff: +.scrapy + +# Sphinx documentation +docs/_build/ + +# PyBuilder +target/ + +# Jupyter Notebook +.ipynb_checkpoints + +# IPython +profile_default/ +ipython_config.py + +# pyenv +.python-version + +# pipenv +# According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control. +# However, in case of collaboration, if having platform-specific dependencies or dependencies +# having no cross-platform support, pipenv may install dependencies that don't work, or not +# install all needed dependencies. +#Pipfile.lock + +# PEP 582; used by e.g. github.com/David-OConnor/pyflow +__pypackages__/ + +# Celery stuff +celerybeat-schedule +celerybeat.pid + +# SageMath parsed files +*.sage.py + +# Environments +.env +.venv +env/ +venv/ +ENV/ +env.bak/ +venv.bak/ + +# Spyder project settings +.spyderproject +.spyproject + +# Rope project settings +.ropeproject + +# mkdocs documentation +/site + +# mypy +.mypy_cache/ +.dmypy.json +dmypy.json + +# Pyre type checker +.pyre/ + +.vscode \ No newline at end of file diff --git a/app/dsn_processor.py b/app/dsn_processor.py new file mode 100644 index 0000000..c83b558 --- /dev/null +++ b/app/dsn_processor.py @@ -0,0 +1,85 @@ +import Milter +import sys +import traceback +import email +import json + +class DsnProcessorMilter(Milter.Base): + def __init__(self): + self.mail_data: str = "" + + def process_dsn(self, mail_data: str): + msg = email.message_from_string(mail_data) + recipients = [] + for part in msg.walk(): + if part.get_content_type() == "message/delivery-status": + for subpart in part.walk(): + rcpt = {} + if 'Action' in subpart and 'Original-Recipient' in subpart: + rcpt["action"] = subpart['Action'] + rcpt["orig_rcpt"] = subpart['Original-Recipient'].replace('rfc822;', '') + rcpt["diag_code"] = None + if 'Diagnostic-Code' in subpart: + rcpt["diag_code"] = subpart['Diagnostic-Code'] + rcpt["status"] = None + if 'Status' in subpart: + rcpt["status"] = subpart['Status'] + recipients.append(rcpt) + return recipients + + # Not registered/used callbacks + @Milter.nocallback + def hello(self, heloname): + return Milter.CONTINUE + @Milter.nocallback + def data(self): + return Milter.CONTINUE + + def connect(self, IPname, family, hostaddr): + print("CONN: Client: {}".format(hostaddr[0])) + return Milter.CONTINUE + + # Mandatory callback + def envfrom(self, mailfrom, *str): + print("MAIL FROM: {}".format(mailfrom)) + self.mail_data = "" + return Milter.CONTINUE + + # Mandatory callback + def envrcpt(self, to, *str): + print("RCPT TO: {}".format(to)) + return Milter.CONTINUE + + def header(self, name, hval): + print("HDR: {0}: {1}".format(name, hval)) + self.mail_data += "{0}: {1}\n".format(name, hval) + return Milter.CONTINUE + + def eoh(self): + self.mail_data += "\n" + return Milter.CONTINUE + + def body(self, chunk): + self.mail_data += chunk.decode() + return Milter.CONTINUE + + def eom(self): + dsn_details = self.process_dsn(self.mail_data) + for d in dsn_details: + print(json.dumps(d)) + return Milter.CONTINUE + + def close(self): + print("CLOSE") + self.mail_data = "" + return Milter.CONTINUE + +if __name__ == "__main__": + try: + timeout = 600 + Milter.factory = DsnProcessorMilter + print("Starting dsn-processor-milter...") + Milter.runmilter("dsn-processor-milter", "inet:4321@127.0.0.1" , timeout, True) + except: + print("MAIN-EXCEPTION: {}".format(traceback.format_exc())) + sys.exit(1) \ No newline at end of file diff --git a/requirements.txt b/requirements.txt new file mode 100644 index 0000000..404f939 --- /dev/null +++ b/requirements.txt @@ -0,0 +1 @@ +pymilter \ No newline at end of file diff --git a/tests/DELAY.eml b/tests/DELAY.eml new file mode 100644 index 0000000..1bb62d5 --- /dev/null +++ b/tests/DELAY.eml @@ -0,0 +1,95 @@ +Return-Path: <> +Delivered-To: cms@example.com +Received: from mailbox-proxy-prod-1.mailbox-proxy-prod.prod.svc.cluster.local ([10.42.4.0]) + by mailbox-prod-0.mailbox.prod.svc.cluster.local with LMTP + id 5/PjHmrAdGWpCwIAoCegqg:P1 + (envelope-from <>) + for ; Sat, 09 Dec 2023 20:30:50 +0100 +Received: from mailout.example.com ([10.42.4.0]) + by mailbox-proxy-prod-1.mailbox-proxy-prod.prod.svc.cluster.local with LMTP + id 5/PjHmrAdGWpCwIAoCegqg + (envelope-from <>) + for ; Sat, 09 Dec 2023 20:30:50 +0100 +Received: by mailout.example.com (Postfix) + id 4SndQf2XKYzy; Sat, 9 Dec 2023 20:30:50 +0100 (CET) +Date: Sat, 9 Dec 2023 20:30:50 +0100 (CET) +From: Mail Delivery System +Subject: Delayed Mail (still being retried) +To: cms@example.com +Auto-Submitted: auto-replied +MIME-Version: 1.0 +Content-Type: multipart/report; report-type=delivery-status; + boundary="4SndPw2c5Hzx.1702150250/mailout.example.com" +Content-Transfer-Encoding: 8bit +Message-Id: <4SndQf2XKYzy@mailout.example.com> + +This is a MIME-encapsulated message. + +--4SndPw2c5Hzx.1702150250/mailout.example.com +Content-Description: Notification +Content-Type: text/plain; charset=utf-8 +Content-Transfer-Encoding: 8bit + +This is the mail system at host mailout.example.com. + +#################################################################### +# THIS IS A WARNING ONLY. YOU DO NOT NEED TO RESEND YOUR MESSAGE. # +#################################################################### + +Your message could not be delivered for more than 0 hour(s). +It will be retried until it is 5 day(s) old. + +For further assistance, please send mail to postmaster. + +If you do so, please include this problem report. You can +delete your own text from the attached returned message. + + The mail system + +: host cdxmailin01.blah.blubb[fd00:e50:f155:7::d0] said: + 450 4.2.0 : Recipient address rejected: Sorry, + please retry later. see + https://postmaster.blah.blubb/greylisting/hilfe/blah.blubb.html, servertime=Dec + 09 20:30:50, server=mailin.prod.blah.blubb, client=fd03:4000:21:81b::1 (in + reply to RCPT TO command) + +--4SndPw2c5Hzx.1702150250/mailout.example.com +Content-Description: Delivery report +Content-Type: message/delivery-status + +Reporting-MTA: dns; mailout.example.com +X-Postfix-Queue-ID: 4SndPw2c5Hzx +X-Postfix-Sender: rfc822; cms@example.com +Arrival-Date: Sat, 9 Dec 2023 20:29:45 +0100 (CET) + +Final-Recipient: rfc822; chuck.norris@blah.blubb +Original-Recipient: rfc822;chuck.norris@blah.blubb +Action: delayed +Status: 4.2.0 +Remote-MTA: dns; cdxmailin01.blah.blubb +Diagnostic-Code: smtp; 450 4.2.0 : Recipient address + rejected: Sorry, please retry later. see + https://postmaster.blah.blubb/greylisting/hilfe/blah.blubb.html, servertime=Dec + 09 20:30:50, server=mailin.prod.blah.blubb, client=fd03:4000:21:81b::1 +Will-Retry-Until: Thu, 14 Dec 2023 20:29:45 +0100 (CET) + +--4SndPw2c5Hzx.1702150250/mailout.example.com +Content-Description: Undelivered Message Headers +Content-Type: text/rfc822-headers +Content-Transfer-Encoding: 8bit + +Return-Path: +Received: from x.y (unknown [100.64.121.182]) + (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) + key-exchange X25519 server-signature ECDSA (P-256) server-digest SHA256 + client-signature ECDSA (P-256) client-digest SHA256) + (Client CN "*.securemail.example.com", Issuer "Wonderland Securemail SubCA 2021" (verified OK)) + by mailout.securemail.example.com (Postfix) with ESMTPS id 4SndPw2c5Hzx + for ; Sat, 9 Dec 2023 20:29:45 +0100 (CET) +from: +to: +message-id: +subject: dsn delay test +date: 1234567 + +--4SndPw2c5Hzx.1702150250/mailout.example.com-- diff --git a/tests/FAILURE.eml b/tests/FAILURE.eml new file mode 100644 index 0000000..b470c5d --- /dev/null +++ b/tests/FAILURE.eml @@ -0,0 +1,92 @@ +Return-Path: <> +Delivered-To: matt.stretcher@example.com +Received: from mailbox-proxy-prod-0.mailbox-proxy-prod.prod.svc.cluster.local ([10.42.4.1]) + by mailbox-prod-1.mailbox.prod.svc.cluster.local with LMTP + id h/6fI9SudGUNBQIAOm8Rag:P1 + (envelope-from <>) + for ; Sat, 09 Dec 2023 19:15:48 +0100 +Received: from mailout.example.com ([10.42.4.1]) + by mailbox-proxy-prod-0.mailbox-proxy-prod.prod.svc.cluster.local with LMTP + id h/6fI9SudGUNBQIAOm8Rag + (envelope-from <>) + for ; Sat, 09 Dec 2023 19:15:48 +0100 +Received: by mailout.example.com (Postfix) + id 4Snbm411DRzx; Sat, 9 Dec 2023 19:15:48 +0100 (CET) +Date: Sat, 9 Dec 2023 19:15:48 +0100 (CET) +From: Mail Delivery System +Subject: Undelivered Mail Returned to Sender +To: matt.stretcher@example.com +Auto-Submitted: auto-replied +MIME-Version: 1.0 +Content-Type: multipart/report; report-type=delivery-status; + boundary="4Snblp10ywzv.1702145748/mailout.example.com" +Content-Transfer-Encoding: 8bit +Message-Id: <4Snbm411DRzx@mailout.example.com> + +This is a MIME-encapsulated message. + +--4Snblp10ywzv.1702145748/mailout.example.com +Content-Description: Notification +Content-Type: text/plain; charset=utf-8 +Content-Transfer-Encoding: 8bit + +This is the mail system at host mailout.example.com. + +I'm sorry to have to inform you that your message could not +be delivered to one or more recipients. It's attached below. + +For further assistance, please send mail to postmaster. + +If you do so, please include this problem report. You can +delete your own text from the attached returned message. + + The mail system + +: host cdxmailin02.blah.com[100.64.49.209] said: 554 + 5.7.0 Reject, id=53915-07 - DANGEROUS, servertime=Dec 09 19:15:48, + server=mailin.prod.blah.blubb, client=100.64.121.182 (in reply to end of DATA + command) + +--4Snblp10ywzv.1702145748/mailout.example.com +Content-Description: Delivery report +Content-Type: message/delivery-status + +Reporting-MTA: dns; mailout.example.com +X-Postfix-Queue-ID: 4Snblp10ywzv +X-Postfix-Sender: rfc822; matt.stretcher@example.com +Arrival-Date: Sat, 9 Dec 2023 19:15:34 +0100 (CET) + +Final-Recipient: rfc822; chuck.norris@blah.blubb +Original-Recipient: rfc822;chuck.norris@blah.blubb +Action: failed +Status: 5.7.0 +Remote-MTA: dns; cdxmailin02.blah.com +Diagnostic-Code: smtp; 554 5.7.0 Reject, id=53915-07 - DANGEROUS, + servertime=Dec 09 19:15:48, server=mailin.prod.blah.blubb, + client=100.64.121.182 + +--4Snblp10ywzv.1702145748/mailout.example.com +Content-Description: Undelivered Message +Content-Type: message/rfc822 +Content-Transfer-Encoding: 8bit + +Return-Path: +Received: from nue01.example.com (unknown [100.64.121.182]) + (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) + key-exchange X25519 server-signature ECDSA (P-256) server-digest SHA256 + client-signature ECDSA (P-256) client-digest SHA256) + (Client CN "*.securemail.example.com", Issuer "Wonderland Securemail SubCA 2021" (verified OK)) + by mailout.securemail.example.com (Postfix) with ESMTPS id 4Snblp10ywzv + for ; Sat, 9 Dec 2023 19:15:34 +0100 (CET) +Date: Sat, 09 Dec 2023 19:15:33 +0100 +To: chuck.norris@blah.blubb +From: matt.stretcher@example.com +Subject: test Sat, 09 Dec 2023 19:15:33 +0100 +Message-Id: <20231209191533.001056@nue01.example.com> +X-Mailer: swaks v20201014.0 jetmore.org/john/code/swaks/ + +XJS*C4JDBQADN1.NSBN3*2IDNEN*GTUBE-STANDARD-ANTI-UBE-TEST-EMAIL*C.34X + + + +--4Snblp10ywzv.1702145748/mailout.example.com-- diff --git a/tests/MULTI.eml b/tests/MULTI.eml new file mode 100644 index 0000000..e3624c4 --- /dev/null +++ b/tests/MULTI.eml @@ -0,0 +1,59 @@ +Date: Fri, 8 Jul 1994 09:21:47 -0400 +From: Mail Delivery Subsystem +Subject: Returned mail: User unknown +To: +MIME-Version: 1.0 +Content-Type: multipart/report; report-type=delivery-status; + boundary="JAA13167.773673707/CS.UTK.EDU" + +--JAA13167.773673707/CS.UTK.EDU +content-type: text/plain; charset=us-ascii + + ----- The following addresses had delivery problems ----- + (unrecoverable error) + (unrecoverable error) + +--JAA13167.773673707/CS.UTK.EDU +content-type: message/delivery-status + +Reporting-MTA: dns; cs.utk.edu + +Original-Recipient: rfc822;arathib@vnet.ibm.com +Final-Recipient: rfc822;arathib@vnet.ibm.com +Action: failed +Status: 5.0.0 (permanent failure) +Diagnostic-Code: smtp; 550 'arathib@vnet.IBM.COM' is not a + registered gateway user +Remote-MTA: dns; vnet.ibm.com + +Original-Recipient: rfc822;johnh@hpnjld.njd.hp.com +Final-Recipient: rfc822;johnh@hpnjld.njd.hp.com +Action: delayed +Status: 4.0.0 (hpnjld.njd.jp.com: host name lookup failure) + +Original-Recipient: rfc822;wsnell@sdcc13.ucsd.edu +Final-Recipient: rfc822;wsnell@sdcc13.ucsd.edu +Action: failed +Status: 5.0.0 +Diagnostic-Code: smtp; 550 user unknown +Remote-MTA: dns; sdcc13.ucsd.edu + +Final-Recipient: rfc822; matt.stretcher@gmail.com +Original-Recipient: rfc822;matt.stretcher@gmail.com +Action: relayed +Status: 2.0.0 +Remote-MTA: dns; gmail-smtp-in.l.google.com +Diagnostic-Code: smtp; 250 2.0.0 OK 1702144068 + d13-20020a5d538d000000b003334f34b126si2395393wrv.344 - gsmtp + +Original-Recipient: rfc822;Bob@Example.COM +Final-Recipient: rfc822;Bob@Example.COM +Action: delivered +Status: 2.0.0 + +--JAA13167.773673707/CS.UTK.EDU +content-type: message/rfc822 + +[original message goes here] + +--JAA13167.773673707/CS.UTK.EDU-- \ No newline at end of file diff --git a/tests/MULTI_body.txt b/tests/MULTI_body.txt new file mode 100644 index 0000000..1129fe0 --- /dev/null +++ b/tests/MULTI_body.txt @@ -0,0 +1,51 @@ +--JAA13167.773673707/CS.UTK.EDU +content-type: text/plain; charset=us-ascii + + ----- The following addresses had delivery problems ----- + (unrecoverable error) + (unrecoverable error) + +--JAA13167.773673707/CS.UTK.EDU +content-type: message/delivery-status + +Reporting-MTA: dns; cs.utk.edu + +Original-Recipient: rfc822;arathib@vnet.ibm.com +Final-Recipient: rfc822;arathib@vnet.ibm.com +Action: failed +Status: 5.0.0 (permanent failure) +Diagnostic-Code: smtp; 550 'arathib@vnet.IBM.COM' is not a + registered gateway user +Remote-MTA: dns; vnet.ibm.com + +Original-Recipient: rfc822;johnh@hpnjld.njd.hp.com +Final-Recipient: rfc822;johnh@hpnjld.njd.hp.com +Action: delayed +Status: 4.0.0 (hpnjld.njd.jp.com: host name lookup failure) + +Original-Recipient: rfc822;wsnell@sdcc13.ucsd.edu +Final-Recipient: rfc822;wsnell@sdcc13.ucsd.edu +Action: failed +Status: 5.0.0 +Diagnostic-Code: smtp; 550 user unknown +Remote-MTA: dns; sdcc13.ucsd.edu + +Final-Recipient: rfc822; matt.stretcher@gmail.com +Original-Recipient: rfc822;matt.stretcher@gmail.com +Action: relayed +Status: 2.0.0 +Remote-MTA: dns; gmail-smtp-in.l.google.com +Diagnostic-Code: smtp; 250 2.0.0 OK 1702144068 + d13-20020a5d538d000000b003334f34b126si2395393wrv.344 - gsmtp + +Original-Recipient: rfc822;Bob@Example.COM +Final-Recipient: rfc822;Bob@Example.COM +Action: delivered +Status: 2.0.0 + +--JAA13167.773673707/CS.UTK.EDU +content-type: message/rfc822 + +[original message goes here] + +--JAA13167.773673707/CS.UTK.EDU-- \ No newline at end of file diff --git a/tests/SUCCESS.eml b/tests/SUCCESS.eml new file mode 100644 index 0000000..69eca61 --- /dev/null +++ b/tests/SUCCESS.eml @@ -0,0 +1,122 @@ +Return-Path: <> +Delivered-To: matt.stretcher@example.com +Received: from mailbox-proxy-prod-1.mailbox-proxy-prod.prod.svc.cluster.local ([10.42.4.0]) + by mailbox-prod-0.mailbox.prod.svc.cluster.local with LMTP + id GffUKkSodGX7BQIAoCegqg:P1 + (envelope-from <>) + for ; Sat, 09 Dec 2023 18:47:49 +0100 +Received: from mailout.example.com ([10.42.4.0]) + by mailbox-proxy-prod-1.mailbox-proxy-prod.prod.svc.cluster.local with LMTP + id GffUKkSodGX7BQIAoCegqg + (envelope-from <>) + for ; Sat, 09 Dec 2023 18:47:48 +0100 +Received: by mailout.example.com (Postfix) + id 4Snb7m3SkNzy; Sat, 9 Dec 2023 18:47:48 +0100 (CET) +Date: Sat, 9 Dec 2023 18:47:48 +0100 (CET) +From: Mail Delivery System +Subject: Successful Mail Delivery Report +To: matt.stretcher@example.com +Auto-Submitted: auto-replied +MIME-Version: 1.0 +Content-Type: multipart/report; report-type=delivery-status; + boundary="4Snb7l0BLyzv.1702144068/mailout.example.com" +Content-Transfer-Encoding: 8bit +Message-Id: <4Snb7m3SkNzy@mailout.example.com> + +This is a MIME-encapsulated message. + +--4Snb7l0BLyzv.1702144068/mailout.example.com +Content-Description: Notification +Content-Type: text/plain; charset=utf-8 +Content-Transfer-Encoding: 8bit + +This is the mail system at host mailout.example.com. + +Your message was successfully delivered to the destination(s) +listed below. If the message was delivered to mailbox you will +receive no further notifications. Otherwise you may still receive +notifications of mail delivery errors from other systems. + + The mail system + +: delivery via + gmail-smtp-in.l.google.com[108.177.15.27]:25: 250 2.0.0 OK 1702144068 + d13-20020a5d538d000000b003334f34b126si2395393wrv.344 - gsmtp + +--4Snb7l0BLyzv.1702144068/mailout.example.com +Content-Description: Delivery report +Content-Type: message/delivery-status + +Reporting-MTA: dns; mailout.example.com +Original-Envelope-Id: +X-Postfix-Queue-ID: 4Snb7l0BLyzv +X-Postfix-Sender: rfc822; matt.stretcher@example.com +Arrival-Date: Sat, 9 Dec 2023 18:47:46 +0100 (CET) + +Final-Recipient: rfc822; matt.stretcher@gmail.com +Original-Recipient: rfc822;matt.stretcher@gmail.com +Action: relayed +Status: 2.0.0 +Remote-MTA: dns; gmail-smtp-in.l.google.com +Diagnostic-Code: smtp; 250 2.0.0 OK 1702144068 + d13-20020a5d538d000000b003334f34b126si2395393wrv.344 - gsmtp + +--4Snb7l0BLyzv.1702144068/mailout.example.com +Content-Description: Message Headers +Content-Type: text/rfc822-headers +Content-Transfer-Encoding: 8bit + +Return-Path: +Received: from mailsubmission.securemail.example.com (nue02.example.com [100.64.120.225]) + (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) + key-exchange X25519 server-signature ECDSA (P-256) server-digest SHA256 + client-signature ECDSA (P-256) client-digest SHA256) + (Client CN "*.securemail.example.com", Issuer "Wonderland Securemail SubCA 2021" (verified OK)) + by mailout.securemail.example.com (Postfix) with ESMTPS id 4Snb7l0BLyzv + for ; Sat, 9 Dec 2023 18:47:46 +0100 (CET) +Received: from [192.168.178.140] (pd9540e9c.dip0.t-ipconnect.de [217.84.14.156]) + (using TLSv1.3 with cipher TLS_AES_128_GCM_SHA256 (128/128 bits) + key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256) + (No client certificate requested) + by mailsubmission-zdf.example.com (Postfix) with ESMTPSA id 4Snb7h6DF1zt + for ; Sat, 9 Dec 2023 18:47:44 +0100 (CET) +DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=example.com; + s=mailout-zdf; t=1702144066; + bh=ygpECpd+h4jAzrDCla9AX7n1iYKRzUCDUpwL+Ez/e9c=; + h=Date:MIME-Version:To:From:Subject:Content-Type; + b=CBsJdAjUkBQ1js93C3u2kWKL86L6TPGn4kjnqzOoB1Xv99wL96R/GG2Rq75pR6fPC + EsfSR/GmqB9v6wZd1PKKobC2DOfy4/5n4Q3HsSsJNSEv3Y5jqphLFgRxDiPtTxh78u + gFvHAxnPwGuWASQpMdGYA6C76BTxxXOXZwCifh5Y= +Authentication-Results: mailsubmission-zdf.example.com; + auth=pass smtp.auth=matt.stretcher@example.com smtp.mailfrom=matt.stretcher@example.com +Message-ID: +Date: Sat, 9 Dec 2023 18:47:43 +0100 +MIME-Version: 1.0 +User-Agent: Mozilla Thunderbird +Content-Language: en-US +To: matt.stretcher Gmail +From: matt.stretcher +Subject: DSN SUCCESS request +Content-Type: text/plain; charset=UTF-8; format=flowed +Content-Transfer-Encoding: 7bit +X-Spamd-Bar: / +X-Spamd-Result: default: False [-0.09 / 5.00]; + MIME_GOOD(-0.10)[text/plain]; + XM_UA_NO_VERSION(0.01)[]; + FREEMAIL_TO(0.00)[gmail.com]; + RCVD_COUNT_ZERO(0.00)[0]; + ASN(0.00)[asn:3320, ipnet:217.80.0.0/12, country:DE]; + ARC_NA(0.00)[]; + MID_RHS_MATCH_FROM(0.00)[]; + FREEMAIL_ENVRCPT(0.00)[gmail.com]; + TO_DN_ALL(0.00)[]; + FROM_HAS_DN(0.00)[]; + MIME_TRACE(0.00)[0:+]; + FROM_EQ_ENVFROM(0.00)[]; + TO_MATCH_ENVRCPT_ALL(0.00)[]; + RCPT_COUNT_ONE(0.00)[1] +X-Rspamd-Action: no action +X-Rspamd-Server: mailscan-prod-0 +X-Rspamd-Queue-Id: 4Snb7h6DF1zt + +--4Snb7l0BLyzv.1702144068/mailout.example.com-- diff --git a/tests/miltertest_multi.lua b/tests/miltertest_multi.lua new file mode 100644 index 0000000..75e5a30 --- /dev/null +++ b/tests/miltertest_multi.lua @@ -0,0 +1,70 @@ +-- https://mopano.github.io/sendmail-filter-api/constant-values.html#com.sendmail.milter.MilterConstants +-- http://www.opendkim.org/miltertest.8.html + +conn = mt.connect("inet:4321@127.0.0.1") +if conn == nil then + error "mt.connect() failed" +end +if mt.conninfo(conn, "localhost", "::1") ~= nil then + error "mt.conninfo() failed" +end + +mt.set_timeout(3) + +-- 5321.FROM +if mt.mailfrom(conn, "<>") ~= nil then + error "mt.mailfrom() failed" +end +if mt.getreply(conn) ~= SMFIR_CONTINUE then + error "mt.mailfrom() unexpected reply" +end + +-- 5321.RCPT+MACROS +mt.macro(conn, SMFIC_RCPT, "i", "4CgSNs5Q9sz7SllQ") +if mt.rcptto(conn, "") ~= nil then + error "mt.rcptto() failed" +end +if mt.getreply(conn) ~= SMFIR_CONTINUE then + error "mt.rcptto() unexpected reply" +end + +--mt.data(conn) + +-- HEADERS +if mt.header(conn, "From", '"MAILER DAEMON" ') ~= nil then + error "mt.header(From) failed" +end +if mt.header(conn, "MIME-Version", "1.0") ~= nil then + error "mt.header(MIME-Version) failed" +end +if mt.header(conn, "Content-Type", "multipart/report; report-type=delivery-status;\n\tboundary=\"JAA13167.773673707/CS.UTK.EDU\"") ~= nil then + error "mt.header(Content-Type) failed" +end + +-- BODY +if mt.bodyfile(conn, "MULTI_body.txt") ~= nil then + error "mt.bodyfile() failed" +end +if mt.getreply(conn) ~= SMFIR_CONTINUE then + error "mt.bodyfile() unexpected reply" +end + +-- EOM +if mt.eom(conn) ~= nil then + error "mt.eom() failed" +end +mt.echo("EOM: " .. mt.getreply(conn)) +if mt.getreply(conn) == SMFIR_CONTINUE then + mt.echo("EOM-continue") +elseif mt.getreply(conn) == SMFIR_REPLYCODE then + mt.echo("EOM-reject") +end + +if not mt.eom_check(conn, MT_HDRADD, "X-ExOTA-Authentication-Results") then + mt.echo("no header added") +else + mt.echo("X-ExOTA-Authentication-Results header added") +end + +-- DISCONNECT +mt.disconnect(conn) \ No newline at end of file