Add logging to imbox

This commit is contained in:
Dennis Schmalacker
2015-06-12 22:42:15 +02:00
parent a7d0cf4ac6
commit ccc4743c15
5 changed files with 38 additions and 3 deletions

View File

@@ -2,6 +2,9 @@ from imbox.imap import ImapTransport
from imbox.parser import parse_email
from imbox.query import build_search_query
import logging
logger = logging.getLogger(__name__)
class Imbox(object):
@@ -11,14 +14,17 @@ class Imbox(object):
self.username = username
self.password = password
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 else "")))
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 query_uids(self, **kwargs):
query = build_search_query(**kwargs)
message, data = self.connection.uid('search', None, query)
if data[0] is None:
return []
@@ -26,6 +32,7 @@ class Imbox(object):
def fetch_by_uid(self, uid):
message, data = self.connection.uid('fetch', uid, '(BODY.PEEK[])')
logger.debug("Fetched message for UID {}".format(int(uid)))
raw_email = data[0][1]
email_object = parse_email(raw_email)
@@ -34,30 +41,38 @@ class Imbox(object):
def fetch_list(self, **kwargs):
uid_list = self.query_uids(**kwargs)
logger.debug("Fetch all messages for UID in {}".format(uid_list))
for uid in uid_list:
yield (uid, self.fetch_by_uid(uid))
def mark_seen(self, uid):
logger.info("Mark UID {} with \\Seen FLAG".format(int(uid)))
self.connection.uid('STORE', uid, '+FLAGS', '(\\Seen)')
def delete(self, uid):
logger.info("Mark UID {} with \\Deleted FLAG and expunge.".format(int(uid)))
mov, data = self.connection.uid('STORE', uid, '+FLAGS', '(\\Deleted)')
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, *args, **kwargs):
folder = kwargs.get('folder', False)
msg = ""
if folder:
self.connection.select(folder)
msg = " from folder '{}'".format(folder)
logger.info("Fetch list of massages{}".format(msg))
return self.fetch_list(**kwargs)
def folders(self):

View File

@@ -1,5 +1,7 @@
from imaplib import IMAP4, IMAP4_SSL
import logging
logger = logging.getLogger(__name__)
class ImapTransport(object):
@@ -17,12 +19,14 @@ class ImapTransport(object):
self.port = 143
self.server = self.transport(self.hostname, self.port)
logger.debug("Created IMAP4 transport for {host}:{port}".format(host=self.hostname, port=self.port))
def list_folders(self):
logger.debug("List all folders in mailbox")
return self.server.list()
def connect(self, username, password):
self.server.login(username, password)
self.server.select()
logger.debug("Logged into server {} and selected mailbox 'INBOX'".format(self.hostname))
return self.server

View File

@@ -10,6 +10,9 @@ from datetime import datetime
from email.header import decode_header
from imbox.utils import str_encode, str_decode
import logging
logger = logging.getLogger(__name__)
class Struct(object):
def __init__(self, **entries):
@@ -32,6 +35,7 @@ def decode_mail_header(value, default_charset='us-ascii'):
return str_decode(str_encode(value, default_charset, 'replace'), default_charset)
else:
for index, (text, charset) in enumerate(headers):
logger.debug("Mail header no. {}: {} encoding {}".format(index, text, charset))
try:
headers[index] = str_decode(text, charset or default_charset,
'replace')
@@ -52,7 +56,7 @@ def get_mail_addresses(message, header_name):
for index, (address_name, address_email) in enumerate(addresses):
addresses[index] = {'name': decode_mail_header(address_name),
'email': address_email}
logger.debug("{} Mail addressees in message: <{}> {}".format(header_name.upper(), address_name, address_email))
return addresses
@@ -72,6 +76,7 @@ def decode_param(param):
value_results.append(value)
if value_results:
v = ''.join(value_results)
logger.debug("Decoded parameter {} - {}".format(name, v))
return name, v
@@ -126,6 +131,7 @@ def parse_email(raw_email):
attachments = []
if maintype == 'multipart':
logger.debug("Multipart message. Will process parts.")
for part in email_message.walk():
content_type = part.get_content_type()
content_disposition = part.get('Content-Disposition', None)
@@ -183,4 +189,6 @@ def parse_email(raw_email):
if timetuple else None
parsed_email['parsed_date'] = parsed_date
logger.info("Downloaded and parsed mail '{}' with {} attachments".format(
parsed_email.get('subject'), len(parsed_email.get('attachments'))))
return Struct(**parsed_email)

View File

@@ -1,6 +1,8 @@
import datetime
import logging
# TODO - Validate query arguments
logger = logging.getLogger(__name__)
IMAP_MONTHS = ["Jan", "Feb", "Mar", "Apr", "May", "Jun",
"Jul", "Aug", "Sep", "Oct", "Nov", "Dec"]
@@ -46,6 +48,8 @@ def build_search_query(**kwargs):
query.append('(SUBJECT "%s")' % subject)
if query:
logger.debug("IMAP query: {}".format(" ".join(query)))
return " ".join(query)
logger.debug("IMAP query: {}".format("(ALL)"))
return "(ALL)"

View File

@@ -1,8 +1,12 @@
from __future__ import unicode_literals
from six import PY3
import logging
logger = logging.getLogger(__name__)
if PY3:
def str_encode(value='', encoding=None, errors='strict'):
logger.debug("Encode str {} with and errors {}".format(value, encoding, errors))
return str(value, encoding, errors)
def str_decode(value='', encoding=None, errors='strict'):