Hot-keys on this page
r m x p toggle line displays
j k next/prev highlighted chunk
0 (zero) top of page
1 (one) first highlighted chunk
1"""
2@file
3@brief Defines a mailbox using IMAP
4"""
6import os
7import email
8import email.message
9from pyquickhelper.loghelper import noLOG
10from pyquickhelper.filehelper.encryption import decrypt_stream
11from .email_message import EmailMessage
12from .mailboximap import MailBoxImap
15class MailBoxMock(MailBoxImap):
17 """
18 Define a mail box reading from file (kind of mock).
19 """
21 def __init__(self, folder, pwd, fLOG=noLOG):
22 """
23 @param folder folder to look into
24 @param pwd password, in case mails are encrypted
25 @param fLOG logging function
27 For gmail, it is ``imap.gmail.com`` and ssl must be true
28 """
29 self._user = None
30 self._password = pwd
31 self._folder = folder
32 self.fLOG = fLOG
34 def login(self):
35 """
36 login (nothing to do here)
37 """
38 pass
40 def logout(self):
41 """
42 logout (nothing to do here)
43 """
44 pass
46 def folders(self):
47 """
48 returns the list of folder of the mail box
49 """
50 res = []
51 for __, dirs, _ in os.walk(self._folder):
52 for name in dirs:
53 res.append(name)
54 return res
56 def read_mail_from_file(self, filename):
57 """
58 extract a mail from a file
60 @param filename filename
61 @return MailMessage
62 """
63 with open(filename, "rb") as f:
64 content = f.read()
65 if self._password:
66 b = decrypt_stream(self._password, content)
67 else:
68 b = content
69 return email.message_from_bytes(b, _class=EmailMessage)
71 def enumerate_mails_in_folder( # pylint: disable=W0221
72 self, folder, skip_function=None, pattern="ALL"):
73 """
74 enumerate all mails in a folder
76 @param folder folder
77 @param skip_function to skip mail or None to keep them all
78 @param pattern ``'ALL'`` by default, unused otherwise
79 @return enumerator on mails
80 """
81 local = os.path.join(self._folder, folder)
82 for name in os.listdir(local):
83 full = os.path.join(local, name)
84 if os.path.isfile(full):
85 mail = self.read_mail_from_file(full)
86 if skip_function is not None and skip_function(mail):
87 continue
88 yield mail
90 def enumerate_search_person(self,
91 person,
92 folder,
93 skip_function=None,
94 date=None,
95 max_dest=5,
96 body=True):
97 """
98 enumerates all mails in folder folder from a user or sent to a user
100 @param person person to look for
101 @param folder folder name
102 @param skip_function if not None, use this function on the header/body to avoid loading the entire message (and skip it)
103 @param pattern search pattern (see below)
104 @param max_dest maximum number of receivers
105 @param body also extract the body
106 @return iterator on (message)
107 """
108 return self.enumerate_mails_in_folder(folder=folder, skip_function=skip_function)
110 def enumerate_search_subject(self,
111 subject,
112 folder,
113 skip_function=None,
114 date=None,
115 max_dest=5):
116 """
117 enumerates all mails in folder folder with a subject verifying a regular expression
119 @param subject subject to look for
120 @param folder folder name
121 @param skip_function if not None, use this function on the header/body to avoid loading the entire message (and skip it)
122 @param pattern search pattern (see below)
123 @param max_dest maximum number of receivers
124 @return iterator on (message)
125 """
126 raise NotImplementedError()