利用python轻松解决用邮箱批量发工资条
import 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='test@kan1234.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.kan1234.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 = '<table border="1">' html += '<tr>' for titlestr in title: html += '<td>%s</td>' %titlestr html += '</tr>' html += '<tr>' for titlestr in title: html += '<td>%s</td>' % row_data['%s' %titlestr] html += '</tr>' html += '</table>' 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(' ', '') 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(':', '') strs = strs.replace('32', '\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)
import 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 = '<table border="1">'
html += '<tr>'
for titlestr in title:
html += '<td>%s</td>' %titlestr
html += '</tr>'
html += '<tr>'
for titlestr in title:
html += '<td>%s</td>' % row_data['%s' %titlestr]
html += '</tr>'
html += '</table>'
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('
', '')
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(':', '')
strs = strs.replace('32', '\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)