一、需求

将工资表以邮件附件批量发送给每个人,并以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表格最终格式

邮件正文表格java 邮件正文表格变形_邮件正文表格java

三、获取邮箱的授权密码

# 发送邮箱的用户名和密码
username = "*********@163.com" #发件人的用户名
password = "********"  # 授权密码

找邮箱设置>>POP3/SMTP/IMAP>>授权密码管理

邮件正文表格java 邮件正文表格变形_html_02


邮件正文表格java 邮件正文表格变形_运维_03

四、最终代码

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("邮件服务器连接错误")

五、最终效果图

邮件正文表格java 邮件正文表格变形_用户名_04