def run(self): log = logging.getLogger("ExpenseHelper") username = self.config_provider.username password = self.password_provider(username) with self.imap_factory(self.config_provider.imap_server).create_connection( username, password ) as imap_connection: email_categorizer = EmailCategorizerFactory.create(self.config_provider) expense_inboxes = fetch_expense_inboxes(imap_connection, self.config_provider) categorized_emails = [] for inbox in expense_inboxes: emails = imap_connection.read_from( inbox, gmail_query="-label:%s %s" % ( self.config_provider.delivered_label, self.config_provider.attachment_only and "has:attachment" or "", ), fetch_options="(RFC822)", ) categorized_emails.extend(email_categorizer.categorize(inbox, emails)) log.info("categorized [%d] emails...now filtering..." % (len(categorized_emails))) forward_candidates = map( EmailCleanup( self.config_provider.sender, self.config_provider.receiver, self.config_provider.subject_pattern ).prepare_outbound, filter(EmailFilterHandler(self.config_provider).filter_candidate, categorized_emails), ) answer = self.confirmation_provider(forward_candidates) if answer: with self.smtp_factory(self.config_provider.smtp_server).create_connection( username, password ) as smtp_connection: for email in forward_candidates: imap_connection.copy_to_inbox(email, "[Gmail]/Sent Mail") smtp_connection.email(email) imap_connection.copy_to_inbox(email, self.config_provider.delivered_label) else: log.warn("doing nothing. bye")
def test_categorize_email(self): email_categorizer = EmailCategorizerFactory.create(DefaultConfiguration()) categorized_emails = email_categorizer.categorize('spesen/KKAR', (dummy_mail(), )) assert 1 == len(categorized_emails), categorized_emails assert 'KKAR' == categorized_emails[0]['categorized']['payment_type'], categorized_emails[0]['categorized'] assert 'K11' == categorized_emails[0]['categorized']['costcenter'], categorized_emails[0]['categorized']['costcenter']