繁体   English   中英

如何使用 Python 循环发送多封带有附件的电子邮件

[英]How to send multiple emails in a loop with attachments using Python

你好,谁能帮我写一个代码来帮助我一次发送多封带有附件的电子邮件?

现在我正在解释我到底想要实现什么。

这是我在 excel 表中可用的表

在此处输入图像描述

步骤 01 - 我有多个 excel 报告保存在与上表中提到的Emp 编号同名的文件夹中。

步骤 02 - 所以我想要代码,例如它将通过将报告名称与表中提到的 Emp 编号匹配来从文件夹中选择报告,并将邮件发送到 Email id,该 ID 可用于这些 Emp 编号

注意:报告名称和员工编号均相同。

这是可能的,因为现在我手动发送超过 3210 封电子邮件,这让我筋疲力尽。

假设将Outlook用于 Windows 作为发送电子邮件的应用程序,并且您有一些要发送的名为dataset的表和一个名为emails的电子邮件列表:

初始化 Outlook 应用程序,确保在启动脚本之前已经打开它:

import win32com.client as win32
olApp = win32.Dispatch("Outlook.Application")
olNS = olApp.GetNameSpace("MAPI")
email_sender = "your.email@xxx.xxx"

创建 email object(空):

mail_item = olApp.CreateItem(0)

假设您想将共享 email 发送给副本中的每个人,您可以执行以下操作:

mail_item.To = "; ".join(emails)

否则,如果您想单独使用 email,只需循环到 email 或使用更合适/更快的multithreading而不是multiprocessing来处理此类任务。

mail_item.Subject = "An unusual email."
mail_item.BodyFormat = 1
mail_item._oleobj_.Invoke(*(64209, 0, 8, 0, olNS.Accounts.Item(email_sender)))

然后,将你的 body 初始化为一个字符串:

body = ""

考虑一个 static header ,它将描述 email 和表格的内容并将其添加到正文中:

body += """<td style="line-height:15px;font-family:Arial;mso-line-height-rule:exactly;padding-bottom:5px">{}</td></br>""".format("A Random Header.")

再次,将带有.to_html()的 pandas 表添加到正文中,以将其正确解析为 html:

body += """<br><pre>{}</br></pre>""".format(dataset.to_html())

将正文交给mail_item

mail_item.HTMLBody = "<html><body>{}</html></body>".format(body)

发送 email:

mail_item.Send()

考虑到您有一个@gmail 地址,您可以运行下面的代码将具有不同 ExcelFiles 附件(存储在一个文件夹中)的多封电子邮件发送给不同的收件人(包括非 Gmail 地址)。

import pandas as pd
import smtplib
from email.message import EmailMessage

df = pd.read_excel(r'path\\to\\your\\emails_Excelfile.xlsx')

for index, row in df.iterrows():
    emp_number = row['EMP Number']
    email_id = row['Email ID']
    msg = EmailMessage()
    msg['Subject'] = 'Report number ' + str(emp_number)
    msg['From'] = 'put_your_@gmail_here'
    msg['To'] = email_id
    msg.set_content("Put your message here")
    
    with open(fr"path\\to\\reportsFolder\{emp_number}.xlsx", 'rb') as f:
        file_data=f.read()
        file_name=f.name
        msg.add_attachment(file_data, maintype='application', subtype='xlsx', filename=file_name)
    
    try:
        with smtplib.SMTP_SSL('smtp.gmail.com', 465) as server:
            server.login('put_your_@gmail_here', 'put_your_AppPassword_here')
            server.send_message(msg)
    except:
        pass
>>> Result

在此处输入图像描述

很重要:

由于 Gmail 中的“访问不太安全的应用程序”已被 Google 停用,您必须生成一个 APP 密码,以便smtplib可以登录您的 gmail。 为此,您需要:

  1. 打开Google 帐户(登录后)
  2. "Signing in to Google"部分下,激活"2-Step Verification"
  3. 创建应用密码(获取十六个字符串字符)

在此处输入图像描述

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM