Hide keyboard shortcuts

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""" 

5 

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 

13 

14 

15class MailBoxMock(MailBoxImap): 

16 

17 """ 

18 Define a mail box reading from file (kind of mock). 

19 """ 

20 

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 

26 

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 

33 

34 def login(self): 

35 """ 

36 login (nothing to do here) 

37 """ 

38 pass 

39 

40 def logout(self): 

41 """ 

42 logout (nothing to do here) 

43 """ 

44 pass 

45 

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 

55 

56 def read_mail_from_file(self, filename): 

57 """ 

58 extract a mail from a file 

59 

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) 

70 

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 

75 

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 

89 

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 

99 

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) 

109 

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 

118 

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()