import smtplib
# 负责构造文本
from email.mime.text import MIMEText
# 负责构造图片
from email.mime.image import MIMEImage
# 负责将多个对象集合起来
from email.mime.multipart import MIMEMultipart
from email.header import Header
import os,sys
BASE_PATH = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
sys.path.insert(0, BASE_PATH)
import configparser
cf = configparser.ConfigParser()
cf.read(os.path.join(BASE_PATH, 'doc/config.ini'))
sender_dict = dict(cf.items('sender-config'))
recivers_dict = dict(cf.items('recivers-config'))
class Mail(object):
def __init__(self):
self.mail_host = sender_dict['host'] # SMTP服务器
self.port = int(sender_dict['port']) # 端口号
self.mail_sender = sender_dict['sender'] # 发件人邮箱
self.mail_license = sender_dict['pwd'] # 授权密码
self.mail_receivers = [v for k, v in recivers_dict.items() if 'reciver' in k] # 收件人邮箱,可以为多个收件人
def send(self,subject,body_content,attachs,pics):
'''
:param subject: str,邮件主题
:param body_content: str,邮件正文
:param attachs: list,附件地址
:param pics: list,图片地址
:return: 发送邮件
'''
mm = MIMEMultipart('related')# 构建MIMEMultipart对象代表邮件本身,可以往里面添加文本、图片、附件等
# 设置发送者,注意严格遵守格式,里面邮箱为发件人邮箱
mm["From"] = self.mail_sender
# 设置接受者,注意严格遵守格式,里面邮箱为接受者邮箱
mm["To"] = ','.join(self.mail_receivers)
# 1. 设置邮件头部内容
mm["Subject"] = Header(subject, 'utf-8')
# 2. 添加正文内容
body_footer = '<p style="color:red">此邮件为系统自动发送,请勿在此邮件上直接回复,谢谢~</p>'
mm.attach(MIMEText(body_content + body_footer, "html", "utf-8"))
# 3. 添加附件
for attach_file in attachs:
with open(attach_file, 'rb') as file_info:
atta = MIMEText(file_info.read(), 'base64', 'utf-8')
atta.add_header('Content-Disposition', 'attachment', filename=('utf-8', '', os.path.basename(attach_file)))
# 添加附件到邮件信息当中去
mm.attach(atta)
# 4. 添加图片
for pic_file in pics:
with open(pic_file,'rb') as image:
image_info = MIMEImage(image.read())
image_info.add_header('Content-Disposition', 'attachment', filename=('utf-8', '', os.path.basename(pic_file)))
mm.attach(image_info)
# 创建SMTP对象
stp = smtplib.SMTP(self.mail_host)
# 设置发件人邮箱的域名和端口
stp.connect(self.mail_host, self.port)
# set_debuglevel(1)可以打印出和SMTP服务器交互的所有信息
# stp.set_debuglevel(1)
stp.starttls()
# 登录邮箱,传递参数1:邮箱地址,参数2:邮箱授权码
stp.login(self.mail_sender,self.mail_license)
# 发送邮件,传递参数1:发件人邮箱地址,参数2:收件人邮箱地址,参数3:把邮件内容格式改为str
stp.sendmail(self.mail_sender, self.mail_receivers, mm.as_string())
print("邮件发送成功")
# 关闭SMTP对象
stp.quit()
if __name__ == '__main__':
subject = """Python邮件测试"""
body_content = """
<h1>这是一封测试邮件 - 1级标题</h1>
<h2>这是一封测试邮件 - 2级标题</h2>
<h3>这是一封测试邮件 - 3级标题</h3>
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Table</title>
</head>
<body>
<table border="1" align="left" cellspacing="0" cellpadding="1">
<caption></caption>
<strong>
<tr align="left" bgcolor="#4dbcee">
<th>col1</th>
<th>col2</th>
</tr>
</strong>
<tbody>
<tr align="left">
<td>1</td>
<td>a</td>
</tr>
<tr align="left" bgcolor="#bd321a">
<td>2</td>
<td>b</td>
</tr>
<tr align="left">
<td>3</td>
<td>c</td>
</tr>
</tbody>
</table>
</body>
</html>
"""
attachs = [f'{BASE_PATH}/doc/attach1.txt',f'{BASE_PATH}/doc/attach2.xlsx']
pics = [f'{BASE_PATH}/doc/pic1.jpg',f'{BASE_PATH}/doc/pic2.png']
Mail().send(subject,body_content,attachs,pics)
结果如下