python:发送邮件-封装版

项目地址:https://github.com/snjl/python.email2.git

功能:封装了信息,发送者,接收者,每次默认从发送者中随机抽一个发送信息给所有接收者,分为三种发送方式,1是简单信息发送send_easy_email,2是带一个附件发送send_file,3是带多个附件发送send_files。

每次使用需要初始化Email的用户信息和接收者,然后可以通过修改类的信息来修改邮件内容。

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
136
137
138
139
140
141
142
143
144
from email.header import Header
from email.mime.text import MIMEText
from email.mime.multipart import MIMEMultipart

from email.utils import parseaddr, formataddr
import random
import smtplib


class Email(object):
# 获取多个发送者信息,每个发送者以tuple(email_address,password,smtp_server,port)存储,
# 每次发送邮件会随机从里面选择一个邮箱发送
__senders = list()
# 传入多个接收address
__send_to_addresses = list()
# 传入信息
__message = "默认信息"
# 封面显示标题
__message_title = "默认标题"
# 显示发件人
__message_sender_name = "发送者"

# 获取senders的用户信息
def get_senders(self):
return self.__senders

def get_send_to_addresses(self):
return self.__send_to_addresses

def set_senders(self, senders):
self.__senders = senders

def set_send_to_addresses(self, send_to_addresses):
self.__send_to_addresses = send_to_addresses

def get_range_sender_info(self):
return random.choice(self.__senders)

# 发送简单信息,不带附件
def send_easy_email(self):
# 格式化内容
def _format_addr(s):
name, addr = parseaddr(s)
return formataddr((Header(name, 'utf-8').encode(), addr))

sender = self.get_range_sender_info()

sender_address = sender[0]
sender_password = sender[1]
smtp_server = sender[2]
smtp_port = sender[3]
message = MIMEText(self.__message, 'plain', 'utf-8')
# 显示发件人名和发件地址
message['From'] = _format_addr(self.__message_sender_name + '<%s>' % sender_address)
# 标题
message['Subject'] = Header(self.__message_title, 'utf-8').encode()

server = smtplib.SMTP_SSL(smtp_server, smtp_port)
server.set_debuglevel(1)
# 登录
server.login(sender_address, sender_password)
# 邮件发送
server.sendmail(sender_address, self.__send_to_addresses, message.as_string())
server.quit()

# 发送一个附件,传入文件名,文件必须在该目录
def send_file(self, file_name):
def _format_addr(s):
name, addr = parseaddr(s)
return formataddr((Header(name, 'utf-8').encode(), addr))

sender = self.get_range_sender_info()

sender_address = sender[0]
sender_password = sender[1]
smtp_server = sender[2]
smtp_port = sender[3]

message = MIMEMultipart()

message.attach(MIMEText(self.__message, 'plain', 'utf-8'))
# 显示发件人名和发件地址
message['From'] = _format_addr(self.__message_sender_name + '<%s>' % sender_address)
# 标题
message['Subject'] = Header(self.__message_title, 'utf-8').encode()
# 传入附件名
attach = MIMEText(open(file_name, 'rb').read(), 'base64', 'utf-8')
attach["Content-Type"] = 'application/octet-stream'
attach["Content-Disposition"] = 'attachment; filename="' + file_name + '"'
message.attach(attach)

server = smtplib.SMTP_SSL(smtp_server, smtp_port)
server.set_debuglevel(1)
# 登录
server.login(sender_address, sender_password)
# 邮件发送
server.sendmail(sender_address, self.__send_to_addresses, message.as_string())
server.quit()

# 发送多个附件,传入文件的名字列表,文件必须在该目录
def send_files(self, file_names):
def _format_addr(s):
name, addr = parseaddr(s)
return formataddr((Header(name, 'utf-8').encode(), addr))

sender = self.get_range_sender_info()

sender_address = sender[0]
sender_password = sender[1]
smtp_server = sender[2]
smtp_port = sender[3]

message = MIMEMultipart()

message.attach(MIMEText(self.__message, 'plain', 'utf-8'))
# 显示发件人名和发件地址
message['From'] = _format_addr(self.__message_sender_name + '<%s>' % sender_address)
# 标题
message['Subject'] = Header(self.__message_title, 'utf-8').encode()

for file_name in file_names:
attach = MIMEText(open(file_name, 'rb').read(), 'base64', 'utf-8')
attach["Content-Type"] = 'application/octet-stream'
attach["Content-Disposition"] = 'attachment; filename="' + file_name + '"'
message.attach(attach)

server = smtplib.SMTP_SSL(smtp_server, smtp_port)
server.set_debuglevel(1)
# 登录
server.login(sender_address, sender_password)
# 邮件发送
server.sendmail(sender_address, self.__send_to_addresses, message.as_string())
server.quit()


if __name__ == '__main__':
email_tool = Email()
# 可以从数据库中获取
senders = [('', '', '', 465), ]
# 从数据库中获取需要发送的列表,但是获取后就保存在内存中,如果新添加,通过某个接口刷新获取或者从重启服务
email_tool.set_send_to_addresses(['', ''])

email_tool.set_senders(senders)
email_tool.send_files(['test.txt', 'test2.txt'])
-------------本文结束 感谢您的阅读-------------