一、发送邮件
这一篇讲述了如何构造 文本、html、附件、图片等格式的邮件。
二、将 Datafram 作为正文发送邮件
我们使用 pandas 处理完数据后,会把表格里的数据以邮件的形式发送出去,那要怎么做呢?这里提供一个简单的处理方式:
1、将 datafram 格式的表格转化成 html 格式的表格,可使用 to_html() 方法直接转化。
import pandas
data_dic = {'机型':['小米12','华为P40','IQOO8','iphone13'],'价格':[3999,5000,3899,5999],'颜色':['白色','紫色','金色','白色']}
# 转成 datafram 格式
df = pandas.DataFrame(data_dic)
# 转化成 HTML 格式
df_html = df.to_html()
2、将 MIMEText() 方法第二个参数设置为 'html' ,然后发送邮件。
import pandas
from smtplib import SMTP_SSL
from email.mime.text import MIMEText
def sendMail(message,Subject,sender_show,recipient_show,to_addrs,cc_show=''):
'''
:param message: str 邮件内容
:param Subject: str 邮件主题描述
:param sender_show: str 发件人显示,不起实际作用如:"xxx"
:param recipient_show: str 收件人显示,不起实际作用 多个收件人用','隔开如:"xxx,xxxx"
:param to_addrs: str 实际收件人
:param cc_show: str 抄送人显示,不起实际作用,多个抄送人用','隔开如:"xxx,xxxx"
'''
# 填写真实的发邮件服务器用户名、密码
user = 'root'
password = '123456'
# 邮件内容
msg = MIMEText(message, 'html', _charset="utf-8")
# 邮件主题描述
msg["Subject"] = Subject
# 发件人显示,不起实际作用
msg["from"] = sender_show
# 收件人显示,不起实际作用
msg["to"] = recipient_show
# 抄送人显示,不起实际作用
msg["Cc"] = cc_show
with SMTP_SSL(host="smtp.exmail.qq.com",port=465) as smtp:
# 登录发送邮件服务器
smtp.login(user = user, password = password)
# 实际发送、接收邮件配置
smtp.sendmail(from_addr = user, to_addrs=to_addrs.split(','), msg=msg.as_string())
def work():
data_dic = {'机型':['小米12','华为P40','IQOO8','iphone13'],'价格':[3999,5000,3899,5999],'颜色':['白色','紫色','金色','白色']}
# 转成 datafram 格式
df = pandas.DataFrame(data_dic)
# 转化成 HTML 格式
df_html = df.to_html()
Subject = '表格测试'
sender_show = 'xxx'
recipient_show = 'xxx'
to_addrs = 'xxx'
sendMail(df_html,Subject,sender_show,recipient_show,to_addrs)
if __name__ =='__main__':
work()
3、不加修饰的表格有点难看,我们可以通过 CSS 进行样式修改,如下:
import pandas
from smtplib import SMTP_SSL
from email.mime.text import MIMEText
def sendMail(message,Subject,sender_show,recipient_show,to_addrs,cc_show=''):
'''
:param message: str 邮件内容
:param Subject: str 邮件主题描述
:param sender_show: str 发件人显示,不起实际作用如:"xxx"
:param recipient_show: str 收件人显示,不起实际作用 多个收件人用','隔开如:"xxx,xxxx"
:param to_addrs: str 实际收件人
:param cc_show: str 抄送人显示,不起实际作用,多个抄送人用','隔开如:"xxx,xxxx"
'''
# 填写真实的发邮件服务器用户名、密码
user = 'root'
password = '123456'
# 邮件内容
msg = MIMEText(message, 'html', _charset="utf-8")
# 邮件主题描述
msg["Subject"] = Subject
# 发件人显示,不起实际作用
msg["from"] = sender_show
# 收件人显示,不起实际作用
msg["to"] = recipient_show
# 抄送人显示,不起实际作用
msg["Cc"] = cc_show
with SMTP_SSL(host="smtp.exmail.qq.com",port=465) as smtp:
# 登录发送邮件服务器
smtp.login(user = user, password = password)
# 实际发送、接收邮件配置
smtp.sendmail(from_addr = user, to_addrs=to_addrs.split(','), msg=msg.as_string())
def work():
data_dic = {'机型':['小米12','华为P40','IQOO8','iphone13'],'价格':[3999,5000,3899,5999],'颜色':['白色','紫色','金色','白色']}
# 转成 datafram 格式
df = pandas.DataFrame(data_dic)
# 转化成 HTML 格式
df_html = df.to_html()
mail_html = '''
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<STYLE TYPE="text/css" MEDIA=screen>
table.dataframe {
border-collapse: collapse;
border: 2px solid #a19da2;
}
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: #3da014;
font-family: arial;
text-align: center;
}
table.dataframe td {
text-align: center;
padding: 10px 10px 10px 10px;
}
body {
font-family: 宋体;
}
h1 {
color: #5db446
}
div.header h2 {
color: #3da014;
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(61, 160, 20, 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 {
max-width: 300px;
max-height: 300px;
}
</STYLE>
</head>
<body>
<h2><b>Hi,本邮件由系统自动发出(每天触发),无需回复!</b></h2>
<hr size="1px" noshade=true />
<p><font color="#0B610B"><b>手机价格清单</b></font></p>
'''+ df_html +'''
</body>
</html>'''
Subject = '表格测试'
sender_show = 'xxx'
recipient_show = 'xxx'
to_addrs = 'xxx'
sendMail(mail_html,Subject,sender_show,recipient_show,to_addrs)
if __name__ =='__main__':
work()