微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决[Python]为什么电子邮件 pdf 附件没有显示在 Outlook/Thunderbird 上,而它们在 Gmail 上显示? 从 Python 环境发送

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

这是我第二次处理电子邮件,第一次主要是复制一些代码以查看它是否有效,因此如果您愿意向我解释并帮助我修复它,我将不胜感激. 我将在此处发布代码,然后添加一些关于我在下面尝试的内容的附加信息,以使其更清晰。 所以,这是代码

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 方法,我不能不改变那部分。 (以上是在 this post 上提出的 - 这与我的问题完全相同,但不幸的是我无法使用相同的修复程序)

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

如果您能为资源提供任何建议以了解有关发送和接收电子邮件的更多信息(从 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)

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。