Skip to content
Snippets Groups Projects
Commit 892a1502 authored by Martin Mareš's avatar Martin Mareš
Browse files

DSN: process-dsn už nepotřebujeme

parent a6b4fd87
No related branches found
No related tags found
No related merge requests found
#!/usr/bin/env python3
# XXX: Work in progress :XXX
import email.message
import email.parser
import email.policy
import sys
# import mo.db as db
# import mo.email
# import mo.users
import mo.util
mo.util.init_standalone()
class DSN:
msg: email.message.EmailMessage
message_id: str
parse_status: str
dsn_action: str
dsn_status: str
def __init__(self):
parser = email.parser.Parser(policy=email.policy.default)
self.msg = parser.parse(sys.stdin)
self.message_id = (self.msg['Message-Id'] or '?').strip()
self.dsn_action = '?'
self.dsn_status = '?'
self.parse_status = self.parse_dsn()
def parse_dsn(self) -> str:
if self.msg.get_content_type() != 'multipart/report':
return 'unexpected content-type'
if not self.msg.is_multipart():
return 'not multipart'
report_type = self.msg['Content-type'].params.get('report-type', '?')
if report_type != 'delivery-status':
return 'unknown report-type'
if len(self.msg.get_payload()) < 2:
return 'too few parts'
part2 = self.msg.get_payload(1)
if part2.get_content_type() != 'message/delivery-status':
return 'unexpected part 2 type'
dsn = part2.get_payload()
if len(dsn) < 2:
return 'DSN too short'
# main = dsn[0]
per_addr = dsn[1]
self.dsn_action = per_addr['Action']
self.dsn_status = per_addr['Status']
if self.dsn_action != 'failed':
return 'not failed'
print(self.msg.get_payload(2).get_content_type())
return 'ok'
dsn = DSN()
print(f'DSN: {dsn.message_id} {dsn.parse_status} {dsn.dsn_action} {dsn.dsn_status}')
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment