from time import sleep import requests from aiosmtpd.controller import Controller from configargparse import ArgParser from xdg import xdg_config_home def parse_args(): parser = ArgParser(default_config_files=['/etc/libertyforward/*.conf', str(xdg_config_home() / 'LibertyTechForce' / 'libertyforward.conf')]) parser.add('-c', '--config', is_config_file=True, help='config file path', env_var='LF_CONFIG_FILE') parser.add('--mailer', help='name of the mailer backend to use', env_var='LF_MAILER') parser.add('--api-token', help='token to use to authenticate against API', env_var='LF_API_TOKEN') return parser.parse_args() class MailerHandlerMixin: """Base class for the mail handlers""" _api_token = None @property def api_token(self): return self._api_token @api_token.setter def api_token(self, value): self._api_token = value class KingMailerHandler(object): async def handle_DATA(self, server, session, envelope): print('Incoming mesage from: {}'.format(envelope.mail_from), flush=True) payload = { 'mail_from': envelope.mail_from, 'rcpt_to': envelope.rcpt_tos, 'data': envelope.content } headers = {'X-Server-API-Key': self.api_token} response = requests.post('https://api.kingmailer.co/api/v1/send/raw', data=payload, headers=headers) print(response) if response.ok: print('Message accepted', flush=True) return '250 Message accepted for delivery' else: print('Could not process', flush=True) return '500 Could not process your message' if __name__ == '__main__': print('Starting LibertyForward', flush=True) args = parse_args() handler = KingMailerHandler() handler.api_token = args.api_token controller = Controller(handler, hostname='127.0.0.1', port=25) print('Starting controller thread', flush=True) controller.start() while True: try: sleep(1) except: break