Python自动化办公之群发邮件案例详解

作者:小马不会过河 时间:2023-09-08 17:10:36 

背景

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

Python自动化办公之群发邮件案例详解

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

Python自动化办公之群发邮件案例详解

不过别慌,Python自动化办公,一套组合拳,使用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文档的结构,一个文档有多个段落,用doc.paragraphs获取;段落中的文字用para.text获取;一个段落中可能有多个不同样式的文本,这些不同的样式被称为run,一个段落中包含多个run,用para.runs获取,一个run中的具体文本用run.text获取。了解了这些,再看上述代码,是不是清晰很多呢?

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

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

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

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

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

这里需要用到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()函数,先生成邀请函,之后再将该函数注释掉,再执行发送邮件函数,

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进阶者')

来源:https://blog.csdn.net/m0_59163425/article/details/123002581

标签:Python,群发,邮件
0
投稿

猜你喜欢

  • MySQL如何设置某个字段的值自增

    2024-01-27 09:49:09
  • mysql 5.7.17 winx64安装配置图文教程

    2024-01-28 04:57:13
  • 根据表中数据生成insert语句的存储过程

    2008-11-10 12:13:00
  • python标准库OS模块详解

    2022-08-21 21:47:06
  • 解决Python中定时任务线程无法自动退出的问题

    2022-09-05 22:52:52
  • python一键去抖音视频水印工具

    2023-09-26 22:58:21
  • 简单的PHP缓存设计实现代码

    2023-10-25 19:58:08
  • 用JS访问操作iframe框架里的dom

    2008-11-10 13:05:00
  • python基于gevent实现并发下载器代码实例

    2024-01-01 00:31:53
  • Python模块学习 filecmp 文件比较

    2023-07-09 18:30:44
  • Python面向对象封装操作案例详解 II

    2021-03-22 05:39:29
  • 常用SQL语句词典

    2008-08-03 17:19:00
  • Pycharm之如何安装cv2 [python3.6]

    2023-01-15 09:56:45
  • Python判断文件或文件夹是否存在的三种方法

    2021-04-25 21:53:06
  • 浅谈JupyterNotebook导出pdf解决中文的问题

    2022-11-26 11:02:26
  • asp.net aspnetpager分页统计时与实际不符的解决办法

    2023-06-30 04:02:32
  • C++调用python(执行py文件)的全过程

    2022-04-24 00:30:53
  • 分享个asp文件缓存代码,使程序从缓存读数据

    2011-03-09 19:47:00
  • python获取外网IP并发邮件的实现方法

    2023-01-07 13:55:33
  • 聊聊MySQL中的存储引擎

    2024-01-20 08:58:11
  • asp之家 网络编程 m.aspxhome.com