每个月发工资那几天,财务部的小王都要对着几百号人的工资表发呆。复制粘贴再发送,一套动作重复几百遍,眼睛都快瞎了。用Python写个脚本,把所有事情丢给电脑做,你就能喝杯咖啡等结果。
这个脚本的核心是读取Excel工资表,自动生成每个员工的HTML邮件正文,然后通过SMTP发送到个人邮箱。你只需要维护一个员工邮箱列表,其他全是自动化操作。别担心,代码很简单,几十分钟就能搞定。
第一步,准备数据源
把工资表存成Excel文件,第一行是列名:姓名、基本工资、绩效、扣款、实发工资、邮箱地址。确保邮箱列格式正确,不要有空格或多余字符。文件名固定为`salary.xlsx`,跟脚本放在同一个文件夹里。
第二步,写代码
用openpyxl读Excel,用smtplib发邮件。核心就这两步。关键点:邮件正文用HTML格式,因为工资条需要表格展示。每个人收到的是专属自己的数据,其他人看不到。
注意:不要在一个邮件里把所有人的工资都发出去,要逐行生成单独邮件。邮箱密码别写死在代码里,用环境变量或者配置文件。下面是一个可运行的脚本框架。
import openpyxl import smtplib
from email.mime.text import MIMEText
from email.mime.multipart import MIMEMultipart
加载工资表
wb = openpyxl.load_workbook('salary.xlsx')
ws = wb.active
配置邮箱信息,用QQ邮箱或公司邮箱都行
smtp_server = 'smtp.qq.com'
smtp_port = 587
sender = '你的邮箱@qq.com'
password = '你的授权码' 不是登录密码,是SMTP授权码
遍历每一行数据,从第二行开始(第一行是标题)
for row in ws.iter_rows(min_row=2, values_only=True):
name, base, jixiao, koukuan, shifa, email = row
创建邮件对象
msg = MIMEMultipart('alternative')
msg['Subject'] = f'{name}的工资条'
msg['From'] = sender
msg['To'] = email
构建HTML正文,用表格展示数据
html = f'''<html><body>
<p>{name}你好,这是你本月的工资明细:</p>
<table border='1' cellpadding='5' style='border-collapse:collapse;'>
<tr><td>基本工资</td><td>{base}</td></tr>
<tr><td>绩效</td><td>{jixiao}</td></tr>
<tr><td>扣款</td><td>{koukuan}</td></tr>
<tr><td><b>实发工资</b></td><td><b>{shifa}</b></td></tr>
</table>
<p>如有疑问请联系财务部。</p>
</body></html>'''
msg.attach(MIMEText(html, 'html'))
发送邮件
with smtplib.SMTP(smtp_server, smtp_port) as server:
server.starttls()
server.login(sender, password)
server.send_message(msg)
print(f'{name}的工资条已发送')
第三步,测试运行
先用两三个人做测试。把邮箱改成自己的小号,跑一遍看看收到的邮件样式对不对。表格是否对齐,数字是否显示的完整。最好先发给自己的QQ邮箱验证,不要直接发给所有同事。万一格式炸了,所有人都收到乱码,领导会找你谈话。
第四步,处理异常情况
实际工作中,有些人的邮箱可能写错了,有些人的数据可能空缺。加一个try-except块捕捉异常。遇到错误行时记录日志,不要中断整个发送过程。写个log文件,方便事后排查哪些人没收到。
failed = [] for ...:
try:
发送代码
except Exception as e:
failed.append(f'{name}: {str(e)}')
continue
if failed:
with open('failed.log', 'w') as f:
f.write('\n'.join(failed))
进阶选项:使用Excel模板
有些人喜欢保留详细的工资条格式,比如带公司logo、特定字体。那你就在Excel里做好模板,用openpyxl读取模板并填充数据,然后转成HTML。或者直接用win32com生成Excel文件并保存为附件发送。但是大部分公司只要求简单的表格,HTML已经够用。
这个脚本我用了两年了,每个月发工资前运行一次,不到十分钟搞定。以前需要一整天手动发的工资条,现在连班都不用加。同事觉得我很厉害,其实我只是把重复劳动交给了电脑。你也试试,保证一次就爱上。