繁体   English   中英

[Python]为什么 email 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 - 连接的帐户,它将再次出现,因此 Z7D53CBD3F0C0E402AF31C3BAFEAB 修复了代码中的错误.

这是我第二次处理电子邮件,第一次主要是复制一些代码以查看它是否有效,因此,如果您愿意在帮助我修复它的同时向我解释它,我将不胜感激。 我将在此处发布代码,然后添加一些关于我在下面尝试过的附加信息,以保持更简洁。 所以,这里是代码:

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-mixed 消息 object 而不是 email 一个像这样的: msg=MIMEMultipart('mixed')而不是msg = EmailMessage()但是因为 add_alternative 不是 MIMEMultipart 方法,所以如果不更改该部分,我就无法做到这一点。 (在这篇文章中提出了上述建议 - 这与我的问题完全相同,但不幸的是我无法使用相同的修复程序)

我尝试做的是在msg=Email.Message() msg.make_mixed()下面调用 msg.make_mixed() 希望混合类型(我还不了解 email 类型)可以解决问题,但是当我尝试以这种方式发送 email 时,我得到状态=4,发送文件失败,错误。

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

谢谢!

这里的问题是您已将预构建的 MIME 部分直接附加到多部分/替代消息。 它以不正确的消息结尾,邮件阅读器可能处理不当。

在 email.message 接口中,应该使用add_attachement方法。 它将处理 base64 编码并将消息更改为多部分/混合消息:

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)

暂无
暂无

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

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