人力资源部每个月发工资条,以前靠人工手动一条一条的复制,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 = '' # 表头

row_text = '

' # 开始一行

list_del = [] # 准备减掉的字段

list_finally = table_col_name[:] # 最终的字段

for cell in row:

# print(cell.value, type(cell.value)) # None 0

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'

{cell.value}'

row_text += '

' # 结束一行

# 去掉值为零或空的字段

for i in list_del:

list_finally.remove(i)

# 重写首行

for i in list_finally:

table_col_html += f'

{i}'

table_col_html += '

'

# 员工姓名

name = row[2].value # 从0开始数,第2列

staff_email = row[1].value # 员工邮箱地址 从0开始数,第1列

mail_body_context = f'''

{name}:你好!

请查收你2020年5月的工资条。

{table_col_html}

{row_text}

'''

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 = '' # 表头

row_text = ''

list_del = [] # 准备减掉的字段

list_finally = table_col_name[:] # 最终的字段

list_money = [] # 金额

for cell in row:

# print(cell.value, type(cell.value)) # None

# 0

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列

#

添充

for index in range(len(list_finally)):

# print(list_finally[index],list_money[index])

row_text += '

' # 开始一行

row_text += f'

{list_finally[index]}'

row_text += f'

{list_money[index]}'

row_text += '

' # 结束一行

mail_body_context = f'''

{name}:你好!

请查收你2020年5月的工资条。

项目值

{row_text}

'''

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自动发放员工工资条到个人邮箱相关推荐

  1. python自动发微信新闻网_用python自制微信机器人,定时发送天气预报

    0 引言 前段时间找到了一个免费的天气预报API,费了好段时间把这个API解析并组装成自己想用的格式了,就想着如何实现每天发送天气信息给自己.最近无意中发现了wxpy库,用它来做再合适不过了.以下是w ...

  2. 用python刷微信阅读_使用python让微信读书自动翻页

    微信读书目前是朋友圈最流行的一款读书app,但是很遗憾微信读书没有自动翻页模式,不过这可难不倒程序员,写个程序让它自动翻页不久好了. 而且微信读书有这样一个激励政策:"每阅读30分钟可兑1赠 ...

  3. python接收微信消息_【Python写微信防撤回脚本】02 接收记录聊天信息

    上一期我们安装好了ItChat,并且学会用它登录微信.想知道它还能做什么?往下滑吧~ 接收好友信息 利用ItChat登录微信之后,我们就可以自动记录好友发来的信息. 话不多说,直接上代码: impor ...

  4. 用python创建微信机器人_用Python创建微信机器人

    原标题:用Python创建微信机器人 文/裸睡的猪哥 图片来源于网络 微信,一个日活10亿的超级app,不仅在国内社交独领风骚,在国外社交也同样占有一席之地.今天我们要讲的便是如何用Python来做一 ...

  5. python发朋友圈_用 Python 发一个高逼格的朋友圈

    原标题:用 Python 发一个高逼格的朋友圈 源 /痴海文 /痴海 分享一个非常骚气的发朋友圈姿势.效果如下. 利用今天教给大家的 python 脚本,把一张图重新分隔成 9 张.上传到朋友圈,最后 ...

  6. python调用微信客户端_用Python编写的简化版微信客户端

    原标题:用Python编写的简化版微信客户端 原文:A simple WeChat client written in Python supports session persistence. 翻译: ...

  7. python发微信红包_微信公众号开发小记——5.python微信红包

    描述 有时候产品有这么一些需求,当用户满足一定条件时,给他发一定金额的红包. 微信各个服务是独立的,比较蛋疼,要用红包功能,首先你需要注册一个微信商户平台账号. 代码位置 分支pay-20160802 ...

  8. python发微信红包_微信现金红包 python

    redpack ={'success': '发放红包成功','error': '出现问题,请重试','repeat': '你已经领取过该红包,请勿重复领取','actError': '活动无效'} a ...

  9. python爬微信头像_使用python itchat包爬取微信好友头像形成矩形头像集的方法

    初学python,我们必须干点有意思的事!从微信下手吧! 头像集样例如下: 大家可以发朋友圈开启辨认大赛哈哈~ 话不多说,直接上代码,注释我写了比较多,大家应该能看懂 import itchat im ...

最新文章

  1. Linux Centos 7 安装配置nginx
  2. 向访客和爬虫显示不同的内容
  3. python之父-Python之父宣布退休,但Python仍在吞噬世界
  4. 通过Redis实现分布式锁
  5. C# 打开指定的文件夹 记住路径中 / 与 \ 的用法
  6. P7717-「EZEC-10」序列【Trie】
  7. 移动端自适应缩放代码
  8. angular 新建命令
  9. 20145325张梓靖 《信息安全系统设计基础》第10周学习总结
  10. learn go return fuction
  11. 爬取今日头条新闻,并导入execle中(主要用了selenium)
  12. 面试阿里,看这一篇就够了!
  13. Spring Cloud Netflix 服务注册与发现 — Eureka 入门案例
  14. Android 模块化开发
  15. ios 故事版 设定UIImageRenderingMode的方式
  16. Win10中如何把语言栏缩到系统托盘
  17. 洛谷 P2191 小Z的情书
  18. 阿里云服务器域名备案
  19. MyBatis映射文件如何给数据库的int类型字段“插入”string类型记录
  20. node js 运行服务器,node.js – NodeJS服务器如何运行

热门文章

  1. 解决vue项目路由出现message: “Navigating to current location (XXX) is not allowed“的问题(点击多次跳转)
  2. 【UER #4】量子态的棋盘
  3. html制作课程导航页面,学成在线页面制作(HTML+CSS部分)(顶部+轮播图部分)...
  4. 射击末世--建造者模式
  5. 上海伯俊软件科技有限公司面试题
  6. 【Ansys】什么软件模块是DS,它和workbench、mechanical的区别在哪里?
  7. Elasticsearch 中为什么选择倒排索引而不选择 B 树索引
  8. 这次的新计算,很全能!
  9. 龙腾世纪:起源–最后的古代墓碑和剑圣盔甲
  10. 解决oracle分布式锁,2.5.2 分布式锁管理器(DLM)