-
Notifications
You must be signed in to change notification settings - Fork 19
/
emailinfo.py
135 lines (106 loc) · 4.37 KB
/
emailinfo.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
import abc
import datetime
# 邮件信息类
class EmailInfo(object):
def __init__(self):
self.date = None
self.subject = None
self.from_address = None
self.from_name = None
self.to_addresses = None
self.to_names = None
self.size = None
self.attachments_name = []
# 返回易阅读的文件大小字符串(两位小数),如 12345678 bytes返回'11.77MB'
@staticmethod
def bytes_to_readable(bytes_size: int):
size_unit = [' Bytes', ' KB', ' MB', ' GB', ' TB', ' PB']
unit_index = 0
easy_read_size = bytes_size
while easy_read_size >= 1024:
easy_read_size /= 1024
unit_index += 1
if unit_index == 0:
return str(easy_read_size) + size_unit[unit_index]
else:
return '{:.2f}'.format(easy_read_size) + size_unit[min(len(size_unit), unit_index)]
def print_info(self):
print('subject:', self.subject)
print('from_address:', self.from_address)
print('from_name:', self.from_name)
# print("to_address:", self.to_addresses)
# print("to_name:", self.to_names)
print('date:', datetime.datetime.fromtimestamp(self.date))
print('attachments:', self.attachments_name)
print('total size:', self.bytes_to_readable(self.size))
print('-----------------------------')
def add_attachment_name(self, attachment_name):
self.attachments_name.append(attachment_name)
# 邮件属性判断_基类
class EmailJudge:
@abc.abstractmethod
def judge(self):
pass
# 日期判断
class DateJudge(EmailJudge):
def __init__(self, date_begin, date_end, time_zone, email_date):
self.__date_begin = date_begin
self.__date_end = date_end
self.__time_zone = time_zone
self.__email_date = email_date
def judge(self):
# Date格式'4 Jan 2020 11:59:25 +0800'
date_mail = self.__email_date
date_begin = datetime.datetime.strptime((self.__date_begin + self.__time_zone), '%Y-%m-%d %H:%M%z').timestamp()
date_end = datetime.datetime.strptime((self.__date_end + self.__time_zone), '%Y-%m-%d %H:%M%z').timestamp()
return date_begin < date_mail < date_end
@staticmethod
# 比较是否比Target时间更早,用于结束邮件遍历的循环。包含时区。
def is_earlier(email_time, target_time):
return email_time < datetime.datetime.strptime(target_time, '%Y-%m-%d %H:%M%z').timestamp()
# 邮件主题判断
class SubjectJudge(EmailJudge):
def __init__(self, subject_include, email_subject):
self.__subject_include = subject_include
self.__email_subject = email_subject
def judge(self):
return self.__subject_include in self.__email_subject
# 邮件发件人地址判断
class AddressJudge(EmailJudge):
def __init__(self, address_include, email_from_address):
self.__address_include = address_include
self.__email_from_address = email_from_address
def judge(self):
return self.__address_include in self.__email_from_address
# 邮件发件人姓名判断
class NameJudge(EmailJudge):
def __init__(self, name_include, email_from_name):
self.__name_include = name_include
self.__email_from_name = email_from_name
def judge(self):
return self.__name_include in self.__email_from_name
# 邮件收件人地址判断
class RecipientAddressJudge(EmailJudge):
def __init__(self, recipient_include, email_recipient_address):
self.__recipient_include = recipient_include
self.__email_recipient_address = email_recipient_address
def judge(self):
return self.__recipient_include in self.__email_recipient_address
# 邮件收件人姓名判断
class RecipientNameJudge(EmailJudge):
def __init__(self, recipient_name, email_recipient_names):
self.__recipient_include = recipient_name
self.__email_recipient_names = email_recipient_names
def judge(self):
return self.__recipient_include in self.__email_recipient_names
# 邮件筛选器
class EmailFilter:
def __init__(self):
self.__judges = []
def add_judge(self, judge: EmailJudge):
self.__judges.append(judge)
def judge_conditions(self):
for condition_judge in self.__judges:
if not condition_judge.judge():
return False
return True