Py自動(dòng)化辦公—Word文檔替換、Excel表格讀取、Pdf文件生成和Email自動(dòng)郵件發(fā)送實(shí)戰(zhàn)案例
回復(fù)“書籍”即可獲贈(zèng)Python從入門到進(jìn)階共10本電子書
大家好,我是Python進(jìn)階者。今天繼續(xù)給大家安排Python自動(dòng)辦公應(yīng)用的實(shí)戰(zhàn)文章,之前還有一些自動(dòng)化的文章,感興趣的小伙伴,可以看看,覺得不錯(cuò),記得點(diǎn)贊和留言支持噢,文章如下:
1、盤點(diǎn)4種使用Python批量合并同一文件夾內(nèi)所有子文件夾下的Excel文件內(nèi)所有Sheet數(shù)據(jù)
2、手把手教你使用openpyxl庫(kù)從Excel文件中提取指定的數(shù)據(jù)并生成新的文件(附源碼)
3、手把手教你4種方法用Python批量實(shí)現(xiàn)多Excel多Sheet合并
4、手把手教你利用Python輕松拆分Excel為多個(gè)CSV文件
5、老板讓我從幾百個(gè)Excel中查找數(shù)據(jù),我用Python一分鐘搞定!
8、利用Python將Word試卷匹配轉(zhuǎn)換為Excel表格
9、手把手教你用Python腳本調(diào)用 DeepL API Pro 進(jìn)電子書的行進(jìn)行中英文自動(dòng)翻譯
10、手把手教你用Python批量創(chuàng)建1-12月份的sheet表,每個(gè)表的第一行都有固定3個(gè)列標(biāo)題:A,B,C
【未完待續(xù)......】
前言
前幾天在學(xué)習(xí)【麥?zhǔn)濉康摹禤ython辦公效率手冊(cè)》一書,受益匪淺,原來(lái)Python自動(dòng)化辦公這么有趣,目前學(xué)完了前面四章,將四章內(nèi)容串起來(lái),整理成一篇小文章,分享給大家。當(dāng)然了,這里的展示只是冰山一角,更多精彩內(nèi)容還是要到原文中去汲取。
背景
想象一下,現(xiàn)在你有一份Word邀請(qǐng)函模板,然后你有一份客戶列表,上面有客戶的姓名、聯(lián)系方式、郵箱等基本信息,然后你的老板現(xiàn)在需要替換邀請(qǐng)函模板中的姓名,然后將Word邀請(qǐng)函模板生成Pdf格式,之后編輯統(tǒng)一的邀請(qǐng)?jiān)捫g(shù)(郵件正文),再依次發(fā)送邀請(qǐng)函附件到客戶郵箱,你會(huì)怎么做?
正常情況下,我們肯定是復(fù)制粘貼Excel表格中的客戶姓名,之后挨個(gè)Word文檔進(jìn)行替換,之后將Word轉(zhuǎn)Pdf格式,然后復(fù)制Excel表格中的郵箱進(jìn)行發(fā)送編輯好的郵件正常,之后附上邀請(qǐng)函附件,點(diǎn)擊發(fā)送,大概算一下,激情高昂的狀態(tài)下,這個(gè)流程快的話,大概需要1分鐘甚至更多。如果客戶只有幾十個(gè)就還好,一個(gè)小時(shí)就可以搞定,如果客戶有幾百個(gè),上千個(gè),甚至上萬(wàn)個(gè)呢?那估計(jì)要哭暈在辦公室了。

不過(guò)別慌,Python自動(dòng)化辦公,一套組合拳,使用Python自動(dòng)化辦公——Word文檔替換、Excel表格讀取、Pdf文件生成和Email自動(dòng)郵件發(fā)送一條龍服務(wù)安排,下面一起來(lái)看看吧!
實(shí)現(xiàn)過(guò)程
1)替換Word模板生成對(duì)應(yīng)邀請(qǐng)函
這里以上面的Word模板做案例,編寫一個(gè)函數(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:
run.text = run.text.replace('<name>', name)
doc.save(f'./邀請(qǐng)函/{name}.docx')
上面這個(gè)代碼需要理解Word文檔的結(jié)構(gòu),一個(gè)文檔有多個(gè)段落,用doc.paragraphs獲??;段落中的文字用para.text獲??;一個(gè)段落中可能有多個(gè)不同樣式的文本,這些不同的樣式被稱為run,一個(gè)段落中包含多個(gè)run,用para.runs獲取,一個(gè)run中的具體文本用run.text獲取。了解了這些,再看上述代碼,是不是清晰很多呢?
2)將Word邀請(qǐng)函轉(zhuǎn)化為Pdf格式
這個(gè)就簡(jiǎn)單很多了,Python自動(dòng)化辦公中,一行代碼就可以實(shí)現(xiàn),而且速度還十分快。
from docx2pdf import convert
convert(f"./邀請(qǐng)函/{name}.docx")
使用convert()函數(shù)可以把docx格式的文件轉(zhuǎn)換成同名的Pdf文檔。
3)讀取Excel表格中的姓名和郵箱
這里需要用到openpyxl庫(kù)了,當(dāng)然關(guān)于Excel的庫(kù)還是很多的,這里以這個(gè)庫(kù)作為示例,代碼如下:
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}邀請(qǐng)函正在生成...")
# get_invitation(name)
send_email(name, email)
上面的代碼,理解起來(lái)應(yīng)該并不難,讀取Excel中的姓名和郵箱,之后傳到get_invitation()生成邀請(qǐng)函,之后傳給send_email()函數(shù)中自動(dòng)發(fā)送郵件。實(shí)際上,這兩部是分開進(jìn)行的,這里是先執(zhí)行g(shù)et_invitation()函數(shù),先生成邀請(qǐng)函,之后再將該函數(shù)注釋掉,再執(zhí)行發(fā)送郵件函數(shù),
4)自動(dòng)發(fā)送郵件
關(guān)于自動(dòng)發(fā)送郵件,歷史文章中也曾經(jīng)發(fā)布過(guò)好幾篇了,這里繼續(xù)用上了,一開始我也覺得挺難的,后來(lái)發(fā)現(xiàn)也沒有想的那么復(fù)雜,代碼如下:
smtp = smtplib.SMTP(host="smtp.qq.com", port=587)
# smtp.login(郵箱, 授權(quán)碼)
smtp.login('[email protected]', "ruybefkipoo")
def send_email(name, email):
msg = MIMEMultipart()
msg["subject"] = f"您好,{name},您的邀請(qǐng)函!"
msg["from"] = "[email protected]"
msg["to"] = email
html_content = f"""
<html>
<body>
<p>您好:{name}<br>
<b>歡迎加入Python進(jìn)階者學(xué)習(xí)交流群,請(qǐng)?jiān)诟郊胁槭漳拈T票~</b><br>
點(diǎn)擊這里了解更多:<a >演唱會(huì)主頁(yè)</a>
</p>
</body>
</html>
"""
html_part = MIMEText(html_content, "html")
msg.attach(html_part)
with open(f"./邀請(qǐng)函/{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í)間多次請(qǐng)求登錄郵箱被封禁;其二郵箱登錄里邊用的是授權(quán)碼,而不是你的郵箱登錄密碼,這里使用的是qq郵箱做示例,其他郵箱需要更改smtp服務(wù);其三這個(gè)代碼里邊除了正文中引用了html寫法,還攜帶了Pdf格式的邀請(qǐng)函附件,稍顯復(fù)雜。關(guān)于授權(quán)碼的獲取,這里不再贅述了,之前歷史文章頁(yè)寫過(guò),網(wǎng)上的教程頁(yè)很多,不會(huì)的話,私我就行。或者參考下面這個(gè)文章:手把手教你使用Python網(wǎng)絡(luò)爬蟲實(shí)現(xiàn)郵件定時(shí)發(fā)送(附源碼)。
5)完整代碼
以上四個(gè)步驟進(jìn)行拆分了,依次完成了Word文檔替換、Excel表格讀取、Pdf文件生成和Email自動(dòng)郵件發(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
# 生成對(duì)應(yīng)的邀請(qǐ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:
run.text = run.text.replace('<name>', name)
doc.save(f'./邀請(qǐng)函/{name}.docx')
convert(f"./邀請(qǐng)函/{name}.docx")
smtp = smtplib.SMTP(host="smtp.qq.com", port=587)
smtp.login('[email protected]', "ruybefkipoo")
def send_email(name, email):
msg = MIMEMultipart()
msg["subject"] = f"您好,{name},您的邀請(qǐng)函!"
msg["from"] = "[email protected]"
msg["to"] = email
html_content = f"""
<html>
<body>
<p>您好:{name}<br>
<b>歡迎加入Python進(jìn)階者學(xué)習(xí)交流群,請(qǐng)?jiān)诟郊胁槭漳拈T票~</b><br>
點(diǎn)擊這里了解更多:<a >演唱會(huì)主頁(yè)</a>
</p>
</body>
</html>
"""
html_part = MIMEText(html_content, "html")
msg.attach(html_part)
with open(f"./邀請(qǐng)函/{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}邀請(qǐng)函正在生成...")
# get_invitation(name)
send_email(name, email)
if __name__ == '__main__':
get_username_email()
# get_invitation('Python進(jìn)階者')
總結(jié)
這篇文章基于Python自動(dòng)化辦公,主要介紹了使用Python相關(guān)庫(kù),依次完成Word文檔替換、Excel表格讀取、Pdf文件生成和Email自動(dòng)郵件發(fā)送任務(wù)。程序運(yùn)行之后,邀請(qǐng)函會(huì)自動(dòng)生成,然后郵件會(huì)自動(dòng)發(fā)送,速度也非常快,給幾百個(gè)、上千個(gè)客戶發(fā)送邀請(qǐng)函就不害怕了,如果有上萬(wàn)個(gè)客戶,可能需要借助第三方平臺(tái)輔助了,畢竟一般的普通郵箱,每日發(fā)送郵箱數(shù)是有限制的。

人生苦短,我用Python!感謝【麥?zhǔn)濉刻峁┑乃夭暮痛a,親測(cè)有效,這里的介紹只是冰山一角,更多內(nèi)容可以前往《Python辦公效率手冊(cè)》中獲取。

需要源數(shù)據(jù)的小伙伴可以添加我為好友,私我進(jìn)行獲取,或者前往我的github獲取:
https://github.com/cassieeric/Python-office-automation小伙伴們,快快用實(shí)踐一下吧!如果在學(xué)習(xí)過(guò)程中,有遇到任何問(wèn)題,歡迎加我好友,我拉你進(jìn)Python學(xué)習(xí)交流群共同探討學(xué)習(xí)。
------------------- End -------------------
往期精彩文章推薦:

歡迎大家點(diǎn)贊,留言,轉(zhuǎn)發(fā),轉(zhuǎn)載,感謝大家的相伴與支持
想加入Python學(xué)習(xí)群請(qǐng)?jiān)诤笈_(tái)回復(fù)【入群】
萬(wàn)水千山總是情,點(diǎn)個(gè)【在看】行不行
/今日留言主題/
隨便說(shuō)一兩句吧~~
