Source code for gmail_client.mailbox

from message import Message
from gmail_client.codecs.utf7 import encode as encode_utf7, decode as decode_utf7


[docs]class Mailbox(): """ A Mailbox object. """ def __init__(self, gmail, name="INBOX"): self.name = name self.gmail = gmail self.date_format = "%d-%b-%Y" self.messages = {} @property def external_name(self): if "external_name" not in vars(self): vars(self)["external_name"] = encode_utf7(self.name) return vars(self)["external_name"] @external_name.setter def external_name(self, value): if "external_name" in vars(self): del vars(self)["external_name"] self.name = decode_utf7(value) def mail(self, prefetch=False, **kwargs): search = ['ALL'] kwargs.get('read') and search.append('SEEN') kwargs.get('unread') and search.append('UNSEEN') kwargs.get('starred') and search.append('FLAGGED') kwargs.get('unstarred') and search.append('UNFLAGGED') kwargs.get('deleted') and search.append('DELETED') kwargs.get('undeleted') and search.append('UNDELETED') kwargs.get('draft') and search.append('DRAFT') kwargs.get('undraft') and search.append('UNDRAFT') kwargs.get('before') and search.extend(['BEFORE', kwargs.get('before').strftime(self.date_format)]) kwargs.get('after') and search.extend(['SINCE', kwargs.get('after').strftime(self.date_format)]) kwargs.get('on') and search.extend(['ON', kwargs.get('on').strftime(self.date_format)]) kwargs.get('header') and search.extend(['HEADER', kwargs.get('header')[0], kwargs.get('header')[1]]) kwargs.get('sender') and search.extend(['FROM', kwargs.get('sender')]) kwargs.get('fr') and search.extend(['FROM', kwargs.get('fr')]) kwargs.get('to') and search.extend(['TO', kwargs.get('to')]) kwargs.get('cc') and search.extend(['CC', kwargs.get('cc')]) kwargs.get('subject') and search.extend(['SUBJECT', kwargs.get('subject')]) kwargs.get('body') and search.extend(['BODY', kwargs.get('body')]) kwargs.get('label') and search.extend(['X-GM-LABELS', kwargs.get('label')]) kwargs.get('attachment') and search.extend(['HAS', 'attachment']) kwargs.get('query') and search.extend([kwargs.get('query')]) emails = [] # print search response, data = self.gmail.imap.uid('SEARCH', *search) if response == 'OK': uids = filter(None, data[0].split(' ')) # filter out empty strings for uid in uids: if not self.messages.get(uid): self.messages[uid] = Message(self, uid) emails.append(self.messages[uid]) if prefetch and emails: messages_dict = {} for email in emails: messages_dict[email.uid] = email self.messages.update(self.gmail.fetch_multiple_messages(messages_dict)) return emails # # WORK IN PROGRESS. NOT FOR ACTUAL USE # def threads(self, prefetch=False, **kwargs): # emails = [] # response, data = self.gmail.imap.uid('SEARCH', 'ALL') # if response == 'OK': # uids = data[0].split(' ') # # # for uid in uids: # if not self.messages.get(uid): # self.messages[uid] = Message(self, uid) # emails.append(self.messages[uid]) # # if prefetch: # fetch_str = ','.join(uids) # response, results = self.gmail.imap.uid('FETCH', fetch_str, '(BODY.PEEK[] FLAGS X-GM-THRID X-GM-MSGID X-GM-LABELS)') # for index in xrange(len(results) - 1): # raw_message = results[index] # if re.search(r'UID (\d+)', raw_message[0]): # uid = re.search(r'UID (\d+)', raw_message[0]).groups(1)[0] # self.messages[uid]._parse(raw_message) # # return emails def count(self, **kwargs): return len(self.mail(**kwargs)) def cached_messages(self): return self.messages