Add logging to imbox
This commit is contained in:
@@ -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):
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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)"
|
||||
|
||||
@@ -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'):
|
||||
|
||||
Reference in New Issue
Block a user