一、需求
将工资表以邮件附件批量发送给每个人,并以HTML表格附在正文发送出去(或者发送个人业绩)。解决本次需求主要用到模块为smtplib、email模块、pandas模块。
数据源
以excel表格的形式呈现(测试数据)
姓名 | 邮箱 | 部门 | 职位 | 实际出勤天数 | 餐补费用 | 津贴 | 个人应缴纳五险 | 个人应缴纳公积金 | 应发工资 | 实发工资 |
A | ******@163.com | 技术部 | 数据分析师 | 25 | 650 | 500 | 450 | 150 | 12300 | 11700 |
B | ******@163.com | 技术部 | 数据分析师 | 25 | 650 | 500 | 450 | 150 | 13200 | 12600 |
二、设计HTML表格的格式
需要先学一下简单的HTML语言;可以先在html文件写代码,方便查看格式、调整格式。
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<style type="text/css">
.mailTable{
width: 25%;
margin: auto;
border-top: 1px solid #808080;
border-left: 1px solid #808080;
position:static ;
left: 0px;
}
.mailTable tr td{
width: 200px;
height: 35px;
line-height: 35px;
box-sizing: border-box;
padding: 0 10px;
border-bottom: 1px solid #808080;
border-right: 1px solid #808080;
}
.mailTable tr td.column {
background-color: #EFF3F6;
color: #393C3E;
width: 20%;
text-align: center;
}
.mailTable td.data{
width: 20%;
}
.mailTable caption{
font-size: 1.4em;
padding: 0.5em;
}
p{
text-indent: 2em;
}
</style>
</head>
<body>
<p>{name}你好,这是2022年1月工资明细,请查收!</p>
<p></p>
<table class="mailTable" cellspacing="0" cellpadding="0">
<caption>2022年1月工资详细表</caption>
<tr>
<td class="column">姓名</td>
<td class="data">{name}</td>
</tr>
<tr>
<td class="column">邮箱地址</td>
<td class="data">{address}</td>
</tr>
<tr>
<td class="column">部门</td>
<td class="data">{department}</td>
</tr>
<tr>
<td class="column">职位</td>
<td class="data">{post}</td>
</tr>
<tr>
<td class="column">实际出勤天数</td>
<td class="data">{commute}</td>
</tr>
<tr>
<td class="column">餐补费用</td>
<td class="data">{dine}</td>
</tr>
<tr>
<td class="column">津贴</td>
<td class="data">{subsidies}</td>
</tr>
<tr>
<td class="column">个人应缴纳五险</td>
<td class="data">{insurance}</td>
</tr>
<tr>
<td class="column">个人应缴纳公积金</td>
<td class="data">{fund}</td>
</tr>
<tr>
<td class="column">应发工资</td>
<td class="data">{salary}</td>
</tr>
<tr>
<td class="column">实发工资</td>
<td class="data">{salary1}</td>
</tr>
</table>
<p> 如有疑问,请联系人力资源部门,谢谢!</p>
</body>
</html>
html表格最终格式
三、获取邮箱的授权密码
# 发送邮箱的用户名和密码
username = "*********@163.com" #发件人的用户名
password = "********" # 授权密码
找邮箱设置>>POP3/SMTP/IMAP>>授权密码管理
四、最终代码
SMTP(Simple Mail Transfer Protocol)即简单邮件传输协议。它是一组用于由源地址到目的地址传送邮件的规则,由它来控制信件的中转方式。
smtplib提供了邮箱自动化的途径,让人们高效处理工作。
import smtplib
from email.header import Header # 用来设置邮件头和邮件主题
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText
import pandas as pd
df1 = pd.read_excel(r'F:\测试邮箱附件\测试工资条.xlsx')
# 读取项目名称列,不要列名
df_li = df1.values.tolist()
print(df_li)
# 结果:[['A', '*******@163.com', '技术部', '数据分析师', 25, 650, 500, 450, 150, 12300, 11700], ['B', '********@163.com', '技术部', '数据分析师', 25, 650, 500, 450, 150, 13200, 12600]]
# 发件人
sender = '********@163.com' # 发件人的邮箱
# 所使用的用来发送邮件的SMTP服务器
smtp_server ="smtp.163.com" # 用的是网易邮箱
# 发送邮箱的用户名和密码
username = "*********@163.com" #发件人的用户名
password = "********" # 授权密码
head = \
'''<head>
<meta charset="UTF-8">
<title>Title</title>
<style type="text/css">
.mailTable{
width: 25%;
margin: auto;
border-top: 1px solid #808080;
border-left: 1px solid #808080;
position:static ;
left: 0px;
}
.mailTable tr td{
width: 200px;
height: 35px;
line-height: 35px;
box-sizing: border-box;
padding: 0 10px;
border-bottom: 1px solid #808080;
border-right: 1px solid #808080;
}
.mailTable tr td.column {
background-color: #EFF3F6;
color: #393C3E;
width: 20%;
text-align: center;
}
.mailTable td.data{
width: 20%;
}
.mailTable caption{
font-size: 1.4em;
padding: 0.5em;
}
p{
text-indent: 2em;
}
</style>
</head>'''
body = \
'''<body>
<p>{name}你好,这是2022年1月工资明细,请查收!</p>
<p></p>
<table class="mailTable" cellspacing="0" cellpadding="0">
<caption>2022年1月工资详细表</caption>
<tr>
<td class="column">姓名</td>
<td class="data">{name}</td>
</tr>
<tr>
<td class="column">邮箱地址</td>
<td class="data">{address}</td>
</tr>
<tr>
<td class="column">部门</td>
<td class="data">{department}</td>
</tr>
<tr>
<td class="column">职位</td>
<td class="data">{post}</td>
</tr>
<tr>
<td class="column">实际出勤天数</td>
<td class="data">{commute}</td>
</tr>
<tr>
<td class="column">餐补费用</td>
<td class="data">{dine}</td>
</tr>
<tr>
<td class="column">津贴</td>
<td class="data">{subsidies}</td>
</tr>
<tr>
<td class="column">个人应缴纳五险</td>
<td class="data">{insurance}</td>
</tr>
<tr>
<td class="column">个人应缴纳公积金</td>
<td class="data">{fund}</td>
</tr>
<tr>
<td class="column">应发工资</td>
<td class="data">{salary}</td>
</tr>
<tr>
<td class="column">实发工资</td>
<td class="data">{salary1}</td>
</tr>
</table>
<p> 如有疑问,请联系人力资源部门,谢谢!</p>
</body>'''
try:
smtp = smtplib.SMTP(smtp_server, 25) # 连接邮件服务器
smtp.set_debuglevel(1)
smtp.login(username, password) # 登录服务器
for df_1 in df_li:
# print(df_1[0])
html_msg = '<html>'+head+body.format(name=df_1[0], address=df_1[1], department=df_1[2], post=df_1[3], commute=df_1[4], dine=df_1[5], subsidies=df_1[6], insurance=df_1[7], fund=df_1[8], salary=df_1[9], salary1=df_1[10])+'</html>'
message = MIMEMultipart()
message.attach(MIMEText(html_msg, 'html', 'utf-8')) # 邮件正文
message['From'] = sender # 邮件上显示的发件人
message['To'] = df_1[1] # 收件人
# message['cc'] = df_li[1] # 抄送人
message['Subject'] = Header('2022年1月个人工资条', 'utf-8') # 邮件主题
smtp.sendmail(sender, message['To'], message.as_string()) # 填入邮件的相关信息并发送
print("发送给"+df_1[0]+"的邮件发送成功!")
smtp.quit()
# print('已经发送给'+len(df_li))
except smtplib.SMTPException:
print("邮件服务器连接错误")
五、最终效果图