Python 100 project #35: Catch All Mail Server

Most of the network device has some kind of notification system, and usually notification media is either Email or SNMP. Email is way too slow if anything really happens, while SNMP the function is limited and not flexible enough. So in the later phase, I want to get those email notification posted to Slack. I can use the email integration of the Slack itself, but I decided to make one by myself so that the service can be utilized for other services as well.

First I made a simple SMTP server to catch all the email. This project simply print out the email body it receives.

Output Example:

$ python3 
server running...
("<html><head><meta http-equiv='Content-Type' content='text/html; "
 "charset=UTF-8'/><title></title></head><body> Hooray!!<br><br>mail server is "
 'now working!</body></html>')
from: SEGFW_INT@Home.local


Here is the code:

import base64
from pprint import pprint

import aiosmtpd.controller
import asyncio
import email

class CustomSMTPHandler:
    async def handle_DATA(self, server, session, envelope):
        b = email.message_from_string(str(envelope.content,'utf-8'))
        if b.is_multipart():
            payloads = ""
            for payload in b.get_payload():
                payloads += payload.get_payload()
            decoded_payloads = base64.b64decode(payloads)

            decoded_payloads = base64.b64decode(b.get_payload())
        pprint(str(decoded_payloads, 'utf-8'))
        print('from:', envelope.mail_from)
        return '250 OK'

async def main(loop):
    handler = CustomSMTPHandler()
    server = aiosmtpd.controller.Controller(handler,hostname='', port=8025)

if __name__ == '__main__':
    loop = asyncio.get_event_loop()
        print("server running...")
    except KeyboardInterrupt: