Python自动化办公实战:包含Word、Excel、Pdf和Email邮件案例

开发 后端 自动化
这篇文章基于Python自动化办公,主要介绍了使用Python相关库,依次完成Word文档替换、Excel表格读取、Pdf文件生成和Email自动邮件发送任务。

 [[442480]]

背景

想象一下,现在你有一份Word邀请函模板,然后你有一份客户列表,上面有客户的姓名、联系方式、邮箱等基本信息,然后你的老板现在需要替换邀请函模板中的姓名,然后将Word邀请函模板生成Pdf格式,之后编辑统一的邀请话术(邮件正文),再依次发送邀请函附件到客户邮箱,你会怎么做?

正常情况下,我们肯定是复制粘贴Excel表格中的客户姓名,之后挨个Word文档进行替换,之后将Word转Pdf格式,然后复制Excel表格中的邮箱进行发送编辑好的邮件正常,之后附上邀请函附件,点击发送,大概算一下,激情高昂的状态下,这个流程快的话,大概需要1分钟甚至更多。如果客户只有几十个就还好,一个小时就可以搞定,如果客户有几百个,上千个,甚至上万个呢?那估计要哭晕在办公室了。

不过别慌,Python自动化办公,一套组合拳,使用Python自动化办公——Word文档替换、Excel表格读取、Pdf文件生成和Email自动邮件发送一条龙服务安排,下面一起来看看吧!

实现过程

1)替换Word模板生成对应邀请函

这里以上面的Word模板做案例,编写一个函数以客户姓名进行替换模板中的<name>,一步到位。 

  1. def get_invitation(name):  
  2.     doc = docx.Document("template.docx")  
  3.     for para in doc.paragraphs:  
  4.         if '<name>' in para.text:  
  5.             for run in para.runs:  
  6.                 if '<name>' in run.text:  
  7.                     runrun.text = run.text.replace('<name>', name)  
  8.         doc.save(f'./邀请函/{name}.docx') 

上面这个代码需要理解Word文档的结构,一个文档有多个段落,用doc.paragraphs获取;段落中的文字用para.text获取;一个段落中可能有多个不同样式的文本,这些不同的样式被称为run,一个段落中包含多个run,用para.runs获取,一个run中的具体文本用run.text获取。了解了这些,再看上述代码,是不是清晰很多呢?

2)将Word邀请函转化为Pdf格式

这个就简单很多了,Python自动化办公中,一行代码就可以实现,而且速度还十分快。 

  1. from docx2pdf import convert  
  2. convert(f"./邀请函/{name}.docx") 

使用convert()函数可以把docx格式的文件转换成同名的Pdf文档。

3)读取Excel表格中的姓名和邮箱

这里需要用到openpyxl库了,当然关于Excel的库还是很多的,这里以这个库作为示例,代码如下: 

  1. def get_username_email():  
  2.     workbook = openpyxl.load_workbook("names.xlsx")  
  3.     worksheet = workbook.active  
  4.     for index, row in enumerate(worksheet.rows):  
  5.         if index > 0:  
  6.             name = row[0].value  # 获取表格第一列的姓名  
  7.             email = row[3].value  # 获取表格第四列的邮箱  
  8.             # print(name, email) 
  9.             # print(f"{name}邀请函正在生成...")  
  10.             # get_invitation(name)  
  11.             send_email(name, email) 

上面的代码,理解起来应该并不难,读取Excel中的姓名和邮箱,之后传到get_invitation()生成邀请函,之后传给send_email()函数中自动发送邮件。实际上,这两部是分开进行的,这里是先执行get_invitation()函数,先生成邀请函,之后再将该函数注释掉,再执行发送邮件函数,

4)自动发送邮件

关于自动发送邮件,历史文章中也曾经发布过好几篇了,这里继续用上了,一开始我也觉得挺难的,后来发现也没有想的那么复杂,代码如下: 

  1. smtp = smtplib.SMTP(host="smtp.qq.com"port=587 
  2. # smtp.login(邮箱, 授权码)  
  3. smtp.login('235977@qq.com', "ruybefkipoo")  
  4. def send_email(name, email):  
  5.     msg = MIMEMultipart()  
  6.     msg["subject"] = f"您好,{name},您的邀请函!"  
  7.     msg["from"] = "2352180977@qq.com"  
  8.     msg["to"] = email  
  9.     html_content = f"" 
  10.     <html>  
  11.         <body>  
  12.                 <p>您好:{name}<br>  
  13.                     <b>欢迎加入Python进阶者学习交流群,请在附件中查收您的门票~</b><br>  
  14.                     点击这里了解更多:<a href="https://www.pdcfighting.com">演唱会主页</a>  
  15.                 </p>  
  16.         </body>  
  17.     </html>  
  18.     """  
  19.     html_part = MIMEText(html_content, "html")  
  20.     msg.attach(html_part)  
  21.     with open(f"./邀请函/{name}.pdf", "rb") as f:  
  22.         doc_part = MIMEApplication(f.read())  
  23.         doc_part.add_header("Content-Disposition", "attachment", filename=name)  
  24.         # 把附件添加到邮件中  
  25.         msg.attach(doc_part)  
  26.         # 发送前面准备好的邮件  
  27.         smtp.send_message(msg)  
  28.         # 如果放到外边登录,这里就不用退出服务器连接,所以注释掉了  
  29.         # smtp.quit() 

这里需要注意三点,其一是邮箱登录放在了函数外边,防止函数多次调用,短时间多次请求登录邮箱被封禁;其二邮箱登录里边用的是授权码,而不是你的邮箱登录密码,这里使用的是qq邮箱做示例,其他邮箱需要更改smtp服务;其三这个代码里边除了正文中引用了html写法,还携带了Pdf格式的邀请函附件,稍显复杂。

5)完整代码

以上四个步骤进行拆分了,依次完成了Word文档替换、Excel表格读取、Pdf文件生成和Email自动邮件发送任务,这里附上完整的代码。 

  1. import docx  
  2. from docx2pdf import convert  
  3. import openpyxl  
  4. import smtplib  
  5. from email.mime.text import MIMEText  
  6. from email.mime.multipart import MIMEMultipart  
  7. from email.mime.application import MIMEApplication  
  8. # 生成对应的邀请函,并转存pdf格式  
  9. def get_invitation(name):  
  10.     doc = docx.Document("template.docx")  
  11.     for para in doc.paragraphs:  
  12.         if '<name>' in para.text:  
  13.             for run in para.runs:  
  14.                 if '<name>' in run.text: 
  15.                     runrun.text = run.text.replace('<name>', name)  
  16.         doc.save(f'./邀请函/{name}.docx')  
  17.     convert(f"./邀请函/{name}.docx")  
  18. smtp = smtplib.SMTP(host="smtp.qq.com"port=587 
  19. smtp.login('235977@qq.com', "ruybefkipoo")  
  20. def send_email(name, email):  
  21.     msg = MIMEMultipart()  
  22.     msg["subject"] = f"您好,{name},您的邀请函!"  
  23.     msg["from"] = "2352180977@qq.com"  
  24.     msg["to"] = email  
  25.     html_content = f"" 
  26.     <html>  
  27.         <body>  
  28.                 <p>您好:{name}<br>  
  29.                     <b>欢迎加入Python进阶者学习交流群,请在附件中查收您的门票~</b><br>  
  30.                     点击这里了解更多:<a href="https://www.pdcfighting.com">演唱会主页</a>  
  31.                 </p>  
  32.         </body>  
  33.     </html>  
  34.     """  
  35.     html_part = MIMEText(html_content, "html")  
  36.     msg.attach(html_part)  
  37.     with open(f"./邀请函/{name}.pdf", "rb") as f:  
  38.         doc_part = MIMEApplication(f.read())  
  39.         doc_part.add_header("Content-Disposition", "attachment", filename=name)  
  40.         # 把附件添加到邮件中  
  41.         msg.attach(doc_part)  
  42.         # 发送前面准备好的邮件  
  43.         smtp.send_message(msg)  
  44.         # 如果放到外边登录,这里就不用退出服务器连接,所以注释掉了  
  45.         # smtp.quit()  
  46. def get_username_email():  
  47.     workbook = openpyxl.load_workbook("names.xlsx")  
  48.     worksheet = workbook.active 
  49.     for index, row in enumerate(worksheet.rows):  
  50.         if index > 0:  
  51.             name = row[0].value  
  52.             email = row[3].value  
  53.             # print(name, email)  
  54.             # print(f"{name}邀请函正在生成...")  
  55.             # get_invitation(name)  
  56.             send_email(name, email)  
  57. if __name__ == '__main__':  
  58.     get_username_email()  
  59.     # get_invitation('Python进阶者') 

总结

这篇文章基于Python自动化办公,主要介绍了使用Python相关库,依次完成Word文档替换、Excel表格读取、Pdf文件生成和Email自动邮件发送任务。程序运行之后,邀请函会自动生成,然后邮件会自动发送,速度也非常快,给几百个、上千个客户发送邀请函就不害怕了,如果有上万个客户,可能需要借助第三方平台辅助了,毕竟一般的普通邮箱,每日发送邮箱数是有限制的。

 

 

责任编辑:庞桂玉 来源: 菜鸟学Python
相关推荐

2021-12-14 07:40:08

Excel自动化办公

2022-03-21 10:09:08

PythonExcel邮件

2023-11-20 22:07:51

PythonPDF

2020-04-21 10:45:47

PythonWordExcel

2021-04-17 23:10:59

Python微软Word

2020-11-05 12:56:19

Python办公自动化

2022-06-13 09:12:04

PythonPDF代码

2021-07-09 07:24:47

Python自动化办公

2022-07-05 08:26:10

Python报表自动化邮箱

2023-10-18 13:57:17

2021-02-01 11:03:36

Python开发邮件

2020-05-25 14:32:42

Python电子邮件自动化

2021-02-01 12:24:40

Python日志Expect

2022-08-04 13:27:35

Pythonopenpyxl

2021-03-12 08:56:10

Java组件

2020-09-24 14:40:55

Python 开发编程语言

2013-04-16 14:55:21

自动化运维Puppet实战

2021-05-06 13:45:13

PythonExce弹窗

2023-05-15 08:01:32

Python办公自动化

2011-08-16 15:36:47

iPhone应用测试
点赞
收藏

51CTO技术栈公众号