使用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(filename, 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))
支持自动去掉值为空或为零的列。如奖金、请假等。
当然,也可以竖向排列工资条。
需要修改一下op_excel方法
def op_excel(smtp_obj, filename: str): # 操作表格
# 加载excel文件 data_only=True,自动计算公式
wb = load_workbook(filename, 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 = ''
list_del = [] # 准备减掉的字段
list_finally = table_col_name[:] # 最终的字段
list_money = [] # 金额
for cell in row:
# print(cell.value, type(cell.value)) # None <class 'NoneType'>
# 0 <class 'int'>
if cell.value is None or cell.value == 0: # 数据为零或空
# print(cell.col_idx) # 列数,从1开始数
list_del.append(table_col_name[cell.col_idx - 1])
else:
list_money.append(cell.value) # 去掉值为零或空的字段
for i in list_del:
list_finally.remove(i) # 员工姓名
name = row[1].value # 从0开始数,第2列
staff_email = row[2].value # 员工邮箱地址 从0开始数,第1列 # <tr>添充
for index in range(len(list_finally)):
# print(list_finally[index],list_money[index])
row_text += '<tr>' # 开始一行
row_text += f'<td>{list_finally[index]}</td>'
row_text += f'<td>{list_money[index]}</td>'
row_text += '</tr>' # 结束一行 mail_body_context = f'''<h3>{name}:你好!</h3>
<p>请查收你2020年5月的工资条。</p>
<table border="1px solid black">
<thead>
<th>项目</th>
<th>值</th>
</thead>
{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)
效果如下

源码参考了alex在B站的分享。
https://www.bilibili.com/video/BV1UK4y1t7Ui?t=1395
使用python自动发放员工工资条到个人邮箱的更多相关文章
- Python自动补全
转自:http://blog.linuxeye.com/324.html Python自动补全有vim编辑下和python交互模式下,下面分别介绍如何在这2种情况下实现Tab键自动补全. 一.vim ...
- linux终端python自动提示
linux终端python自动提示 很多时候,在linux下编写python时, 都懒得去vi一个新文件,直接就新开一个终端, 进入python命令行模式,然后就可以写一些测试代码. 不过最悲剧的就是 ...
- 从用python自动生成.h的头文件集合和类声明集合到用python读写文件
最近在用python自动生成c++的类.因为这些类会根据需求不同产生不同的类,所以需要用python自动生成.由于会产生大量的类,而且这些类是变化的.所以如果是在某个.h中要用include来加载这些 ...
- python自动安装mysql5.7
python自动安装mysql5.7 python版本:python2.6 centos版本:centos6.9 mysql版本:mysql5.7.19 安装目录路径和数据目录路径都是固定,当然也可以 ...
- python 自动发现Java端口
python 自动发现Java端口 #!/usr/bin/env python #encoding: utf8 import subprocess try: import json except Im ...
- 用Python自动发送邮件
用Python自动发送邮件 最近需要在服务器上处理一些耗时比较长的任务,因此想到利用python写一个自动发送邮件的脚本,在任务执行完毕后发送邮件通知我.以下代码以163邮箱为例: 开通163 ...
- python自动安装mysql5.7【转】
#!/usr/bin/env python import os import sys import re base_dir = '/opt/software/mysql-5.7.17-linux-gl ...
- Python 自动补全(vim)
一.vim python自动补全插件:pydiction 可以实现下面python代码的自动补全: 1.简单python关键词补全 2.python 函数补全带括号 3.python 模块补全 4.p ...
- Python自动发布Image service的实现
使用Python自动发布地图服务已经在上一篇博客中讲到,使用Python创建.sd服务定义文件,实现脚本自动发布ArcGIS服务,下面是利用Python自动发布Image service的实现. -- ...
随机推荐
- .NET6: 开发基于WPF的摩登三维工业软件 (2)
在<.NET6: 开发基于WPF的摩登三维工业软件 (1)>我们创建了一个"毛坯"界面,距离摩登还差一段距离.本文将对上一阶段的成果进行深化,实现当下流行的暗黑风格UI ...
- IDEA的使用和快捷键
一.字体设置: 菜单:file->setting->Appearan 编辑区字体大小:file->setting->Font 字体加粗:file->setting-> ...
- 【CF712E】Memory and Casinos(数学 期望 DP)
题目链接 大意 给出一个序列,当你在某个点时,有一个向右走的概率\(P_i\)(向左为\(1-P_i\)), 给出\(M\)个操作,操作有两类: 1 X Y Z:把\(P_X\)的值修改为\(\fra ...
- Git修改提交历史中的作者及邮箱信息
一.使用rebase 如图,红圈中提交的用户名及邮箱是需要改的,则需要复制需要改的提交记录的上一个记录hashcode,在本例中就是a0a891a48f92b51201042fccbe61ed1264 ...
- Linux上大文件切割以及批量并发处理
一.环境说明 某次项目需求中,在Linux上有批文本文件,文件文件都有几个G大,几千万行的数据.无论在Linux和Windows打开这么大的文件,基本上打开要卡半天,更别说编辑. 因此想到使用spli ...
- My97DatePicker接口
复制于http://blog.csdn.net/lidew521/article/details/8531685 一. 简介 1. 简介 目前的版本是:4.2 正式版 发布于2008-12-03 2. ...
- 『无为则无心』Python面向对象 — 47、Python中的self详解
目录 1.self的作用 2.self的使用注意事项 (1)self代表类的实例,而非类 (2)self不必非写成self,只是一种规范. (3)类中方法的形参中一定要写self,包括内置函数 (4) ...
- 微信小程序蓝牙开发
微信小程序蓝牙控制方案: 蓝牙模块如何快速改名并绑定用户手机?这样即使多台蓝牙设备在同一个地方使用也可以互不干扰,燧星科技给出解决方案. 长按控制板5秒进入待绑定下状态,点击"添加蓝牙设备& ...
- 教你快速区分传统报表和商业智能BI
很多人分不清楚,传统报表和商业智能BI之间的区别?有些人认为,BI就是做报表的,其实不然,报表只是BI的一部分,报表是关于过去和现状的展示,而BI是关于如何通过分析数据,帮助决策者找到改变和提高的方案 ...
- C#TaskScheduler 任务调度器的原理
什么是TaskScheduler? SynchronizationContext是对"调度程序(scheduler)"的通用抽象.个别框架会有自己的抽象调度程序,比如System. ...