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

[Python]为什么Outlook/Thunderbird上没有显示电子邮件pdf附件,而Gmail上却显示?(从Python环境发送),python,email,pdf,outlook,thunderbird,Python,Email,Pdf,Outlook,Thunderbird,我刚刚加入了一个项目,一直在试图弄清楚为什么一些电子邮件会在Gmail上显示出来,但当我打开像Thunderbird或Outlook这样的客户端时,附带的PDF现在确实会显示出来。 如果我将Thunderbird/Tutlook的邮件转发到Gmail帐户,附加的pdf将出现,如果我将其发送回Thunderbird/Outlook连接的帐户,它将再次出现,因此Gmail修复了代码中的一些错误 这是我第二次处理电子邮件,第一次主要是复制一些代码,看看它是否有效,因此,如果你愿意向我解释它,除了帮助我

我刚刚加入了一个项目,一直在试图弄清楚为什么一些电子邮件会在Gmail上显示出来,但当我打开像Thunderbird或Outlook这样的客户端时,附带的PDF现在确实会显示出来。 如果我将Thunderbird/Tutlook的邮件转发到Gmail帐户,附加的pdf将出现,如果我将其发送回Thunderbird/Outlook连接的帐户,它将再次出现,因此Gmail修复了代码中的一些错误

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

从email.message导入EmailMessage
从电子邮件导入编码器
从email.mime.base导入MIMEBase
导入smtplib
msg=EmailMessage()
msg['Subject']=主语
msg['From']=“someaddress”
msg['To']=用户电子邮件
msg.set_内容(“认证”)
msg.add_可选(“”)
东西
“”,子类型='html')
filename='somefilename'
pdf\u文件名='certificate.pdf'
以open(文件名“rb”)作为附件:
部分=MIMEBase(“应用程序”、“八位字节流”)
part.set_有效载荷(附件.read())
编码器。编码_base64(部分)
part.add_标题(
“内容处置”,
“附件”,文件名=pdf\U文件名
)
尝试:
附加信息(部分)
使用smtplib.SMTP('someIP',端口)作为SMTP:
smtp.send_消息(msg)
我以前见过一些类似的问题(或者实际上是相同的问题),一些解决方案建议使用MiMemMultipart混合消息对象,而不是像这样的电子邮件对象:
msg=MIMEMultipart('mixed')
而不是
msg=EmailMessage()
,但由于add\u alternative不是一个MIMEMultipart方法,我不能在不更改该部分的情况下执行该操作。 (上面是在上建议的-这与我的问题完全相同,但不幸的是我无法使用相同的修复)

我试着打电话给一个
msg.make_mixed()
下面的
msg=Email.Message()
希望混合类型(我还不了解电子邮件类型)能够解决问题,但当我尝试以这种方式发送电子邮件时,我得到的状态为4,无法发送文件,错误

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


谢谢大家!

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

在email.message界面中,您应该使用
add\u 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)

一些邮件客户端更喜欢附件使用更具体的mime类型,请设置“谢谢您提供的信息”!非常感谢您的回答和解释!