600字范文,内容丰富有趣,生活中的好帮手!
600字范文 > python实现自动发工资发邮件-使用python自动发放员工工资条到个人邮箱

python实现自动发工资发邮件-使用python自动发放员工工资条到个人邮箱

时间:2019-07-20 09:33:58

相关推荐

python实现自动发工资发邮件-使用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 = '' # 表头

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}:你好!

请查收你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 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服务器

ssl_port = 465 # SMTP端口

sender = '123456789@' # 发件人邮箱

passwd = '**********' # 发件人密码

filename = "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}:你好!

请查收你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 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站的分享。

/video/BV1UK4y1t7Ui?t=1395

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。