We want to avoid deserialising message contents, because Python's email module might produce different representation than the MUA sending original message. The result would be a transformed message, which could mean broken message in certain conditions.
33 lines
1,021 B
Python
33 lines
1,021 B
Python
from aiosmtpd.smtp import Envelope
|
|
from email import message_from_bytes
|
|
from email.message import EmailMessage
|
|
from email.parser import BytesHeaderParser
|
|
from email.policy import SMTPUTF8
|
|
|
|
class LazyMessage:
|
|
def __init__(self, recipients, content_provider):
|
|
self._content_provider = content_provider
|
|
self._recipients = recipients
|
|
self._headers = None
|
|
self._message = None
|
|
|
|
def get_original_content(self) -> bytes:
|
|
return self._content_provider()
|
|
|
|
def get_recipients(self):
|
|
return self._recipients
|
|
|
|
def get_headers(self) -> EmailMessage:
|
|
if self._message:
|
|
return self._message
|
|
|
|
if not self._headers:
|
|
self._headers = BytesHeaderParser(policy=SMTPUTF8).parsebytes(self.get_original_content())
|
|
|
|
return self._headers
|
|
|
|
def get_message(self) -> EmailMessage:
|
|
if not self._message:
|
|
self._message = message_from_bytes(self.get_original_content(), policy=SMTPUTF8)
|
|
|
|
return self._message
|