def setUp(self): handler = Proxy('localhost', 9025) controller = DecodingController(handler) controller.start() self.addCleanup(controller.stop) self.address = (controller.hostname, controller.port) self.source = """\
def setUp(self): # There are two controllers and two SMTPd's running here. The # "upstream" one listens on port 9025 and is connected to a "data # handler" which captures the messages it receives. The second -and # the one under test here- listens on port 9024 and proxies to the one # on port 9025. Because we need to set the decode_data flag # differently for each different test, the controller of the proxy is # created in the individual tests, not in the setup. self.upstream = DataHandler() upstream_controller = Controller(self.upstream, port=9025) upstream_controller.start() self.addCleanup(upstream_controller.stop) self.proxy = Proxy(upstream_controller.hostname, 9025) self.source = """\ From: Anne Person <*****@*****.**> To: Bart Person <*****@*****.**> Subject: A test Testing """ # The upstream SMTPd will always receive the content as bytes # delimited with CRLF. self.expected = CRLF.join([ 'From: Anne Person <*****@*****.**>', 'To: Bart Person <*****@*****.**>', 'Subject: A test', 'X-Peer: ::1', '', 'Testing\r\n']).encode('ascii')
def setUp(self): self.stream = StringIO() handler = Proxy('localhost', 9025) controller = UTF8Controller(handler) controller.start() self.addCleanup(controller.stop) self.address = (controller.hostname, controller.port) self.message = """\
def proxy_decoding_controller( upstream_controller, get_controller ) -> Generator[Union[Controller, KnowsUpstream], None, None]: proxy_handler = Proxy(upstream_controller.hostname, upstream_controller.port) proxy_controller = get_controller(proxy_handler, decode_data=True) proxy_controller.upstream = upstream_controller proxy_controller.start() Global.set_addr_from(proxy_controller) # yield proxy_controller # proxy_controller.stop()
#!/usr/bin/env python import os, email, logging, asyncio from email.mime.text import MIMEText from aiosmtpd.handlers import Proxy from aiosmtpd.controller import Controller proxy = Proxy(os.environ.get("REMOTE_HOSTNAME", "mail-relay"), os.environ.get("REMOTE_PORT", 587)) class FixerHandler: async def handle_DATA(self, server, session, envelope): print("Message from {} to {}".format(envelope.mail_from, envelope.rcpt_tos)) msg = email.message_from_string(envelope.content.decode("utf-8")) if msg.get_content_maintype() != "text": content_types = [ part.get_content_type() for part in msg.get_payload() ] if len([ ct for ct in content_types if any(body_cts in ct for body_cts in ["plain", "html"]) ]) == 0: msg.set_payload([MIMEText("--", "plain")] + msg.get_payload()) envelope.content = msg.as_string() envelope.original_content = msg.as_string().encode("utf-8") print("Inserted TextBody '--'") return await proxy.handle_DATA(server, session, envelope) async def amain(loop):