Source code for pymmails.grabber.mailbox_mock

"""
Defines a mailbox using IMAP


:githublink:`%|py|5`
"""

import os
import email
import email.message
from pyquickhelper.loghelper import noLOG
from pyquickhelper.filehelper.encryption import decrypt_stream
from .email_message import EmailMessage
from .mailboximap import MailBoxImap


[docs]class MailBoxMock(MailBoxImap): """ Define a mail box reading from file (kind of mock). :githublink:`%|py|19` """
[docs] def __init__(self, folder, pwd, fLOG=noLOG): """ :param folder: folder to look into :param pwd: password, in case mails are encrypted :param fLOG: logging function For gmail, it is ``imap.gmail.com`` and ssl must be true :githublink:`%|py|28` """ self._user = None self._password = pwd self._folder = folder self.fLOG = fLOG
[docs] def login(self): """ login (nothing to do here) :githublink:`%|py|37` """ pass
[docs] def logout(self): """ logout (nothing to do here) :githublink:`%|py|43` """ pass
[docs] def folders(self): """ returns the list of folder of the mail box :githublink:`%|py|49` """ res = [] for __, dirs, _ in os.walk(self._folder): for name in dirs: res.append(name) return res
[docs] def read_mail_from_file(self, filename): """ extract a mail from a file :param filename: filename :return: MailMessage :githublink:`%|py|62` """ with open(filename, "rb") as f: content = f.read() if self._password: b = decrypt_stream(self._password, content) else: b = content return email.message_from_bytes(b, _class=EmailMessage)
[docs] def enumerate_mails_in_folder( self, folder, skip_function=None, pattern="ALL"): """ enumerate all mails in a folder :param folder: folder :param skip_function: to skip mail or None to keep them all :param pattern: ``'ALL'`` by default, unused otherwise :return: enumerator on mails :githublink:`%|py|80` """ local = os.path.join(self._folder, folder) for name in os.listdir(local): full = os.path.join(local, name) if os.path.isfile(full): mail = self.read_mail_from_file(full) if skip_function is not None and skip_function(mail): continue yield mail
[docs] def enumerate_search_person(self, person, folder, skip_function=None, date=None, max_dest=5, body=True): """ enumerates all mails in folder folder from a user or sent to a user :param person: person to look for :param folder: folder name :param skip_function: if not None, use this function on the header/body to avoid loading the entire message (and skip it) :param pattern: search pattern (see below) :param max_dest: maximum number of receivers :param body: also extract the body :return: iterator on (message) :githublink:`%|py|107` """ return self.enumerate_mails_in_folder(folder=folder, skip_function=skip_function)
[docs] def enumerate_search_subject(self, subject, folder, skip_function=None, date=None, max_dest=5): """ enumerates all mails in folder folder with a subject verifying a regular expression :param subject: subject to look for :param folder: folder name :param skip_function: if not None, use this function on the header/body to avoid loading the entire message (and skip it) :param pattern: search pattern (see below) :param max_dest: maximum number of receivers :return: iterator on (message) :githublink:`%|py|125` """ raise NotImplementedError()