Python自動化辦公實(shí)戰(zhàn)案例詳解(Word、Excel、Pdf、Email郵件)
背景
想象一下,現(xiàn)在你有一份Word邀請函模板,然后你有一份客戶列表,上面有客戶的姓名、聯(lián)系方式、郵箱等基本信息,然后你的老板現(xiàn)在需要替換邀請函模板中的姓名,然后將Word邀請函模板生成Pdf格式,之后編輯統(tǒng)一的邀請?jiān)捫g(shù)(郵件正文),再依次發(fā)送邀請函附件到客戶郵箱,你會怎么做?
正常情況下,我們肯定是復(fù)制粘貼Excel表格中的客戶姓名,之后挨個Word文檔進(jìn)行替換,之后將Word轉(zhuǎn)Pdf格式,然后復(fù)制Excel表格中的郵箱進(jìn)行發(fā)送編輯好的郵件正常,之后附上邀請函附件,點(diǎn)擊發(fā)送,大概算一下,激情高昂的狀態(tài)下,這個流程快的話,大概需要1分鐘甚至更多。如果客戶只有幾十個就還好,一個小時(shí)就可以搞定,如果客戶有幾百個,上千個,甚至上萬個呢?那估計(jì)要哭暈在辦公室了。
不過別慌,Python自動化辦公,一套組合拳,使用Python自動化辦公——Word文檔替換、Excel表格讀取、Pdf文件生成和Email自動郵件發(fā)送一條龍服務(wù)安排,下面一起來看看吧!
實(shí)現(xiàn)過程
1)替換Word模板生成對應(yīng)邀請函
這里以上面的Word模板做案例,編寫一個函數(shù)以客戶姓名進(jìn)行替換模板中的<name>,一步到位。
def get_invitation(name): doc = docx.Document("template.docx") for para in doc.paragraphs: if '<name>' in para.text: for run in para.runs: if '<name>' in run.text: runrun.text = run.text.replace('<name>', name) doc.save(f'./邀請函/{name}.docx')
上面這個代碼需要理解Word文檔的結(jié)構(gòu),一個文檔有多個段落,用doc.paragraphs獲??;段落中的文字用para.text獲取;一個段落中可能有多個不同樣式的文本,這些不同的樣式被稱為run,一個段落中包含多個run,用para.runs獲取,一個run中的具體文本用run.text獲取。了解了這些,再看上述代碼,是不是清晰很多呢?
2)將Word邀請函轉(zhuǎn)化為Pdf格式
這個就簡單很多了,Python自動化辦公中,一行代碼就可以實(shí)現(xiàn),而且速度還十分快。
from docx2pdf import convert convert(f"./邀請函/{name}.docx")
使用convert()函數(shù)可以把docx格式的文件轉(zhuǎn)換成同名的Pdf文檔。
3)讀取Excel表格中的姓名和郵箱
這里需要用到openpyxl庫了,當(dāng)然關(guān)于Excel的庫還是很多的,這里以這個庫作為示例,代碼如下:
def get_username_email(): workbook = openpyxl.load_workbook("names.xlsx") worksheet = workbook.active for index, row in enumerate(worksheet.rows): if index > 0: name = row[0].value # 獲取表格第一列的姓名 email = row[3].value # 獲取表格第四列的郵箱 # print(name, email) # print(f"{name}邀請函正在生成...") # get_invitation(name) send_email(name, email)
上面的代碼,理解起來應(yīng)該并不難,讀取Excel中的姓名和郵箱,之后傳到get_invitation()生成邀請函,之后傳給send_email()函數(shù)中自動發(fā)送郵件。實(shí)際上,這兩部是分開進(jìn)行的,這里是先執(zhí)行g(shù)et_invitation()函數(shù),先生成邀請函,之后再將該函數(shù)注釋掉,再執(zhí)行發(fā)送郵件函數(shù),
4)自動發(fā)送郵件
關(guān)于自動發(fā)送郵件,歷史文章中也曾經(jīng)發(fā)布過好幾篇了,這里繼續(xù)用上了,一開始我也覺得挺難的,后來發(fā)現(xiàn)也沒有想的那么復(fù)雜,代碼如下:
smtp = smtplib.SMTP(host="smtp.qq.com", port=587) # smtp.login(郵箱, 授權(quán)碼) smtp.login('235977@qq.com', "ruybefkipoo") def send_email(name, email): msg = MIMEMultipart() msg["subject"] = f"您好,{name},您的邀請函!" msg["from"] = "2352180977@qq.com" msg["to"] = email html_content = f""" <html> <body> <p>您好:{name}<br> <b>歡迎加入Python進(jìn)階者學(xué)習(xí)交流群,請?jiān)诟郊胁槭漳拈T票~</b><br> 點(diǎn)擊這里了解更多:<a rel="external nofollow" rel="external nofollow" >演唱會主頁</a> </p> </body> </html> """ html_part = MIMEText(html_content, "html") msg.attach(html_part) with open(f"./邀請函/{name}.pdf", "rb") as f: doc_part = MIMEApplication(f.read()) doc_part.add_header("Content-Disposition", "attachment", filename=name) # 把附件添加到郵件中 msg.attach(doc_part) # 發(fā)送前面準(zhǔn)備好的郵件 smtp.send_message(msg) # 如果放到外邊登錄,這里就不用退出服務(wù)器連接,所以注釋掉了 # smtp.quit()
這里需要注意三點(diǎn),其一是郵箱登錄放在了函數(shù)外邊,防止函數(shù)多次調(diào)用,短時(shí)間多次請求登錄郵箱被封禁;其二郵箱登錄里邊用的是授權(quán)碼,而不是你的郵箱登錄密碼,這里使用的是qq郵箱做示例,其他郵箱需要更改smtp服務(wù);其三這個代碼里邊除了正文中引用了html寫法,還攜帶了Pdf格式的邀請函附件,稍顯復(fù)雜。
5)完整代碼
以上四個步驟進(jìn)行拆分了,依次完成了Word文檔替換、Excel表格讀取、Pdf文件生成和Email自動郵件發(fā)送任務(wù),這里附上完整的代碼。
import docx from docx2pdf import convert import openpyxl import smtplib from email.mime.text import MIMEText from email.mime.multipart import MIMEMultipart from email.mime.application import MIMEApplication # 生成對應(yīng)的邀請函,并轉(zhuǎn)存pdf格式 def get_invitation(name): doc = docx.Document("template.docx") for para in doc.paragraphs: if '<name>' in para.text: for run in para.runs: if '<name>' in run.text: runrun.text = run.text.replace('<name>', name) doc.save(f'./邀請函/{name}.docx') convert(f"./邀請函/{name}.docx") smtp = smtplib.SMTP(host="smtp.qq.com", port=587) smtp.login('235977@qq.com', "ruybefkipoo") def send_email(name, email): msg = MIMEMultipart() msg["subject"] = f"您好,{name},您的邀請函!" msg["from"] = "2352180977@qq.com" msg["to"] = email html_content = f""" <html> <body> <p>您好:{name}<br> <b>歡迎加入Python進(jìn)階者學(xué)習(xí)交流群,請?jiān)诟郊胁槭漳拈T票~</b><br> 點(diǎn)擊這里了解更多:<a rel="external nofollow" rel="external nofollow" >演唱會主頁</a> </p> </body> </html> """ html_part = MIMEText(html_content, "html") msg.attach(html_part) with open(f"./邀請函/{name}.pdf", "rb") as f: doc_part = MIMEApplication(f.read()) doc_part.add_header("Content-Disposition", "attachment", filename=name) # 把附件添加到郵件中 msg.attach(doc_part) # 發(fā)送前面準(zhǔn)備好的郵件 smtp.send_message(msg) # 如果放到外邊登錄,這里就不用退出服務(wù)器連接,所以注釋掉了 # smtp.quit() def get_username_email(): workbook = openpyxl.load_workbook("names.xlsx") worksheet = workbook.active for index, row in enumerate(worksheet.rows): if index > 0: name = row[0].value email = row[3].value # print(name, email) # print(f"{name}邀請函正在生成...") # get_invitation(name) send_email(name, email) if __name__ == '__main__': get_username_email() # get_invitation('Python進(jìn)階者')
總結(jié)
這篇文章基于Python自動化辦公,主要介紹了使用Python相關(guān)庫,依次完成Word文檔替換、Excel表格讀取、Pdf文件生成和Email自動郵件發(fā)送任務(wù)。程序運(yùn)行之后,邀請函會自動生成,然后郵件會自動發(fā)送,速度也非???,給幾百個、上千個客戶發(fā)送邀請函就不害怕了,如果有上萬個客戶,可能需要借助第三方平臺輔助了,畢竟一般的普通郵箱,每日發(fā)送郵箱數(shù)是有限制的。
到此這篇關(guān)于Python自動化辦公實(shí)戰(zhàn)案例詳解(Word、Excel、Pdf、Email郵件)的文章就介紹到這了,更多相關(guān)Python自動化辦公內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
python監(jiān)控linux內(nèi)存并寫入mongodb(推薦)
這篇文章主要介紹了python監(jiān)控linux內(nèi)存并寫入mongodb的相關(guān)資料,需要的朋友可以參考下2017-09-09pytest解讀fixtures之Teardown處理yield和addfinalizer方案
這篇文章主要為大家介紹了pytest解讀fixtures之Teardown處理yield和addfinalizer的方案實(shí)例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-06-06Python數(shù)組條件過濾filter函數(shù)使用示例
數(shù)組條件過濾簡潔實(shí)現(xiàn)方式,使用filter函數(shù),實(shí)現(xiàn)一個條件判斷函數(shù)即可,示例代碼如下2014-07-07本地部署Python?Flask并搭建web問答應(yīng)用程序框架實(shí)現(xiàn)遠(yuǎn)程訪問的操作方法
Flask是一個Python編寫的Web微框架,使用Python語言快速實(shí)現(xiàn)一個網(wǎng)站或Web服務(wù),本期教程我們使用Python Flask搭建一個web問答應(yīng)用程序框架,并結(jié)合cpolar內(nèi)網(wǎng)穿透工具將我們的應(yīng)用程序發(fā)布到公共網(wǎng)絡(luò)上,實(shí)現(xiàn)可多人遠(yuǎn)程進(jìn)入到該web應(yīng)用程序訪問,需要的朋友可以參考下2023-12-12如何實(shí)現(xiàn)python爬蟲爬取視頻時(shí)實(shí)現(xiàn)實(shí)時(shí)進(jìn)度條顯示
這篇文章主要介紹了如何實(shí)現(xiàn)python爬蟲爬取視頻時(shí)實(shí)現(xiàn)實(shí)時(shí)進(jìn)度條顯示,在爬取并下載網(wǎng)頁上的視頻的時(shí)候,我們需要實(shí)時(shí)進(jìn)度條,這可以幫助我們更直觀的看到視頻的下載進(jìn)度。文章圍繞主題展開更多內(nèi)容,需要的小伙伴可以參考一下2022-06-06