如何使用 Python 将 pdf 文件发送到多个电子邮件?

Posted

技术标签:

【中文标题】如何使用 Python 将 pdf 文件发送到多个电子邮件?【英文标题】:How to send a pdf file to multiple emails using Python? 【发布时间】:2021-06-24 06:05:43 【问题描述】:

我对这个程序的目标是向多个电子邮件地址发送消息以及附加到电子邮件的 PDF 文件。我该怎么做?我有两个 Traceback 调用(显示在代码之后)。到目前为止,当没有发送附件时代码可以工作,但是当我尝试发送附件时,一切似乎都崩溃了。谢谢

编辑:我相信我必须在某处使用这两行代码。 message.attach(部分) text = message.as_string()

虽然当我把它们写下来时,它说类“str”的未解析属性引用“附加”

from email.mime.base import MIMEBase
import pandas as pd
import smtplib, ssl

subject = "An email with attachment from Python"
sender_email = input("Enter your E-mail Address: ")
password = input("Enter your password: ")

email_list = pd.read_excel("D:\Learning Python\Mini_Projects\emailaddresses.xlsx", engine="openpyxl")
# Read Excel Spreadsheet
names = email_list['Name']
receiver_email = email_list['Email']

message = """Subject: Training Program! ???? 
Hi names, I hope you received this e-mail with the attachment"""
filename = "TrainingProgram.pdf"

with open(filename, "rb") as attachment:
    part = MIMEBase("application", "octet-stream")
    part.set_payload(attachment.read())

encoders.encode_base64(part)

part.add_header(
    "Content-Disposition",
    f"attachment; filename= filename",
)
context = ssl.create_default_context()
with  smtplib.SMTP("smtp.gmail.com", 587) as server:
    server.starttls(context=context)
    server.login(sender_email, password)
    for i in range(len(receiver_email)):
        name = names[i]
        email = receiver_email[i]
        server.sendmail(sender_email, receiver_email, message)
    print("E-mails Sent!")



File "D:/Learning Python/Mini_Projects/main.py", line 117, in <module>
    server.sendmail(sender_email, [email], message)
  File "C:\Users\janss\AppData\Local\Programs\Python\Python38\lib\smtplib.py", line 859, in sendmail
    msg = _fix_eols(msg).encode('ascii')
UnicodeEncodeError: 'ascii' codec can't encode character '\U0001f4aa' in position 27: ordinal not in range(128)

【问题讨论】:

【参考方案1】:

ASCII 编码不支持表情符号。删除电子邮件正文中的?,它应该可以工作。如果您绝对想保留表情符号,则必须使用 MIMEText 对象,例如,请参阅 this question。

编辑: 为什么不在 for 循环中使用 nameemail 变量? 当前代码向作为列表的地址发送电子邮件,我想知道为什么它没有在那里出错......

    for i in range(len(receiver_email)):
        name = names[i]
        email = receiver_email[i]
        server.sendmail(sender_email, receiver_email, message)

也许你的意思是你的 for 循环如下?

    for email in receiver_email:
        server.sendmail(sender_email, email, message)

此外,您的消息将在您编码时发送,而不是填写名称。为此,您需要在字符串前面放置一个 f。我觉得message应该是这样的:

message = f"""Subject: Training Program!
Hi ", ".join(names), I hope you received this e-mail with the attachment"""

EDIT2:

Unresolved attribute reference 'attach' for class 'str'

这是因为str 没有附加方法,只有email.mime.multipart.MIMEMultipart 有。请参阅this answer 了解如何正确发送附件。

【讨论】:

谢谢,这似乎解决了错误。我现在唯一的问题是附件没有随电子邮件一起发送很长时间。所以我收到了一封只有主题、正文但没有 PDF 文件的空电子邮件 @Johnlewis “我收到一封只有主题、正文但没有 PDF 文件的空电子邮件” - 难怪 - 您正在将附件 PDF 加载到脚本中,但从未告诉 @987654334 @将其与您的电子邮件一起发送!请重新阅读我的帖子,我对其进行了编辑,因为我在您的代码中发现了另外两个问题,尽管与未发送的 PDF 无关。 感谢您的帮助,非常感谢!我会更深入地研究它,因为我仍然对如何去做这件事有点困惑。

以上是关于如何使用 Python 将 pdf 文件发送到多个电子邮件?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Python Ghostscript 的高级接口将一个 .pdf 文件转换为多个 .png 文件?

如何从python上的PDF文件中提取单词的多个实例?

一个用于合并pdf的简单Python脚本

如何以编程方式将 PDF 数据发送到打印机?

如何将pdf数据发送到微控制器

如何使用 alamofire 将多个 PDF 文件上传到服务器? #Swift 4 #IOS [重复]