Fixed var names in documentation of query keywords moved Messages and Imbox to their own modules, imported Imbox.imbox into __init__.py and put it in __all__. fixes #130. clarified in documentation and Imbox.messages logging that, unless a folder is specified in the kwargs to Imbox.messages, the returned messages will be from the inbox. In the documentation this is accomplished exclusively by the var names. fixes #128. amended `8df7d7c` to reflect manual changes made to `README.rst` in current master, but also added `inbox_` to several var names to make that explicit in the documentation. Added flags to messages returned by `fetch_email_by_uid`, using the new function `parse_flags` in `parser.py`. Fixes #126. added TODO back into query.py
72 lines
2.5 KiB
Python
72 lines
2.5 KiB
Python
from imbox.imap import ImapTransport
|
|
from imbox.messages import Messages
|
|
|
|
import logging
|
|
|
|
logger = logging.getLogger(__name__)
|
|
|
|
|
|
class Imbox:
|
|
|
|
def __init__(self, hostname, username=None, password=None, ssl=True,
|
|
port=None, ssl_context=None, policy=None, starttls=False):
|
|
|
|
self.server = ImapTransport(hostname, ssl=ssl, port=port,
|
|
ssl_context=ssl_context, starttls=starttls)
|
|
self.hostname = hostname
|
|
self.username = username
|
|
self.password = password
|
|
self.parser_policy = policy
|
|
self.connection = self.server.connect(username, password)
|
|
logger.info("Connected to IMAP Server with user {username} on {hostname}{ssl}".format(
|
|
hostname=hostname, username=username, ssl=(" over SSL" if ssl or starttls else "")))
|
|
|
|
def __enter__(self):
|
|
return self
|
|
|
|
def __exit__(self, type, value, traceback):
|
|
self.logout()
|
|
|
|
def logout(self):
|
|
self.connection.close()
|
|
self.connection.logout()
|
|
logger.info("Disconnected from IMAP Server {username}@{hostname}".format(
|
|
hostname=self.hostname, username=self.username))
|
|
|
|
def mark_seen(self, uid):
|
|
logger.info("Mark UID {} with \\Seen FLAG".format(int(uid)))
|
|
self.connection.uid('STORE', uid, '+FLAGS', '(\\Seen)')
|
|
|
|
def mark_flag(self, uid):
|
|
logger.info("Mark UID {} with \\Flagged FLAG".format(int(uid)))
|
|
self.connection.uid('STORE', uid, '+FLAGS', '(\\Flagged)')
|
|
|
|
def delete(self, uid):
|
|
logger.info("Mark UID {} with \\Deleted FLAG and expunge.".format(int(uid)))
|
|
self.connection.expunge()
|
|
|
|
def copy(self, uid, destination_folder):
|
|
logger.info("Copy UID {} to {} folder".format(int(uid), str(destination_folder)))
|
|
return self.connection.uid('COPY', uid, destination_folder)
|
|
|
|
def move(self, uid, destination_folder):
|
|
logger.info("Move UID {} to {} folder".format(int(uid), str(destination_folder)))
|
|
if self.copy(uid, destination_folder):
|
|
self.delete(uid)
|
|
|
|
def messages(self, **kwargs):
|
|
folder = kwargs.get('folder', False)
|
|
|
|
if folder:
|
|
self.connection.select(folder)
|
|
msg = " from folder '{}'".format(folder)
|
|
else:
|
|
msg = " from inbox"
|
|
|
|
logger.info("Fetch list of messages{}".format(msg))
|
|
return Messages(connection=self.connection,
|
|
parser_policy=self.parser_policy,
|
|
**kwargs)
|
|
|
|
def folders(self):
|
|
return self.connection.list() |