当前位置:   article > 正文

9.17-9.18完成的自认为有成就感的程序:给员工批量自动邮件发送工资条程序_自动发送工资条到邮箱

自动发送工资条到邮箱
  1. # 给员工批量自动邮件发送工资条程序 9.17-9.18
  2. from openpyxl import load_workbook # 调用excel前必用的外部库,需要下载
  3. import smtplib
  4. from email.mime.text import MIMEText # 邮件正文
  5. from email.header import Header # 邮件头
  6. import base64 # 更改格式
  7. # 获取excel文件数据,data_only=True(excel中工资为函数计算的值,邮件中要把公式转换为计算值)
  8. wb = load_workbook("集团2023年度工资.xlsx", data_only=True)
  9. sheet = wb.active
  10. # 登录服务器
  11. # _SSL 加密传输 发件人邮箱中的SMTP服务器,端口
  12. smtp_obj = smtplib.SMTP_SSL("smtp.qq.com", 465)
  13. # 发件人的邮箱
  14. sender = "@qq.com"
  15. # 发件人的密码(password、授权码)
  16. password = ""
  17. # 发件人的邮箱账号、密码
  18. smtp_obj.login(sender, password)
  19. # 循环数据,并发送到对应邮箱
  20. count = 0
  21. table_col_html = '<thead>' # 表格表头
  22. for row in sheet.iter_rows(min_row=1): # row:行,col:列,cell:单元格
  23. count += 1
  24. if count == 1: # first row,把第一行的数据存到表里
  25. for cell in row:
  26. table_col_html += f"<th>{cell.value}</th>"
  27. table_col_html += "</thead>" # 示意表格结束
  28. continue # 跳过余下部分包括制作邮件、发送邮件等
  29. else:
  30. row_text = "<tr>" # 表格开始,制表
  31. for cell in row:
  32. row_text += f"<td>{cell.value}</td>"
  33. row_text += "</tr>" # 示意表格结束
  34. # 抽取要用到的接收者名字和接收者邮箱信息,可以更改index从表头获取(设置函数)
  35. name = row[1].value
  36. staff_email = row[0].value
  37. # print(staff_email, name)
  38. # 制作邮件
  39. # 邮件正文内容
  40. mail_body_context = f'''
  41. <h3>{name},你好:</h3>
  42. <p>请查收你的工资条.....</p>
  43. <table border="1px solid black">
  44. {table_col_html}
  45. {row_text}
  46. </table>
  47. '''
  48. # 把邮件主体内容转为可发送的模式(邮件内容,type(html、纯文本plain),编码)
  49. msg_body = MIMEText(mail_body_context, "html", "utf-8")
  50. # 更改发送者格式,在qq邮箱里面显示的格式为: 人事部 <"sender">
  51. fromName = "人事部"
  52. to_name = "员工"
  53. subject_name = "年度工资" # 可以用f{}类似上HTML,顺便把年月等信息标注出来
  54. # 汉字转base64
  55. fromName64 = base64.b64encode(bytes(fromName, 'utf-8'))
  56. # b'xxxx'转为 'xxxx'
  57. fromName64str = str(fromName64, 'utf-8')
  58. # 尖括号拼接用双引号,最后发送者的格式
  59. fromName_str = '"=?utf-8?B?' + fromName64str + '=?=" <' + sender + ">"
  60. # msg_body["From"] = Header("人事部", "utf-8") # 发送者,原来的错误代码
  61. msg_body['From'] = Header(fromName_str)
  62. msg_body["To"] = Header(to_name, "utf-8") # 接收者
  63. msg_body["Subject"] = Header(subject_name, "utf-8") # 主题
  64. # 发送邮件
  65. # 发送邮件("发件人",[收件人],.as_string 压缩成字符串)
  66. smtp_obj.sendmail(sender, [staff_email,], msg_body.as_string())
  67. # 反馈是否发送成功
  68. 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.工资条

前者就很离谱(牵扯到了一个未曾使用的库),后者通过搜索成功解决(不得不说巨麻烦)

自喜一下:嘿嘿,一篇搞定发送邮件

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/菜鸟追梦旅行/article/detail/432528
推荐阅读
相关标签
  

闽ICP备14008679号