使用python自动发放员工工资条到个人邮箱
作者:互联网
人力资源部每个月发工资条,以前靠人工手动一条一条的复制,200多号员工,差不多需要耗费一天时间。
用python写个脚本,分分钟的事情就可以全部发送完。
我这边工资表如下图
姓名在C列,邮箱在B列。
发送完,这样显示
收到的邮件是这样
还有这样
# !/usr/bin/env python # -*- coding:utf-8 -*- # Author:Hiuhung Wan from openpyxl import load_workbook from email.mime.text import MIMEText # 邮件正文 from email.header import Header # 邮件头 import smtplib, time # 登录 def login(smtp_server, ssl_port, sender, passwd): smtp_obj = smtplib.SMTP_SSL(smtp_server, ssl_port) smtp_obj.login(sender, passwd) return smtp_obj # 发邮件 def send_email(smtp_obj, sender, rec_list, msg): smtp_obj.sendmail(sender, rec_list, msg) def op_excel(smtp_obj, filename:str): # 加载excel文件 data_only=True,自动计算公式 wb = load_workbook("2020年5月员工工资表.xlsx", data_only=True) # 使用xlsx文件,不要使用xls sheet = wb.active # 先取列名 table_col_name = [] for row in sheet.rows: for cell in row: # print(cell.value) table_col_name.append(cell.value) break # 循环excel for row in sheet.iter_rows(min_row=2): table_col_html = '<thead>' # 表头 row_text = '<tr>' # 开始一行 list_del = [] # 准备减掉的字段 list_finally = table_col_name[:] # 最终的字段 for cell in row: # print(cell.value, type(cell.value)) # None <class 'NoneType'> 0 <class 'int'> if cell.value == None or cell.value == 0: # 数据为零或空 # print(cell.col_idx) # 列数,从1开始数 list_del.append(table_col_name[cell.col_idx - 1]) else: row_text += f'<td>{cell.value}</td>,' row_text += '</tr>' # 结束一行 # 去掉值为零或空的字段 for i in list_del: list_finally.remove(i) # 重写首行 for i in list_finally: table_col_html += f'<th>{i}</th>' table_col_html += '</thead>' # 员工姓名 name = row[2].value # 从0开始数,第2列 staff_email = row[1].value # 员工邮箱地址 从0开始数,第1列 mail_body_context = f'''<h3>{name}:你好!</h3> <p>请查收你2020年5月的工资条。</p> <table border="1px solid black"> {table_col_html} {row_text} </table> ''' msg = MIMEText(mail_body_context, 'html', 'utf-8') msg['From'] = Header('HHHH人力资源部', 'utf-8') # 发送者 msg['To'] = Header('HHHH员工', 'utf-8') # 接收者 msg['Subject'] = Header('HHHH 2020年5月工资条', 'utf-8') # 主题 # 发邮件 try: send_email(smtp_obj, sender, [staff_email], msg.as_string()) print(f'成功发送工资条到{staff_email}--{name}...') except smtplib.SMTPException as e: print('Error:无法发送邮件.Case:%s' % e) if __name__ == '__main__': time_start = time.time() smtp_server = 'smtp.qq.com' # SMTP服务器 ssl_port = 465 # SMTP端口 sender = '123456789@qq.com' # 发件人邮箱 passwd = '**********' # 发件人密码 filename = "2020年5月员工工资表.xlsx" smtp_obj = login(smtp_server, ssl_port, sender, passwd) op_excel(smtp_obj, filename) time_end = time.time() print('脚本执行完毕,耗时%.3f秒。' % (time_end - time_start))
支持自动去掉值为空或为零的列。如奖金、请假等。
源码参考了alex在B站的分享。
https://www.bilibili.com/video/BV1UK4y1t7Ui?t=1395
标签:obj,员工工资,python,smtp,value,cell,条到,col,row 来源: https://www.cnblogs.com/hiuhungwan/p/13022248.html