Source code for libqtile.widget.imapwidget

import imaplib
import re

import keyring

from libqtile.confreader import ConfigError
from libqtile.log_utils import logger
from libqtile.widget import base


[docs] class ImapWidget(base.BackgroundPoll): """Email IMAP widget This widget will scan one of your imap email boxes and report the number of unseen messages present. I've configured it to only work with imap with ssl. Your password can be obtained from the Gnome Keyring. Writing your password to the keyring initially is as simple as (changing out <userid> and <password> for your userid and password): 1) create the file ~/.local/share/python_keyring/keyringrc.cfg with the following contents:: [backend] default-keyring=keyring.backends.Gnome.Keyring keyring-path=/home/<userid>/.local/share/keyring/ 2) Execute the following python shell script once:: #!/usr/bin/env python3 import keyring user = <userid> password = <password> keyring.set_password('imapwidget', user, password) mbox names must include the path to the mbox (except for the default INBOX). So, for example if your mailroot is ``~/Maildir``, and you want to look at the mailbox at HomeMail/fred, the mbox setting would be: ``mbox="~/Maildir/HomeMail/fred"``. Note the nested sets of quotes! Labels can be whatever you choose, of course. If you want you can give password directly then Gnome Keyring will not be used. Widget requirements: keyring_. .. _keyring: https://pypi.org/project/keyring/ """ defaults = [ ("mbox", '"INBOX"', "mailbox to fetch"), ("label", "INBOX: ", "label for display"), ("user", None, "email username"), ("password", None, "email password"), ("server", None, "email server name"), ("hide_no_unseen", False, "hide when there are no unseen messages"), ] def __init__(self, **config): base.BackgroundPoll.__init__(self, "", **config) self.add_defaults(ImapWidget.defaults) if self.user is None: raise ConfigError("You must set the 'user' parameter for the IMAP widget.") if self.password is None: password = keyring.get_password("imapwidget", self.user) if password is not None: self.password = password else: logger.critical("Gnome Keyring Error") def poll(self): im = imaplib.IMAP4_SSL(self.server, 993) if self.password is None: text = "No password error" else: im.login(self.user, self.password) status, response = im.status(self.mbox, "(UNSEEN)") im.logout() text = response[0].decode() count = re.sub(r"\).*$", "", re.sub(r"^.*N\s", "", text)) if count == "0" and self.hide_no_unseen: return "" text = self.label + count return text