def getUidList(self, new_only, date_filter=None): try: if None != date_filter: filter = 'SENTSINCE %s' % date_filter.strftime("%d-%b-%Y") else: filter = None if new_only: type_uid = 'UNSEEN' else: type_uid = 'ALL' # Получение данных в зависимости от фильтров (status, data) = self.mail.uid('search', None, filter, type_uid) # Проверка успешности получение данных if 'OK' != status: raise exlite.ExceptionLite('Status: %s' % (status)) # Конвертируем данные uid_test = str(data[0], 'utf8') if '' == uid_test: return list() else: return str(data[0], 'utf8').split(' ') # Перехват ошибок "транспорта"(socket) except socket_error as s: raise exlite.ExceptionLite('(Socket) ' + self.__bytesToStr__(s.args[1])) # Перехват ошибок IMAP except imaplib.IMAP4.error as i: raise exlite.ExceptionLite('(IMAP)' + self.__bytesToStr__(i.args[0]))
def __syncFolders__(self): try: # Получение данных с сервера (status, data) = self.mail.list() # Проверка статуса if 'OK' != status: raise exlite.ExceptionLite('status: ' + status) # Псевдонимы каталогов для коректного поиска и отображения dic_folders = { 'inbox': 'Входящие', 'important': 'Важные', 'drafts': 'Черновики', 'draftbox': 'Черновики', 'sent': 'Отправленные', 'sentbox': 'Отправленные', 'flagged': 'Помеченные', 'trash': 'Корзина', 'junk': 'Спам', 'spam': 'Спам' } # Список для очистки от неиспользуемых данных replace_flag_list = ('\HasNoChildren', '\HasChildren', 'Noselect', 'All', 'Unmarked', '\\', '"', ' ') # Регулярное выражение для разбивки данных с сервера re_pattern = re.compile( r'\((?P<flags>.*?)\) "(?P<delimiter>.*)" (?P<name>.*)') self.folders = {} # Проход в цикле по всем строкам полученных с сервера for line in data: # Разбиваем согласно регулярки match = re_pattern.match(str(line, 'utf-8')) # Групируем (flags, delimiter, name) = match.groups() # Убираем кавычки и неиспользуемые элементы for replace_str in replace_flag_list: flags = flags.replace(replace_str, '') name = name.replace(replace_str, '') # Поиск имени пакпки в словаре if name.lower() in dic_folders: flags = dic_folders[name.lower()] else: # Если в словаре нет пробуем декодировать из Base64 re_patern = re.compile('&(\S+)-') rlist = re.findall(re_patern, name) if 0 < len(rlist): flags = self.__decodeB64toStr__(rlist[0], 'utf-16BE') if '' != flags: self.folders[flags] = name # Перехват ошибок "транспорта" except socket_error as s: raise exlite.ExceptionLite('(Socket) ' + self.__bytesToStr__(s.args[1])) # Перехват ошибок IMAP except imaplib.IMAP4.error as i: raise exlite.ExceptionLite('(IMAP)' + self.__bytesToStr__(i.args[0]))
def __init__(self, config): try: # Подключаемся к хосту self.mail = imaplib.IMAP4_SSL(config.host, config.port) # Авторизация self.mail.login(config.login, config.password) # Обновление списка папок IMAP self.__syncFolders__() # Перехват ошибок "транспорта"(socket) except socket_error as s: raise exlite.ExceptionLite('(Socket) ' + self.__bytesToStr__(s.args[1])) # Перехват ошибок IMAP except imaplib.IMAP4.error as i: raise exlite.ExceptionLite('(IMAP)' + self.__bytesToStr__(i.args[0]))
def deleteMessage(self, uid): try: folder_trash = self.folders['Корзина'] self.mail.uid('STORE', uid, '+FLAGS', '(\\Deleted)') self.mail.expunge() # Перехват ошибок ввода except KeyError as ke: raise exlite.ExceptionLite('Folder not found: <%s>' % ke.args[0]) # Перехват ошибок "транспорта"(socket) except socket_error as s: raise exlite.ExceptionLite('(Socket) ' + self.__bytesToStr__(s.args[1])) # Перехват ошибок IMAP except imaplib.IMAP4.error as i: raise exlite.ExceptionLite('(IMAP)' + self.__bytesToStr__(i.args[0]))
def setFolder(self, folder): try: (status, data) = self.mail.select(self.folders[folder]) if 'OK' != status: raise exlite.ExceptionLite('status: ' + status) # Перехват ошибок ввода except KeyError as ke: raise exlite.ExceptionLite('Folder not found: <%s>' % folder) # Перехват ошибок "транспорта"(socket) except socket_error as s: raise exlite.ExceptionLite('(Socket) ' + self.__bytesToStr__(s.args[1])) # Перехват ошибок IMAP except imaplib.IMAP4.error as i: raise exlite.ExceptionLite('(IMAP)' + self.__bytesToStr__(i.args[0]))
def getMessageData(self, uid): try: (status, data) = self.mail.uid('fetch', str(uid), '(RFC822)') # Проверка успешности получение данных if "OK" != status: raise exlite.ExceptionLite("Massage not found") # Конвертируем данные из bytes в Message msg = email.message_from_bytes(data[0][1]) # Получаем "отправителя" address_from = self.__decodeAddress__(msg["From"]) # Получаем список "получателей" address_to = self.__decodeAddress__(msg["To"]) # Получаем список "в копии" address_cc = self.__decodeAddress__(msg["Cc"]) # Дата и время отправки сообщения date_time = self.__decodeTimestamp__( email.utils.parsedate_tz(msg['date'])) # Тема письма subject = self.__decodeImapStr__(msg["subject"]) # Тело письма и вложение(я) body_plain = '' body_html = '' attachment = {} if msg.is_multipart(): for part in msg.walk(): content_type = part.get_content_type() content_disposition = str(part.get('Content-Disposition')) content_charset = part.get_content_charset() if None == content_charset: content_charset = 'utf-8' if 'attachment' not in content_disposition: if 'text/plain' == content_type: body_plain = part.get_payload( decode=True).decode(content_charset) elif 'text/html' == content_type: body_html = part.get_payload( decode=True).decode(content_charset) else: filename = self.__decodeImapStr__(part.get_filename()) attachment[filename] = part.get_payload(decode=True) else: content_type = msg.get_content_type() content_disposition = str(msg.get("Content-Disposition")) content_charset = msg.get_content_charset() if None == content_charset: content_charset = 'utf-8' if 'attachment' not in content_disposition: if 'text/plain' == content_type: body_plain = msg.get_payload( decode=True).decode(content_charset) elif 'text/html' == content_type: body_html = msg.get_payload( decode=True).decode(content_charset) else: filename = self.__decodeImapStr__(msg.get_filename()) attachment[filename] = msg.get_payload(decode=True) # Возврат сообщения return MessageData(address_from, address_to, address_cc, subject, body_plain, body_html, date_time, attachment) # Перехват ошибок "транспорта"(socket) except socket_error as s: raise exlite.ExceptionLite('(Socket) ' + self.__bytesToStr__(s.args[1])) # Перехват ошибок IMAP except imaplib.IMAP4.error as i: raise exlite.ExceptionLite('(IMAP)' + self.__bytesToStr__(i.args[0]))