Source code for i3pystatus.mail.ews

import exchangelib
import contextlib
import time

from i3pystatus.mail import Backend


[docs]class ExchangeMailAccount(Backend): """ Checks for mail on an Exchange account. Requires the python exchangelib library - https://github.com/ecederstrand/exchangelib. """ settings = ( ("host", 'The url to connect to. If unset, autodiscover is tried with the email address domain. If set, autodiscover is disabled.'), "username", "password", "email_address", ('keyring_backend', 'alternative keyring backend for retrieving credentials'), ) required = ("username", "password", "email_address") keyring_backend = None host = None account = None last = 0 @contextlib.contextmanager def ensure_connection(self): try: if not self.account: credentials = exchangelib.ServiceAccount( username=self.username, password=self.password) if self.host: config = exchangelib.Configuration( server=self.host, credentials=credentials) self.account = exchangelib.Account( primary_smtp_address=self.email_address, config=config, autodiscover=False, access_type=exchangelib.DELEGATE) else: self.account = exchangelib.Account( primary_smtp_address=self.email_address, credentials=credentials, autodiscover=True, access_type=exchangelib.DELEGATE) yield except Exception as e: # NOTE(sileht): retry just once if the connection have been # broken to ensure this is not a sporadic connection lost. # Like wifi reconnect, sleep wake up # Wait a bit when disconnection occurs to not hog the cpu self.logger.warn(e) time.sleep(1) self.connection = None def count_new_mail(self): self.account.inbox.refresh() self.last = self.account.inbox.unread_count @property def unread(self): with self.ensure_connection(): self.count_new_mail() return self.last
Backend = ExchangeMailAccount