使用python发送带有(docx)附件的邮件

Posted

技术标签:

【中文标题】使用python发送带有(docx)附件的邮件【英文标题】:Sending mail with (docx)attachment using python 【发布时间】:2021-12-03 14:13:18 【问题描述】:

我一直在尝试通过 python 发送带有 Docx 附件的邮件

我可以收到一封邮件,但没有附件,下面是我用来附加文件的代码 而且我在附加文件时没有收到任何错误

import smtplib, ssl
from email.mime.text import MIMEText
from email.mime.multipart import MIMEMultipart
from email.mime.base import MIMEBase
from email import encoders

sender_email = email
receiver_email = toemail
password = password

message = MIMEMultipart("alternative")
message["Subject"] = Subject
message["From"] = sender_email
message["To"] = receiver_email
message.attach(htmlmessage)

attach_file = open(attach_file_name, 'rb') # Open the file as binary mode
payload = MIMEBase('application', 'octet-stream')
payload.set_payload((attach_file).read())
encoders.encode_base64(payload)
#encode the attachment
#add payload header with filename
payload.add_header('Content-Disposition', "attachment; filename= %s" % attach_file)
message.attach(payload)

context = ssl.create_default_context()
with smtplib.SMTP_SSL("smtp.gmail.com", 465, context=context) as server:
    server.login(sender_email, password)
    server.sendmail(
        sender_email, receiver_email, message.as_string()
    )




【问题讨论】:

我们需要minimal reproducible example 才能重现... 这是最小的可重现示例 【参考方案1】:

要尊重 Mime 类型。 multipart/alternative 类型应该用于包含相同信息的纯文本和 HTML 消息。然后,邮件阅读器可以选择它可以使用的表示形式。

另一方面,当消息包含多个不同部分时,应该使用multipart/mixed,以不同方式传输附件

因此,如果htmlmessage 是有效的email.mime.text.MIMEText,您的代码不应声明"alternative"

...
message = MIMEMultipart()
...

此外,您应该避免直接使用MIMEBase,而是依赖MIMEApplication 的默认值:

payload = MIMEApplication(attach_file.read(),
                'vnd.openxmlformats-officedocument.wordprocessingml.document')
payload.add_header('Content-Disposition',
                   "attachment; filename= %s" % attach_file)
message.attach(payload)

但我必须承认,最后一点主要是品味问题......

【讨论】:

感谢第一部分,这确实解决了附件问题。但我附加的 docx 文件似乎显示为损坏的文件。我尝试使用您的 MIMEApplication 而不是 MIMEBase 但仍然附加的文件已损坏。即使我使用 MIMEBase,附件仍然是相同的损坏 有一些 docx python 帮助说 Docx 是来自 *** 的压缩二进制格式 @oneclick 我的错。我没有足够注意文件的类型,而是使用了MIMEApplication 的默认值,因为您的代码最初使用了 application/octet-stream mime 类型。根据 [this other SO post],docx 文件的类型应为application/vnd.openxmlformats-officedocument.wordprocessingml.document。我用正确的子类型编辑了我的帖子。

以上是关于使用python发送带有(docx)附件的邮件的主要内容,如果未能解决你的问题,请参考以下文章

Python - 发送带有多个图像附件的电子邮件

无法在python中使用MIME发送带有pdf附件的电子邮件

将 DOCX 编码为通过电子邮件发送

无法从 python 发送带有附件的电子邮件?

python 发送带有附件的邮件

在 Python 中发送带有 HTML+plain_text 电子邮件的 PDF 附件