import asyncio import uvloop from aiosmtpd.controller import Controller # handler that just prints the message content class PrintHandler: async def handle_DATA(self, server, session, envelope): print("Message from:", envelope.mail_from) print("Recipients:", envelope.rcpt_tos) print("Message data:") print(envelope.content.decode('utf8', errors='replace')) print("End of message") # Respond with a success code return '250 Message accepted for delivery' # uvloop for better performance asyncio.set_event_loop_policy(uvloop.EventLoopPolicy()) def run_server(): # SMTP server controller, binding to localhost on port 25 controller = Controller(PrintHandler(), hostname='127.0.0.1', port=25) controller.start() print("SMTP server running on port 25. Press Ctrl+C to stop.") try: # Run forever asyncio.get_event_loop().run_forever() except KeyboardInterrupt: pass finally: controller.stop() if __name__ == '__main__': run_server()