赞
踩
- # 给员工批量自动邮件发送工资条程序 9.17-9.18
- from openpyxl import load_workbook # 调用excel前必用的外部库,需要下载
- import smtplib
- from email.mime.text import MIMEText # 邮件正文
- from email.header import Header # 邮件头
- import base64 # 更改格式
-
- # 获取excel文件数据,data_only=True(excel中工资为函数计算的值,邮件中要把公式转换为计算值)
- wb = load_workbook("集团2023年度工资.xlsx", data_only=True)
- sheet = wb.active
-
- # 登录服务器
- # _SSL 加密传输 发件人邮箱中的SMTP服务器,端口
- smtp_obj = smtplib.SMTP_SSL("smtp.qq.com", 465)
- # 发件人的邮箱
- sender = "@qq.com"
- # 发件人的密码(password、授权码)
- password = ""
- # 发件人的邮箱账号、密码
- smtp_obj.login(sender, password)
-
- # 循环数据,并发送到对应邮箱
- count = 0
- table_col_html = '<thead>' # 表格表头
- for row in sheet.iter_rows(min_row=1): # row:行,col:列,cell:单元格
- count += 1
- if count == 1: # first row,把第一行的数据存到表里
- for cell in row:
- table_col_html += f"<th>{cell.value}</th>"
- table_col_html += "</thead>" # 示意表格结束
- continue # 跳过余下部分包括制作邮件、发送邮件等
- else:
- row_text = "<tr>" # 表格开始,制表
- for cell in row:
- row_text += f"<td>{cell.value}</td>"
- row_text += "</tr>" # 示意表格结束
- # 抽取要用到的接收者名字和接收者邮箱信息,可以更改index从表头获取(设置函数)
- name = row[1].value
- staff_email = row[0].value
- # print(staff_email, name)
- # 制作邮件
- # 邮件正文内容
- mail_body_context = f'''
- <h3>{name},你好:</h3>
- <p>请查收你的工资条.....</p>
- <table border="1px solid black">
- {table_col_html}
- {row_text}
- </table>
- '''
- # 把邮件主体内容转为可发送的模式(邮件内容,type(html、纯文本plain),编码)
- msg_body = MIMEText(mail_body_context, "html", "utf-8")
- # 更改发送者格式,在qq邮箱里面显示的格式为: 人事部 <"sender">
- fromName = "人事部"
- to_name = "员工"
- subject_name = "年度工资" # 可以用f{}类似上HTML,顺便把年月等信息标注出来
- # 汉字转base64
- fromName64 = base64.b64encode(bytes(fromName, 'utf-8'))
- # b'xxxx'转为 'xxxx'
- fromName64str = str(fromName64, 'utf-8')
- # 尖括号拼接用双引号,最后发送者的格式
- fromName_str = '"=?utf-8?B?' + fromName64str + '=?=" <' + sender + ">"
- # msg_body["From"] = Header("人事部", "utf-8") # 发送者,原来的错误代码
- msg_body['From'] = Header(fromName_str)
- msg_body["To"] = Header(to_name, "utf-8") # 接收者
- msg_body["Subject"] = Header(subject_name, "utf-8") # 主题
-
- # 发送邮件
- # 发送邮件("发件人",[收件人],.as_string 压缩成字符串)
- smtp_obj.sendmail(sender, [staff_email,], msg_body.as_string())
- # 反馈是否发送成功
- print(f"成功发送工资条到{staff_email}- {name}....")
提醒:程序需手动添加输入发送者的账号和password,另外本程序暂时只适用于用固定格式写的excel文件(可修改),是否修改呢,就看笔者懒不懒了,另外可以修改前言内容,即from、to、subject
先说可以改进的地方:
其一、完全没有运用函数,这是一个糟糕的不成熟的表现
其二、可以写成一个脚本,但这是笔者能力不足的地方
其三、程序的德鲁性(可能是这个名字)不强,主要体现在没有检测发送者邮箱的格式和接收者的格式(尽管我并没有刻意的制造错误去运行程序)
其四、表不够丰富,额换言之表做的太丑了,可以通过color语法以及控制size,不制作的原因就是笔者没有去查具体的语法
自我勉励一下:希望能够加以勤奋,把上面的代码美化吧
再记录一下写这段程序的艰辛:
1.HTML没学,毫不夸张的说暂时是生搬硬套,也是其四的原因
2.邮箱玩的还很小白(捞),对开通SMT和授权码搞了半天,也是我不聪明和贪玩,没有尽早的查资料
3.那个发送者From啊,搞了我半天,一直报错,报了两次错,报错代码如下:
socket.gaierror: [Errno 11001] getaddrinfo failed
给员工批量自动邮件发送smtplib.SMTPDataError: (550, b The From header is missing or invalid. Please follow RFC5322, RFC2047, RFC822 standard protocol.工资条
前者就很离谱(牵扯到了一个未曾使用的库),后者通过搜索成功解决(不得不说巨麻烦)
自喜一下:嘿嘿,一篇搞定发送邮件
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。