from . import imap from . import interface from . import hooks import confparser import os import traceback def on_email(content, hooks, conf): print('▬▬▬▬▬▬▬▶') context = dict( conf=conf, content=content, ) try: for hook in hooks: print('on_email, calling hook {}'.format(hook.__name__)) hook(context) print('on_email, end of hook {}'.format(hook.__name__)) except interface.HookStopIteration: print('hook wanted to stop processing for current email') traceback.print_exc() print('◀▬▬▬▬▬▬▬') def conf_boolean_postprocess(src): src = src.lower().strip() if src == 'true' or src == 'on' or src == '1': return True return False def conf_postprocess(conf): d = { 'imap.tls': conf_boolean_postprocess, 'imap.start_tls': conf_boolean_postprocess, 'imap.tls_nocheck_hostname': conf_boolean_postprocess, 'imap.tls_nocheck_ca': conf_boolean_postprocess, } return {key: d[key](value) if key in d else value for key, value in conf.items()} def main(): confpath = os.path.expanduser('~/.config/climl/climl.cfg') conf = conf_postprocess(confparser.read_conf(confpath)) hooksfuncs = ( hooks.hook_extract_email_from_content, hooks.hook_extract_listname, hooks.hook_check_ml_restrictions, # open/private ml hooks.hook_validate_poster, hooks.hook_process_subscribe_queries, hooks.hook_generate_rcpt_list, hooks.hook_modify_reply_to, hooks.hook_send_all, ) print('starting imap.main loop') try: imap.main(lambda content: on_email(content, hooksfuncs, conf), conf=conf) except KeyboardInterrupt: pass print('end of main imap loop')