Python 邮件发送脚本:自动附带 Excel 子表
该 Python 脚本实现的功能是自动发送邮件,并根据 Excel 表格中项目的负责人姓名,自动附带相应的 Excel 子表文件。
import os
import pandas as pd
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText
from email.mime.application import MIMEApplication
import smtplib
subtables_path = r'C:\Users\LOH2HZ\Desktop\2023.6 email sending\SubTables' # 定义子表文件夹的路径
# 假设 df 已经定义为包含项目信息和对应负责人信息的 Pandas DataFrame
for i, row in df.iterrows(): # 遍历 Excel 文件的每一行并附加相应的子表
pm_name = row['Project manager']
pm_email = row['Email address']
if pd.isna(pm_name) or pd.isna(pm_email):
print(f'Missing information for row {i}')
continue
msg = MIMEMultipart() # 清空上一个邮件的附件
msg['Subject'] = 'Open ProNovia E-mail reminder'
msg['From'] = sender # 请替换为您的发件人邮箱地址
msg['To'] = pm_email
content='''
Dear PJMs & VS managers,<br>
<br>
This is a warm E-mail reminder about open ProNovia process of new components in your project.<br>
<br> <strong>·</strong> You can check your ProNovia status and push relevant associates to fast release components.<br>
(LINK:<a href='file://bosch.com/DfsRB/DfsCN/LOC/Hz/PTCN/Engineering/PT-BE-ETS-HZ_Act/EIS_Report/Pronovia/Reference/How%20to%20check%20components%20are%20stuck%20in%20which%20department.docx'>How to check components are stuck in which department</a>)<br>
<br> <strong>·</strong> You can issue a CR to discontinue components if they are not needed any more or project cancelled.<br>
<br>
Let's make our effort together to shorten the components release duration!<br>
<br>Thanks.<br>
<br>PT-BE/ETS1-Hz Team<br>
'''
puretext = MIMEText(content,'html','utf-8') # plain html
msg.attach(puretext)
excel_path = os.path.join(subtables_path, f'{pm_name}.xlsx')
if os.path.exists(excel_path):
xlsxpart = MIMEApplication(open(excel_path, 'rb').read())
xlsxpart.add_header('Content-Disposition', 'attachment', filename=f'{pm_name}.xlsx')
msg.attach(xlsxpart)
# 请替换为您的 SMTP 服务器地址、端口、用户名和密码
smtpObj = smtplib.SMTP('smtp.example.com', 587)
smtpObj.starttls()
smtpObj.login('your_username', 'your_password')
smtpObj.sendmail(sender, pm_email, msg.as_string()) # 发送邮件给该Project manager
smtpObj.quit() # 发送完所有的邮件后关闭连接
else:
print(f'Subtable for {pm_name} not found')
代码解释:
- 导入模块:
import os: 用于处理文件路径和环境变量import pandas as pd: 用于读取和操作 Excel 文件from email.mime.multipart import MIMEMultipart: 用于创建邮件消息from email.mime.text import MIMEText: 用于创建邮件正文from email.mime.application import MIMEApplication: 用于创建邮件附件import smtplib: 用于发送邮件
- 定义子表文件夹路径:
subtables_path = r'C:\Users\LOH2HZ\Desktop\2023.6 email sending\SubTables': 定义子表文件所在的文件夹路径,注意使用r前缀表示原始字符串,避免反斜杠转义问题
- 遍历 Excel 文件:
for i, row in df.iterrows():: 遍历 DataFramedf中的每一行,i表示行号,row表示该行数据
- 获取项目经理姓名和邮箱地址:
pm_name = row['Project manager']: 获取'Project manager'列的值pm_email = row['Email address']: 获取'Email address'列的值
- 检查信息是否完整:
if pd.isna(pm_name) or pd.isna(pm_email):: 判断项目经理姓名或邮箱地址是否为空值,如果是则跳过该行数据
- 创建邮件消息:
msg = MIMEMultipart(): 创建一个 MIME 多部分类型的邮件消息msg['Subject'] = 'Open ProNovia E-mail reminder': 设置邮件主题msg['From'] = sender: 设置发件人地址,请替换为您的发件人邮箱地址msg['To'] = pm_email: 设置收件人地址
- 定义邮件正文内容:
content='''...''': 定义邮件正文内容,包含 HTML 格式的文字和链接
- 将邮件正文添加到邮件消息:
puretext = MIMEText(content,'html','utf-8'): 创建一个 MIME 文本类型的邮件消息,并将邮件正文内容作为参数传入msg.attach(puretext): 将 MIME 文本类型的消息添加到 MIME 多部分类型的消息中
- 创建邮件附件:
excel_path = os.path.join(subtables_path, f'{pm_name}.xlsx'): 拼接子表文件的完整路径if os.path.exists(excel_path):: 判断该路径是否存在子表文件xlsxpart = MIMEApplication(open(excel_path, 'rb').read()): 创建一个 MIME 应用类型的邮件消息,并将子表文件的二进制内容作为参数传入xlsxpart.add_header('Content-Disposition', 'attachment', filename=f'{pm_name}.xlsx'): 设置 MIME 应用类型消息的头部信息,包括附件的名称和类型msg.attach(xlsxpart): 将 MIME 应用类型的消息添加到 MIME 多部分类型的消息中,作为邮件附件
- 发送邮件:
smtpObj = smtplib.SMTP('smtp.example.com', 587): 创建一个 SMTP 对象,连接到 SMTP 服务器,请替换为您的 SMTP 服务器地址和端口smtpObj.starttls(): 启动 TLS 加密连接smtpObj.login('your_username', 'your_password'): 使用用户名和密码登录 SMTP 服务器,请替换为您的用户名和密码smtpObj.sendmail(sender, pm_email, msg.as_string()): 发送邮件给指定的收件人smtpObj.quit(): 关闭 SMTP 连接
- 处理子表文件不存在的情况:
else:: 如果子表文件不存在,则输出提示信息
使用方法:
- 确保已经安装必要的 Python 库:
pandas,smtplib。 - 替换代码中
sender、smtp.example.com、587、your_username、your_password为您的实际信息。 - 将您的 Excel 文件保存到
subtables_path所指定的文件夹中,确保每个子表文件的文件名与项目经理姓名相同,例如张三.xlsx。 - 将您的 Excel 文件读入
dfDataFrame 中,并确保 DataFrame 包含'Project manager'和'Email address'列。 - 运行代码,程序将自动发送邮件并将相应的子表文件作为附件发送给指定的项目经理。
注意:
- 为了确保安全,请不要在代码中直接硬编码您的邮箱地址、密码和 SMTP 服务器信息,可以将这些信息保存在独立的配置文件中,并在代码中读取配置信息。
- 为了避免邮件被标记为垃圾邮件,请确保您的邮件内容符合相关规范,并使用一个合法的发件人地址。
- 您可以根据需要修改邮件正文内容和附件类型。
- 此脚本仅供参考,实际使用时可能需要根据具体情况进行调整。
原文地址: https://www.cveoy.top/t/topic/oYJJ 著作权归作者所有。请勿转载和采集!