使用 Python 发送邮件附件,每个 Project Manager 只收到自己的子表

本文介绍如何使用 Python 发送邮件附件,并确保每个 Project Manager 只收到 SubTables 文件夹中以他们名字命名的子表。

代码如下:

import os
from email.mime.application import MIMEApplication
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText
import pandas as pd
import smtplib

subtables_path = r'C:\Users\LOH2HZ\Desktop\2023.6 email sending\SubTables'  # 定义子表文件夹的路径

# 设置邮件服务器和发送者信息
server = 'smtp.example.com'  # 替换为你的邮件服务器地址
sender = 'sender@example.com'  # 替换为你的发送邮箱地址
password = 'your_password'  # 替换为你的邮箱密码

# 创建邮件对象
msg = MIMEMultipart()
msg['Subject'] = 'Project Subtables'
msg['From'] = sender

# 打开 Excel 文件
df = pd.read_excel('your_excel_file.xlsx')  # 替换为你的 Excel 文件路径

# 创建 SMTP 连接
smtpObj = smtplib.SMTP(server, 587)  # 替换为你的 SMTP 端口号
smtpObj.ehlo()
smtpObj.starttls()
smtpObj.login(sender, password)

# 遍历 Excel 文件的每一行
for i, row in df.iterrows():
    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

    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)
        smtpObj.sendmail(sender, pm_email, msg.as_string())  # 发送邮件给该 Project manager
    else:
        print(f'Subtable for {pm_name} not found')

    # 在每一次循环结束时清空附件列表,以便下一个 Project manager 只收到自己的子表
    msg.set_payload([])

smtpObj.quit()  # 发送完所有的邮件后关闭连接

代码解释:

  1. 导入库: 导入 os, email.mime.application, email.mime.multipart, email.mime.text, pandassmtplib 库,用于文件操作、邮件构建、数据处理和 SMTP 连接。
  2. 定义路径: 定义子表文件夹的路径 subtables_path
  3. 设置邮件信息: 设置邮件服务器地址 server、发送者邮箱地址 sender 和密码 password
  4. 创建邮件对象: 创建邮件对象 msg,设置邮件主题、发送者地址。
  5. 打开 Excel 文件: 打开 Excel 文件 df,并使用 pandas 进行数据处理。
  6. 创建 SMTP 连接: 创建 SMTP 连接,设置服务器地址和端口号,并登录邮件服务器。
  7. 遍历 Excel 文件: 遍历 Excel 文件的每一行,获取每个 Project Manager 的姓名 pm_name 和邮箱地址 pm_email
  8. 选择子表: 根据 pm_name 选择相应的子表路径 excel_path
  9. 附件添加: 如果子表存在,将子表作为附件添加到邮件对象中。
  10. 发送邮件: 使用 smtpObj.sendmail() 方法发送邮件。
  11. 清空附件列表: 在每次循环结束时,清空邮件对象中的附件列表 msg.set_payload([]),确保下一个 Project Manager 只收到自己的子表。
  12. 关闭连接: 发送完所有邮件后,关闭 SMTP 连接。

注意:

  • 请根据实际情况修改代码中的路径、邮件服务器地址、邮箱地址和密码。
  • 确保你的 Excel 文件中包含“Project manager”和“Email address”这两列。
  • 请确保你的邮件服务器已开启 SMTP 服务。

使用示例:

假设你的 Excel 文件名为 'project_managers.xlsx',其中包含以下内容:

| Project manager | Email address | |---|---| | John Doe | john.doe@example.com | | Jane Smith | jane.smith@example.com |

并假设你的 SubTables 文件夹中包含以下子表:

  • John Doe.xlsx
  • Jane Smith.xlsx

运行代码后,John Doe 将收到包含 'John Doe.xlsx' 附件的邮件,Jane Smith 将收到包含 'Jane Smith.xlsx' 附件的邮件。

希望本文能帮助你实现使用 Python 发送邮件附件,并确保每个 Project Manager 只收到自己的子表的功能。


原文地址: https://www.cveoy.top/t/topic/oWq4 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录