Source code for powerline.segments.common.mail
# vim:fileencoding=utf-8:noet
from __future__ import (unicode_literals, division, absolute_import, print_function)
import os
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, username_variable='', password_variable='', server_variable='', port_variable='', folder='INBOX', use_ssl=None, **kwargs):
if use_ssl is None:
use_ssl = (port == IMAP4_SSL_PORT)
# catch if user set custom mail credential env variables
if username_variable:
username = os.environ[username_variable]
if password_variable:
password = os.environ[password_variable]
if server_variable:
server = os.environ[server_variable]
if port_variable:
port = os.environ[port_variable]
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(r'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'],
}]
else:
return [{
'contents': str(unread_count),
'highlight_groups': ['email_alert_gradient', 'email_alert'],
'gradient_level': min(unread_count * 100.0 / max_msgs, 100),
}]
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 username_variable:
name of environment variable to check for login username
:param str password_variable:
name of environment variable to check for login password
:param str server_variable:
name of environment variable to check for email server
:param str port_variable:
name of environment variable to check for email 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``.
''').format(ssl_port=IMAP4_SSL_PORT))