[Python]为什么电子邮件 pdf 附件在 Outlook/Thunderbird 上不显示,而在 Gmail 上显示? (从 Python 环境发送)

[Python]Why are email pdf attachments not showing up on Outlook/Thunderbird, while they do on Gmail? (Sent from a Python environment)

我刚刚加入了一个项目,一直在试图弄清楚为什么有些电子邮件在 Gmail 上显示正常,但是当我用 Thunderbird 或 Outlook 等客户端打开时,附件的 PDF 现在确实显示了。 作为一个额外的细节,如果我将邮件从 Thunderbird/Tutlook 转发到 Gmail 帐户,附加的 pdf 将会出现,如果我将它发送回 Thunderbird/Outlook - 连接的帐户它会再次出现,所以 Gmail 修复了一些东西代码有误。

这是我第二次处理邮件,第一次主要是复制一些代码看看能不能用,所以如果你愿意在帮助我修复它的同时向我解释一下,我将不胜感激它大大。 我将 post 此处的代码,然后添加一些关于我在下面尝试的内容的附加信息,以使其更清晰一些。 所以,这是代码:

from email.message import EmailMessage
from email import encoders
from email.mime.base import MIMEBase
import smtplib



msg = EmailMessage()
msg['Subject'] = subject
msg['From'] = "someaddress"
msg['To'] = user_email
msg.set_content('Certification')
msg.add_alternative("""<!DOCTYPE html>
        <html>
            <body>
                Stuff...
            </body>
        </html>
        """, subtype='html')

filename = 'somefilename'
pdf_filename = 'certificate.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",
    "attachment", filename=pdf_filename
)
try:
    msg.attach(part)
    with smtplib.SMTP('someIP', port) as smtp:
        smtp.send_message(msg)

我以前见过一些类似的问题(或者实际上是同一个问题),一些解决方案建议使用 MIMEMultipart 混合消息对象而不是像这样的电子邮件对象: msg=MIMEMultipart('mixed') 而不是 msg = EmailMessage() 但因为 add_alternative 不是 MIMEMultipart 方法,所以我不能在不更改该部分的情况下这样做。 (以上是在 上提出的 - 这与我的问题完全相同,但不幸的是我无法使用相同的修复方法)

我尝试做的是调用一个 msg.make_mixed() 下面 msg=Email.Message() 希望混合类型(我还不了解电子邮件类型)可以解决问题,但是当我尝试以这种方式发送电子邮件时,我得到了 Status=4, Failed to send文件,错误。

如果您能提供任何资源建议以了解更多有关发送和接收电子邮件的信息(从 python 的角度),我将不胜感激。

谢谢!

这里的问题是您直接附加 一个预先构建的 MIME 部分到 multipart/alternative 消息。它以邮件阅读器可能无法正确处理的错误邮件结尾。

在email.message界面中,应该使用add_attachement方法。它将处理 base64 编码并将消息更改为 multipart/mixed 一个:

with open(filename, "rb") as attachment:
    msg.add_attachment(attachment.read(), maintype='application',
           subtype='octet-stream', filename=pdf_filename)

try:
    with smtplib.SMTP('someIP', port) as smtp:
        smtp.send_message(msg)