我用Python批量读取考生成绩单,并自动发送录取通知书邮件

Karen110
• 阅读 1658

我用Python批量读取考生成绩单,并自动发送录取通知书邮件

01

前言

大家好,我是J哥。

高考刚结束不久,很多小伙伴肯定都期待有个好成绩,能够进入理想的大学。而一旦成绩出来,大学招生办老师将面临给广大学子发送录取通知书的巨大工作压力,本文将利用Python技术,手把手教你用Python批量读取考生成绩,邮件合并且自动发送邮件,赶紧学起来吧~

需求如下:

我用Python批量读取考生成绩单,并自动发送录取通知书邮件

02

准备工作

首先,我们将图中三个文件置于同一文件夹中,邮件合并.ipynb为新建的Python文件,123邮件合并数据源.xls为成绩Excel表,邮件合并模板.docx为录取通知书模板。

我用Python批量读取考生成绩单,并自动发送录取通知书邮件

我们打开录取通知书模板,长这样:

我用Python批量读取考生成绩单,并自动发送录取通知书邮件

如果你使用过Word邮件合并功能批量生成文件,那这种模板就再熟悉不过了。

03

实战演练

文件都准备完毕,接下来打开Python文件,开始编写代码。

1、导入模块

导入之前需要安装两个主要库,一个是操作word模板的doctxpl,一个是操作邮件的zmail。因此先pip它们,很快~

#安装模块  
pip install docxtpl  
pip install zmail  

接着导入需要用到的模块:

#导入模板库  
from docxtpl import DocxTemplate  
import pandas as pd``  
#导入邮件库  
import zmail  
import time  

2、邮件合并

运用pandas的read_excel方法读取考生成绩表,逐个遍历考生信息,并将关键信息渲染至Word模板中,最后以考生姓名作为文件名保存。

#读取数据源  
df=pd.read_excel('123邮件合并数据源.xls')  
print(df)  

#Word邮件合并批量生成录取通知书  
for i in range(len(df)):  
    #以字典形式存储模板中需要更新的关键信息  
    contxt=dict(df.iloc[i])  
    #获取姓名,作为文件名  
    filename=contxt['姓名']  
    #获取邮箱地址  
    youxiang=contxt['邮箱']  
    #打开模板文件  
    tpl = DocxTemplate('邮件合并模板.docx')  
    #渲染(更新)模板文件生成新文件  
    tpl.render(contxt)  
    #保存文件  
    tpl.save(filename+'.docx')  

运行结果:

我用Python批量读取考生成绩单,并自动发送录取通知书邮件

3、发送邮件

接下来,我们需要将新生成的录取通知书逐个通过QQ邮箱发送,发件之前呢,需要对QQ邮箱进行简单配置。

第1步:打开QQ邮箱,点击设置-账户,一直拉到SMTP服务。

我用Python批量读取考生成绩单,并自动发送录取通知书邮件

开启SMTP服务,结果系统提示J哥的QQ没有申请第二代密码保护,无法开启,于是申请密保。申请密保主要是把手机号绑定你的QQ,如果申请过程中忘记一些信息,邀请你的好友辅助验证即可~

我用Python批量读取考生成绩单,并自动发送录取通知书邮件

好友辅助验证完成后,按要求发送短信:

我用Python批量读取考生成绩单,并自动发送录取通知书邮件

终于拿到授权码(Python发送QQ邮件必备参数):

我用Python批量读取考生成绩单,并自动发送录取通知书邮件

第2步:加入发送邮件的Python代码段

发送邮件的代码相对简单,以下代码段也给出了详细的注释,当然,最有效的学习方式还是参考官方文档,可以对各个参数进行深入研究。

 #设置邮件主题  
    subject='录取通知书'  
    #设置邮件内容  
    content='你己被我校录取,请妥善保管通知书,并按时报到!'  
    #设置邮件附件  
    attachment=filename+'.docx'  
    #设置邮件信息  
    mail={'subject':subject,'content_text':content,'attachments':attachment}  
    #设置发件邮箱  
    server = zmail.server('你的@qq.com','你的授权码')  
    #发送邮件  
    server.send_mail(youxiang,mail)  
    time.sleep(2)  
    print('第'+str(i+1)+'封邮件己发送成功')

邮件发送后,打开其中一封邮件,如下:

我用Python批量读取考生成绩单,并自动发送录取通知书邮件

04

完整代码

#导入模板库  
from docxtpl import DocxTemplate  
import pandas as pd  
#导入邮件库  
import zmail  
import time  
#读取数据源  
df=pd.read_excel('123邮件合并数据源.xls')  
print(df)  

#生成文件并以附件形式发送到邮箱  
for i in range(len(df)):  
    #以字典形式存储模板中需要更新的关键信息  
    contxt=dict(df.iloc[i])  
    #获取姓名,作为文件名  
    filename=contxt['姓名']  
    #获取邮箱地址  
    youxiang=contxt['邮箱']  
    #打开模板文件  
    tpl = DocxTemplate('邮件合并模板.docx')  
    #渲染(更新)模板文件生成新文件  
    tpl.render(contxt)  
    #保存文件  
    tpl.save(filename+'.docx')  
    #设置邮件主题  
    subject='录取通知书'  
    #设置邮件内容  
    content='你己被我校录取,请妥善保管通知书,并按时报到!'  
    #设置邮件附件  
    attachment=filename+'.docx'  
    #设置邮件信息  
    mail={'subject':subject,'content_text':content,'attachments':attachment}  
    #设置发件邮箱  
    server = zmail.server('你的@qq.com','你的授权码')  
    #发送邮件  
    server.send_mail(youxiang,mail)  
    time.sleep(2)  
    print('第'+str(i+1)+'封邮件己发送成功')  

print('邮件己全部发送成功')  

**-----**------**-----**---**** End **-----**--------**-----**-****

往期精彩文章推荐:

我用Python批量读取考生成绩单,并自动发送录取通知书邮件

欢迎各位大佬点击链接加入群聊【helloworld开发者社区】:https://jq.qq.com/?_wv=1027&k=mBlk6nzX进群交流IT技术热点。

本文转自 https://mp.weixin.qq.com/s/-yV1ElOwi10iHD9xQcydgw,如有侵权,请联系删除。

点赞
收藏
评论区
推荐文章
blmius blmius
3年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
Irene181 Irene181
3年前
最全总结!聊聊 Python 发送邮件的几种方式
1\.前言邮件,作为最正式规范的沟通方式,在日常办公过程中经常被用到我们都知道Python内置了对SMTP的支持,可以发送纯文本、富文本、HTML等格式的邮件本文将聊聊利用 Python发送邮件的3种方式2\.准备以126邮箱为例,在编码之前,我们需要开启SMTP服务然后,手动新增一个授权码其中,账号、授权码和服务器地址用于连接登录
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
Karen110 Karen110
3年前
​一篇文章总结一下Python库中关于时间的常见操作
前言本次来总结一下关于Python时间的相关操作,有一个有趣的问题。如果你的业务用不到时间相关的操作,你的业务基本上会一直用不到。但是如果你的业务一旦用到了时间操作,你就会发现,淦,到处都是时间操作。。。所以思来想去,还是总结一下吧,本次会采用类型注解方式。time包importtime时间戳从1970年1月1日00:00:00标准时区诞生到现在
Stella981 Stella981
3年前
Python3:sqlalchemy对mysql数据库操作,非sql语句
Python3:sqlalchemy对mysql数据库操作,非sql语句python3authorlizmdatetime2018020110:00:00coding:utf8'''
Wesley13 Wesley13
3年前
4cast
4castpackageloadcsv.KumarAwanish发布:2020122117:43:04.501348作者:KumarAwanish作者邮箱:awanish00@gmail.com首页:
Stella981 Stella981
3年前
Python之time模块的时间戳、时间字符串格式化与转换
Python处理时间和时间戳的内置模块就有time,和datetime两个,本文先说time模块。关于时间戳的几个概念时间戳,根据1970年1月1日00:00:00开始按秒计算的偏移量。时间元组(struct_time),包含9个元素。 time.struct_time(tm_y
Easter79 Easter79
3年前
Twitter的分布式自增ID算法snowflake (Java版)
概述分布式系统中,有一些需要使用全局唯一ID的场景,这种时候为了防止ID冲突可以使用36位的UUID,但是UUID有一些缺点,首先他相对比较长,另外UUID一般是无序的。有些时候我们希望能使用一种简单一些的ID,并且希望ID能够按照时间有序生成。而twitter的snowflake解决了这种需求,最初Twitter把存储系统从MySQL迁移
Wesley13 Wesley13
3年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
Python进阶者 Python进阶者
11个月前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这