Source code for powerline.segments.common.mail

import re

from imaplib import IMAP4_SSL_PORT, IMAP4_SSL, IMAP4
from collections import namedtuple

from powerline.lib.threaded import KwThreadedSegment
from powerline.segments import with_docstring


_IMAPKey = namedtuple('Key', 'username password server port folder use_ssl')


[docs]class EmailIMAPSegment(KwThreadedSegment): interval = 60 @staticmethod def key(username, password, server='imap.gmail.com', port=IMAP4_SSL_PORT, folder='INBOX', use_ssl=None, **kwargs): if use_ssl is None: use_ssl = (port == IMAP4_SSL_PORT) return _IMAPKey(username, password, server, port, folder, use_ssl) def compute_state(self, key): if not key.username or not key.password: self.warn('Username and password are not configured') return None if key.use_ssl: mail = IMAP4_SSL(key.server, key.port) else: mail = IMAP4(key.server, key.port) mail.login(key.username, key.password) rc, message = mail.status(key.folder, '(UNSEEN)') unread_str = message[0].decode('utf-8') unread_count = int(re.search('UNSEEN (\d+)', unread_str).group(1)) return unread_count @staticmethod def render_one(unread_count, max_msgs=None, **kwargs): if not unread_count: return None elif type(unread_count) != int or not max_msgs: return [{ 'contents': str(unread_count), 'highlight_groups': ['email_alert'], 'click_values': {'unread_count': str(unread_count)} }] else: return [{ 'contents': str(unread_count), 'highlight_groups': ['email_alert_gradient', 'email_alert'], 'gradient_level': min(unread_count * 100.0 / max_msgs, 100), 'click_values': {'unread_count': str(unread_count)} }]
email_imap_alert = with_docstring(EmailIMAPSegment(), ('''Return unread e-mail count for IMAP servers. :param str username: login username :param str password: login password :param str server: e-mail server :param int port: e-mail server port :param str folder: folder to check for e-mails :param int max_msgs: Maximum number of messages. If there are more messages then max_msgs then it will use gradient level equal to 100, otherwise gradient level is equal to ``100 * msgs_num / max_msgs``. If not present gradient is not computed. :param bool use_ssl: If ``True`` then use SSL connection. If ``False`` then do not use it. Default is ``True`` if port is equal to {ssl_port} and ``False`` otherwise. Highlight groups used: ``email_alert_gradient`` (gradient), ``email_alert``. Click values supplied: ``unread_count`` (string) ''').format(ssl_port=IMAP4_SSL_PORT))