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']