Files
imbox/imbox/__init__.py
Joshua Downer 52bab82d7d imbox: call close() before logout
The imaplib documentation recommends calling close() before logout to ensure
that 'deleted messages are removed from writable mailbox.'
2013-12-20 06:55:17 -05:00

61 lines
1.7 KiB
Python

from imbox.imap import ImapTransport
from imbox.parser import parse_email
from imbox.query import build_search_query
class Imbox(object):
def __init__(self, hostname, username=None, password=None, ssl=True):
self.server = ImapTransport(hostname, ssl=ssl)
self.username = username
self.password = password
self.connection = self.server.connect(username, password)
def logout(self):
self.connection.close()
self.connection.logout()
def query_uids(self, **kwargs):
query = build_search_query(**kwargs)
message, data = self.connection.uid('search', None, query)
return data[0].split()
def fetch_by_uid(self, uid):
message, data = self.connection.uid('fetch', uid, '(BODY.PEEK[])')
raw_email = data[0][1]
email_object = parse_email(raw_email)
return email_object
def fetch_list(self, **kwargs):
uid_list = self.query_uids(**kwargs)
for uid in uid_list:
yield (uid, self.fetch_by_uid(uid))
def mark_seen(self, uid):
self.connection.uid('STORE', uid, '+FLAGS', '\\Seen')
def delete(self, uid):
mov, data = self.connection.uid('STORE', uid, '+FLAGS', '(\\Deleted)')
self.connection.expunge()
def copy(self, uid, destination_folder):
return self.connection.uid('COPY', uid, destination_folder)
def move(self, uid, destination_folder):
if self.copy(uid, destination_folder):
self.delete(uid)
def messages(self, *args, **kwargs):
folder = kwargs.get('folder', False)
if folder:
self.connection.select(folder)
return self.fetch_list(**kwargs)