Word の招待状テンプレートがあり、顧客の名前、連絡先情報、電子メール アドレスなどの基本情報を含む顧客リストがあり、上司が招待状の名前を置き換える必要があると想像してください。招待状テンプレートを作成し、Word の招待状テンプレートを PDF 形式で生成し、統一された招待状 (メール本文) を編集して、招待状の添付ファイルを顧客のメールボックスに順番に送信します。 通常の状況では、Excel テーブルの顧客名をコピーして貼り付け、Word 文書で 1 つずつ置き換え、Word を PDF 形式に変換して、Excel テーブルの電子メール アドレスをコピーして送信する必要があります。編集したメールをそのまま添付します 招待状を添付して送信をクリックします 計算してみましょう 処理が早くて熱意があれば1分以上かかります。顧客が数十人であれば問題なく、1 時間で完了しますが、顧客が数百、数千、さらには数万の場合はどうなるでしょうか。おそらくオフィスで泣きながら気を失ってしまうでしょう。
しかし、パニックにならないでください。Python はオフィスを自動化し、コンボのセットです。Python を使用してオフィスを自動化します - Word 文書の置換、Excel の表の読み取り、PDF ファイルの生成、電子メールの自動化mail ワンストップサービスの手配を送信します。以下を見てみましょう!
ここでは、上記の Word テンプレートを例として、テンプレート内の <name>
を顧客の名前に置き換える関数を 1 ステップで記述します。
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'./邀请函/{name}.docx')
上記のコードは Word 文書の構造を理解する必要があります。文書には複数の段落があり、それらは doc.paragraphs によって取得されます。段落内のテキストは para.text によって取得されます。複数の段落が存在する場合があります。段落内のさまざまなスタイル テキスト、これらのさまざまなスタイルはランと呼ばれます。段落には複数のランが含まれており、para.runs を使用して取得できます。ラン内の特定のテキストは run.text を使用して取得できます。これを理解した後、上記のコードを見てください。より明確になったでしょうか?
これは非常に簡単ですが、Python の自動オフィスでは 1 行で実現できます。のコードであり、速度は非常に高速です。
from docx2pdf import convert convert(f"./邀请函/{name}.docx")
convert() 関数を使用して、docx 形式のファイルを同じ名前の Pdf ドキュメントに変換します。
ここでは、openpyxl ライブラリを使用する必要があります。もちろん、まだあります。 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)
上面的代码,理解起来应该并不难,读取Excel中的姓名和邮箱,之后传到get_invitation()生成邀请函,之后传给send_email()函数中自动发送邮件。实际上,这两部是分开进行的,这里是先执行get_invitation()函数,先生成邀请函,之后再将该函数注释掉,再执行发送邮件函数,
关于自动发送邮件,历史文章中也曾经发布过好几篇了,这里继续用上了,一开始我也觉得挺难的,后来发现也没有想的那么复杂,代码如下:
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">演唱会主页</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格式的邀请函附件,稍显复杂。关于授权码的获取,这里不再赘述了,之前历史文章页写过,网上的教程页很多,不会的话,私我就行。或者参考下面这个文章:手把手教你使用Python网络爬虫实现邮件定时发送(附源码)。
以上四个步骤进行拆分了,依次完成了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: run.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"""您好:{name}
""" 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进阶者学习交流群,请在附件中查收您的门票~
点击这里了解更多:演唱会主页
这篇文章基于Python自动化办公,主要介绍了使用Python相关库,依次完成Word文档替换、Excel表格读取、Pdf文件生成和Email自动邮件发送任务。程序运行之后,邀请函会自动生成,然后邮件会自动发送,速度也非常快,给几百个、上千个客户发送邀请函就不害怕了,如果有上万个客户,可能需要借助第三方平台辅助了,毕竟一般的普通邮箱,每日发送邮箱数是有限制的。
人生苦短,我用Python!感谢【麦叔】提供的素材和代码,亲测有效,这里的介绍只是冰山一角,更多内容可以前往《Python办公效率手册》中获取。
需要源数据的小伙伴可以添加我为好友,私我进行获取,或者前往我的github获取:
https://github.com/cassieeric/Python-office-automation
以上がPy 自動化オフィス - Word 文書の置換、Excel の表の読み取り、PDF ファイルの生成、および電子メールの自動送信の実践例の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。