我用Python批量讀取考生成績單,并自動發送錄取通知書郵件
本文轉載自微信公眾號「菜J學Python」,作者 J哥、燕子。轉載本文請聯系菜J學Python公眾號。
前言
大家好,我是J哥。
高考剛結束不久,很多小伙伴肯定都期待有個好成績,能夠進入理想的大學。而一旦成績出來,大學招生辦老師將面臨給廣大學子發送錄取通知書的巨大工作壓力,本文將利用Python技術,手把手教你用Python批量讀取考生成績,郵件合并且自動發送郵件,趕緊學起來吧~
需求如下:
02準備工作
首先,我們將圖中三個文件置于同一文件夾中,郵件合并.ipynb為新建的Python文件,123郵件合并數據源.xls為成績Excel表,郵件合并模板.docx為錄取通知書模板。
我們打開錄取通知書模板,長這樣:
如果你使用過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')
運行結果:
3、發送郵件
接下來,我們需要將新生成的錄取通知書逐個通過QQ郵箱發送,發件之前呢,需要對QQ郵箱進行簡單配置。
第1步:打開QQ郵箱,點擊設置-賬戶,一直拉到SMTP服務。
開啟SMTP服務,結果系統提示J哥的QQ沒有申請第二代密碼保護,無法開啟,于是申請密保。申請密保主要是把手機號綁定你的QQ,如果申請過程中忘記一些信息,邀請你的好友輔助驗證即可~
好友輔助驗證完成后,按要求發送短信:
終于拿到授權碼(Python發送QQ郵件必備參數):
第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)+'封郵件己發送成功')
郵件發送后,打開其中一封郵件,如下:
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('郵件己全部發送成功')