使用Python,SMTP发邮件到qq邮箱(文本/超链接/图片/表格/附件表格)
这篇博客将介绍如何利用SMTP,使用Python向qq邮箱自动发邮件,包括正文文本+超链接+图片+表格,附件图片+表格,收件人可多个,分隔;
1. 效果图
正文文本+超链接+图片+表格,效果图如下:
正文表格,附件图片+表格,效果图如下:
2. 源码
# -*- coding: utf-8 -*-
# 利用SMTP,向qq邮箱发送邮件,包括正文文本+图片+表格,附件图片+表格;
# python sendMailDf.py
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
# 画图时,中文字体和负号无法显示, 可按下面语句设置
import matplotlib as mpl
mpl.rcParams['font.sans-serif'] = ['KaiTi'] # 设置要使用字体
mpl.rcParams['font.serif'] = ['KaiTi']
mpl.rcParams['axes.unicode_minus'] = False # 使 - 号显示
import smtplib
from email.header import Header
from email.mime.text import MIMEText
from email.mime.image import MIMEImage
from email.mime.multipart import MIMEMultipart
from email.mime.application import MIMEApplication
# 设置初始化参数
mail_user = '139xxxxx' # 邮箱登录名,此处使用QQ邮箱,填写QQ号即可,不用带@qq.com
mail_pass = 'anbudddddee' # QQ邮箱授权码
sender = '139xxxxx@qq.com' # 发件人
receivers = ['139xxxxx@qq.com'] # 收件人列表,list形式
chaosong = ['139xxxxx@qq.com'] # 抄送人列表,list形式
# 设置邮件体对象
msg = MIMEMultipart() # 邮件体对象,此处可加入参数, 具体可百度
subject = 'python send email test' # 邮件主题
msg['subject'] = Header(subject, 'utf-8') # 加入邮件主题
msg['From'] = "{}".format(sender) # 加入邮件发送人
msg['To'] = ",".join(receivers) # 加入邮件接收人
msg['Cc'] = ",".join(chaosong) # 加入邮件抄送人,如无,可注释掉
# 数据处理
ts = pd.Series(np.random.randn(1000), index=pd.date_range("1/1/2000", periods=1000))
ts = ts.cumsum()
ts.plot()
df = pd.DataFrame(
np.random.randn(1000, 4), index=ts.index, columns=["A", "B", "C", "D"]
)
df = df.cumsum()
plt.figure()
df.plot()
plt.legend(loc='upper left')
plt.savefig("data_image.jpg")
# 表格
df_count = pd.read_excel("foo.xlsx", "Sheet1", index_col=None, na_values=["NA"])
# 网页内容,有链接,插入图片
data_link = 'http://www.gov.cn/shuju/2017sjcs/sjxqpage.htm'
htmlFile = """\
<html>
<head></head>
<body>
<pre style="font-family:arial">
Dears,
以下是foo数据,它指企业(单位、个体户)通过交易直接售给个人、社会集团非生产、非经营用的实物商品金额,
以及提供餐饮服务所取得的收入金额。个人包括城乡居民和入境人员,社会集团包括机关、社会团体、部队、学校、企事业单位、居委会或村委会等。
所用数据链接:<a href="{link}">{link}</a>.
</pre>
<p>图1 随机数据测试表格:
<br /><img src="cid:0", width=720, height=420 >
</p>
</body>
</html>
""".format(link=data_link)
htmlApart = MIMEText(htmlFile, 'html')
# 在正文中显示图片
imageFile = "ym.jpg"
imageApart = MIMEImage(open(imageFile, 'rb').read(), imageFile.split('.')[-1])
imageApart.add_header('Content-ID', '<0>')
msg.attach(imageApart)
msg.attach(htmlApart)
# 邮件正文中嵌入表格
table_title = "表1 随机数据测试表格"
def get_html_msg(df, table_title):
"""
1. 构造html信息
"""
df_html = df.to_html(escape=False)
# 表格格式
head = \
"""
<head>
<meta charset="utf-8">
<STYLE TYPE="text/css" MEDIA=screen>
table.dataframe {
border-collapse: collapse;
border: 2px solid #a19da2;
/*默认居中auto显示整个表格*/
margin: left;
}
table.dataframe thead {
border: 2px solid #91c6e1;
background: #f1f1f1;
padding: 10px 10px 10px 10px;
color: #333333;
}
table.dataframe tbody {
border: 2px solid #91c6e1;
padding: 10px 10px 10px 10px;
}
table.dataframe tr {
}
table.dataframe th {
vertical-align: top;
font-size: 14px;
padding: 10px 10px 10px 10px;
color: #105de3;
font-family: arial;
text-align: center;
}
table.dataframe td {
text-align: left;
padding: 10px 10px 10px 10px;
}
body {
font-family: 宋体;
}
h1 {
color: #5db446
}
div.header h2 {
color: #0002e3;
font-family: 黑体;
}
div.content h2 {
text-align: center;
font-size: 28px;
text-shadow: 2px 2px 1px #de4040;
color: #fff;
font-weight: bold;
background-color: #008eb7;
line-height: 1.5;
margin: 20px 0;
box-shadow: 10px 10px 5px #888888;
border-radius: 5px;
}
h3 {
font-size: 22px;
background-color: rgba(0, 2, 227, 0.71);
text-shadow: 2px 2px 1px #de4040;
color: rgba(239, 241, 234, 0.99);
line-height: 1.5;
}
h4 {
color: #e10092;
font-family: 楷体;
font-size: 20px;
text-align: center;
}
td img {
/*width: 60px;*/
max-width: 300px;
max-height: 300px;
}
</STYLE>
</head>
"""
# 构造正文表格
body = \
"""
<body>
<div align="center" class="header">
<!--标题部分的信息-->
<!--<h1 align="left">{table_title}</h1>-->
<p align="left">{table_title}</p>
</div>
<div class="content">
{df_html}
</div>
</body>
<br /><br />
""".format(df_html=df_html, table_title=table_title)
html_msg = "<html>" + head + body + "</html>"
# 这里是将HTML文件输出,作为测试的时候,查看格式用的,正式脚本中可以注释掉
# fout = open('test.html', 'w', encoding='UTF-8', newline='')
# fout.write(html_msg)
return html_msg
# html 内容
html_msg = get_html_msg(df_count, table_title)
content_html = MIMEText(html_msg, "html", "utf-8")
msg.attach(content_html)
# 加入多个附件
files = ['data_image.jpg', 'foo.xlsx']
for i in np.arange(len(files)):
attFile = MIMEApplication(open(files[i], 'rb').read())
attFile.add_header('Content-Disposition', 'attachment', filename=files[i])
msg.attach(attFile)
# 发送邮件,参数设置
sftp_obj = smtplib.SMTP_SSL(host='smtp.qq.com', port=465)
sftp_obj.login(mail_user, mail_pass)
sftp_obj.sendmail(sender, receivers, msg.as_string())
sftp_obj.quit()
sftp_obj.close()
print('\nThe email has been sent successfully')
del msg