每次要发工资条公司负现工资条的同事都很烦恼,二百多号人,只能一个个人去发.于是她问我有什么办法可以批量发工资条的,我说你要收集员工的邮箱地址.然后我花半天写一个工具给你,她说早知道之前就找你啦.
下面费话不多说,直接上代码.
以下需要安装pandas库以及依赖库.
如有不懂配置或其它问题可以发邮件给我大家交流一下,我的qq邮箱:447282087import os,datetime,time
import pandas as pd
import tkinter as tk
from tkinter import filedialog
import smtplib
from email.mime.text import MIMEText
from email.utils import formataddr
def mail(uname,m,txt,tomail,upass):
my_sender='test126.com' # 发件人邮箱账号
my_pass = upass # 发件人邮箱密码(当时申请smtp给的口令)
my_user = tomail # 收件人邮箱账号,我这边发送给自己
ret=True
try:
msg=MIMEText(txt,'html','utf-8')
msg['From']=formataddr(["发件人昵称",my_sender]) # 括号里的对应发件人邮箱昵称、发件人邮箱账号
msg['To']=formataddr(["收件人昵称",my_user]) # 括号里的对应收件人邮箱昵称、收件人邮箱账号
msg['Subject']="%s %s月份工资条" %(uname,m) # 邮件的主题,也可以说是标题
server=smtplib.SMTP_SSL("smtp.126.com", 465) # 发件人邮箱中的SMTP服务器,端口是465
server.login(my_sender, my_pass) # 括号中对应的是发件人邮箱账号、邮箱密码
server.sendmail(my_sender,[my_user,],msg.as_string()) # 括号中对应的是发件人邮箱账号、收件人邮箱账号、发送邮件
server.quit()# 关闭连接
except Exception:# 如果 try 中的语句没有执行,则会执行下面的 ret=False
ret=False
return ret
def ReadFile(filePath):
print('打开文件:%s' % filePath)
filePath = filePath.replace('\\', '/')
if (os.path.exists(filePath) == False):
print('excel文件:%s 不存在 %s' % (filePath, datetime.datetime.now()))
# dfxsd = pd.read_excel(filePath)
df = pd.read_excel(filePath, dtype=str)
err_i = 0
count_i = 0
err_name = ''
m = input('请输入工资条的月份:')
upass = input('请输入你的邮箱密码:')
title = ['编号', '姓名', '应出勤天数', '实际出勤(天)', '基本底薪', '实际底薪', '绩效提成', '外访补贴',
'其他补贴', '加班补贴(天数)', '加班补贴(金额)', '应发工资合计', '事假(天)', '事假(金额)',
'扣费明细', '扣下其他','本月工资合计', '社保缴纳金额(公司)', '社保缴纳金额(个人)', '公积金缴纳金额(公司)',
'公积金缴纳金额(个人)', '本月实缴税额', '实发工资', '个人邮箱']
for i in df.index.values: # 获取行号的索引,并对其进行遍历:
# 枫软 备注1 = 客户编号(长度为15) , 备注2 = 批次, 备注3 = 合同编号(长度最大为5位数), 相关备注 = 包含(产品代码信息,产品代码一般为13位)
row_data = df.loc[i].reindex(title)
CustomerNumber = ''
ContractNumber = ''
ProductCode = ''
html = '
html += '
'for titlestr in title:
html += '
%s' %titlestrhtml += '
'html += '
'for titlestr in title:
html += '
%s' % row_data['%s' %titlestr]html += '
'html += '
'if(row_data['个人邮箱']!='nan' or row_data['个人邮箱']!=''):
mail(row_data['姓名'],m,html,row_data['个人邮箱'],upass)
time.sleep(1)
else:
err_name += ',' + row_data['姓名']
print(html,'')
print('发送失败的人员:'+err_name)
def rep(strs): # 替换字符
strs = str(strs)
strs = strs.replace(' ', '')
strs = strs.replace(' ', '')
strs = strs.replace('\r', '')
strs = strs.replace('\n', '')
strs = strs.replace("'", '')
strs = strs.replace('"', '')
strs = strs.replace('\\', '\\\\')
strs = strs.replace('/', '')
strs = strs.replace('/', '')
strs = strs.replace('%', '')
strs = strs.replace(':', '')
strs = strs.replace(':', '')
strs = strs.replace('\032', '\\Z')
strs = strs.replace('?', '')
strs = strs.replace('☎', '')
return strs
def getLocalFile(): # 获取文件
root = tk.Tk()
root.withdraw()
filePath = filedialog.askopenfilename()
print('文件路径:', filePath)
return filePath
input_file = getLocalFile()
ReadFile(input_file)
第一步:运行程序选择做好的工资条excel表,然后点击打开
第二步:输入工资的月份与箱邮密码,这里我输入9月份.
下面是工资条的excel模板