Python自动化办公:Word模板替换、Excel读取与PDF邮件群发实战
本文详解如何利用Python实现自动化办公流程。通过结合python-docx、openpyxl、docx2pdf及smtplib等库,自动从Excel读取客户信息,替换Word模板生成个性化邀请函,转换为PDF后通过邮箱批量发送。该方案可大幅减少手动复制粘贴和重复操作的时间,适用于成百上千的客户通知场景。
背景
假设你手头有一份Word格式的邀请函模板,以及一份包含客户姓名、联系方式和邮箱地址的客户列表Excel表格。老板要求将模板中的姓名占位符替换为具体客户姓名,把生成的Word文档转换为PDF格式,编写统一的邮件正文,并将带有邀请函附件的邮件逐一发送给对应客户。面对这一系列繁琐的操作,该如何高效完成?

常规做法是手动从Excel复制客户姓名,逐个打开Word文档进行替换,再将Word另存为PDF,接着复制邮箱地址,编辑邮件并附上附件后发送。即便在状态极佳的情况下,处理单个客户至少需要1分钟。若客户数量仅为几十人,耗时约一小时尚能接受;但若涉及数百、上千甚至上万个客户,这种手动方式将极其耗时且容易出错。

无需担忧,借助Python自动化办公工具链,可以实现从Word模板替换、Excel数据读取、PDF文件生成到Email自动发送的全流程自动化。接下来将详细介绍具体实现步骤。
实现过程
1)替换Word模板生成对应邀请函
以上述Word模板为例,编写一个函数,根据传入的客户姓名自动替换模板中的占位符,从而生成个性化的邀请函文档。
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文档的结构:一个文档由多个段落(paragraphs)组成,可通过doc.paragraphs获取;段落中的文本通过para.text获取;而一个段落内可能包含多个具有不同样式的文本片段,这些片段称为run,通过para.runs获取;具体的文本内容则通过run.text获取。理清这些结构后,代码逻辑便一目了然。
2)将Word邀请函转化为Pdf格式
此步骤相对简单,利用Python自动化办公库,仅需一行代码即可完成转换,且执行速度较快。
from docx2pdf import convert
convert(f"./邀请函/{name}.docx") 使用convert()函数可以将docx格式的文件直接转换为同名的PDF文档。
3)读取Excel表格中的姓名和邮箱
此处使用openpyxl库读取Excel数据。虽然处理Excel的库众多,但openpyxl是常用且高效的选择,具体代码如下:
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) 上述代码逻辑清晰:首先从Excel中读取姓名和邮箱数据,随后调用get_invitation()函数生成邀请函,最后将数据传递给send_email()函数以执行自动发送邮件操作。在实际运行中,这两个步骤可以分开执行:先运行get_invitation()生成所有邀请函,注释掉邮件发送部分验证无误后,再取消注释并运行邮件发送函数。
4)自动发送邮件
关于自动发送邮件的功能,此前已有相关文章介绍。起初看似复杂,实则逻辑并不繁琐,具体代码如下:
smtp = smtplib.SMTP(host="smtp.qq.com", port=587)
# smtp.login(邮箱, 授权码)
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进阶者学习交流群,请在附件中查收您的门票~</b><br>
点击这里了解更多:<a href="https://www.pdcfighting.com" 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)
# 发送前面准备好的邮件
smtp.send_message(msg)
# 如果放到外边登录,这里就不用退出服务器连接,所以注释掉了
# smtp.quit()
需注意三个关键点:第一,邮箱登录操作放在函数外部,以避免因函数多次调用导致短时间内频繁请求登录而被邮箱服务商封禁;第二,登录时使用授权码而非邮箱密码,示例中采用QQ邮箱,其他邮箱服务商需调整相应的SMTP服务配置;第三,该代码不仅包含HTML格式的正文,还附加了PDF格式的邀请函,逻辑相对复杂。
5)完整代码
上述四个步骤已拆分演示,依次完成了Word文档替换、Excel表格读取、PDF文件生成以及Email自动邮件发送任务。以下为整合后的完整代码。
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
# 生成对应的邀请函,并转存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}
<b>欢迎加入Python进阶者学习交流群,请在附件中查收您的门票~</b>
点击这里了解更多:<a href="https://www.pdcfighting.com" 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)
# 发送前面准备好的邮件
smtp.send_message(msg)
# 如果放到外边登录,这里就不用退出服务器连接,所以注释掉了
# 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进阶者') 总结
本文基于Python自动化办公场景,介绍了如何利用相关库依次完成Word文档替换、Excel表格读取、PDF文件生成及Email自动邮件发送任务。程序运行后,邀请函自动生成并发送邮件,处理速度显著提升,应对几百或上千个客户的邀请函发送不再困难。若客户数量达到上万个,建议借助第三方邮件平台辅助,因为普通邮箱每日发送数量有限制。

到此这篇关于Python自动化办公之群发邮件案例详解的文章就介绍到这了,更多相关Python群发邮件内容请搜索本站以前的文章或继续浏览下面的相关文章希望大家以后多多支持本站!
本站声明
本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。













