人力资源部每个月发工资条,以前靠人工手动一条一条的复制,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自动发放员工工资条到个人邮箱的更多相关文章

  1. Python自动补全

    转自:http://blog.linuxeye.com/324.html Python自动补全有vim编辑下和python交互模式下,下面分别介绍如何在这2种情况下实现Tab键自动补全. 一.vim ...

  2. linux终端python自动提示

    linux终端python自动提示 很多时候,在linux下编写python时, 都懒得去vi一个新文件,直接就新开一个终端, 进入python命令行模式,然后就可以写一些测试代码. 不过最悲剧的就是 ...

  3. 从用python自动生成.h的头文件集合和类声明集合到用python读写文件

    最近在用python自动生成c++的类.因为这些类会根据需求不同产生不同的类,所以需要用python自动生成.由于会产生大量的类,而且这些类是变化的.所以如果是在某个.h中要用include来加载这些 ...

  4. python自动安装mysql5.7

    python自动安装mysql5.7 python版本:python2.6 centos版本:centos6.9 mysql版本:mysql5.7.19 安装目录路径和数据目录路径都是固定,当然也可以 ...

  5. python 自动发现Java端口

    python 自动发现Java端口 #!/usr/bin/env python #encoding: utf8 import subprocess try: import json except Im ...

  6. 用Python自动发送邮件

    用Python自动发送邮件     最近需要在服务器上处理一些耗时比较长的任务,因此想到利用python写一个自动发送邮件的脚本,在任务执行完毕后发送邮件通知我.以下代码以163邮箱为例: 开通163 ...

  7. python自动安装mysql5.7【转】

    #!/usr/bin/env python import os import sys import re base_dir = '/opt/software/mysql-5.7.17-linux-gl ...

  8. Python 自动补全(vim)

    一.vim python自动补全插件:pydiction 可以实现下面python代码的自动补全: 1.简单python关键词补全 2.python 函数补全带括号 3.python 模块补全 4.p ...

  9. Python自动发布Image service的实现

    使用Python自动发布地图服务已经在上一篇博客中讲到,使用Python创建.sd服务定义文件,实现脚本自动发布ArcGIS服务,下面是利用Python自动发布Image service的实现. -- ...

随机推荐

  1. 【web安全】Nodejs原型链污染分析

    Nodejs原型链污染分析 什么是js原型? 可以将js原型理解为其他OOP语言中的类,但还是有细微区别. 1. function F(){...} 2. var f = new F(); 分析: 1 ...

  2. NOIP2021T1报数——黄蓝紫黑的神奇梯度

    7A3T 点击查看代码 #include<iostream> #include<cstdio> #include<cmath> #include<algori ...

  3. 经纬坐标(BLH)数据创建.kml文件小工具设计 Java版

    技术背景 KML,是标记语言(Keyhole Markup Language)的缩写,最初由Keyhole公司开发,是一种基于XML 语法与格式的.用于描述和保存地理信息(如点.线.图像.多边形和模型 ...

  4. Note -「矩阵树定理」学习笔记

      大概--会很简洁吧 qwq. 矩阵树定理   对于无自环无向图 \(G=(V,E)\),令其度数矩阵 \(D\),邻接矩阵 \(A\),令该图的 \(\text{Kirchhoff}\) 矩阵 \ ...

  5. Solution -「APIO/CTSC 2007」「洛谷 P3620」数据备份

    \(\mathcal{Description}\)   Link.   给定升序序列 \(\{x_n\}\) 以及整数 \(k\),在 \(\{x_n\}\) 中选出恰 \(k\) 对 \((x_i, ...

  6. 微服务从代码到k8s部署应有尽有系列(三、鉴权)

    我们用一个系列来讲解从需求到上线.从代码到k8s部署.从日志到监控等各个方面的微服务完整实践. 整个项目使用了go-zero开发的微服务,基本包含了go-zero以及相关go-zero作者开发的一些中 ...

  7. 布尔值与比较运算符"=="

    $man = "男";$flag = $man == "男"; //双等号是比较运算符,返回布尔值,成立则返1赋给$flag 不成立返回0,0即为nullech ...

  8. SpringBoot是如何做到自动装配的

    背景 众所周知,如下即可启动一个最简单的Spring应用.查看@SpringBootApplication注解的源码,发现这个注解上有一个重要的注解@EnableAutoConfiguration,而 ...

  9. Windows原理深入学习系列-强制完整性控制

    欢迎关注微信公众号:[信安成长计划] 0x00 目录 0x01 介绍 0x02 完整性等级 0x03 文件读取测试 0x04 进程注入测试 0x05 原理分析 Win10_x64_20H2 0x06 ...

  10. k8s集群搭建EFK日志平台:ElasticSearch + Fluentd + Kibana

    k8s集群 kubectl get node EFK简介 ElasticSearch:分布式存储检索引擎,用来搜索.存储日志 Fluentd:日志采集 Kibana:读取es中数据进行可视化web界面 ...