smtp 发送电子邮件,为啥一个附件可以有两个 Content-Type?

Posted

技术标签:

【中文标题】smtp 发送电子邮件,为啥一个附件可以有两个 Content-Type?【英文标题】:smtp send email and why one attachment can have two Content-Type?smtp 发送电子邮件,为什么一个附件可以有两个 Content-Type? 【发布时间】:2017-09-23 09:36:09 【问题描述】:

我正在尝试使用 smtp 发送带有附件的电子邮件。当我收到原始电子邮件时,一个附件有两种内容类型。 我怎样才能得到一种内容类型?这两种类型相互影响? 感谢您的帮助!

import smtplib
from email.mime.multipart import MIMEMultipart
from email.mime.application import MIMEApplication

server = smtplib.SMTP()
server.connect("smtp.XX.com")

server.login("","")

msg = MIMEMultipart("")
msg['From'] = ""
msg['Subject'] = "titlesub"
part = MIMEApplication(open("D:\data.txt", 'rb').read())
filename="data.txt"
#part['Content-Type']="application/pdf"
part.add_header('Content-Type','application/pdf')
part.add_header('Content-Disposition', 'attachment', filename=filename)

msg.attach(part)
msg['To'] = ""
server.send_message(msg)
server.quit()

原始电子邮件:

Received: from [127.0.0.1] (unknown [101.81.225.242])
by smtp8 (Coremail) with SMTP id DMCowABH3zUeOgBZsU+uAg--.2242S2;
Wed, 26 Apr 2017 14:11:42 +0800 (CST)
Content-Type: multipart/; boundary="===============4516509904929376112=="
MIME-Version: 1.0
From: 
Subject: titlesub
To: 
X-CM-TRANSID:DMCowABH3zUeOgBZsU+uAg--.2242S2
Message-Id:<59003A1E.C4DB82.14752@m12-12.163.com>
X-Coremail-Antispam: 1Uf129KBjDUn29KB7ZKAUJUUUUU529EdanIXcx71UUUUU7v73
VFW2AGmfu7bjvjm3AaLaJ3UbIYCTnIWIevJa73UjIFyTuYvjxUkebkUUUUU
X-Originating-IP: [101.81.225.242]
Date: Wed, 26 Apr 2017 14:11:42 +0800 (CST)
X-CM-SenderInfo: pix130tbbsiiqu6rljoofrz/1tbivh7F0FZcM5OV1wAAsd

--===============4516509904929376112==
Content-Type: application/octet-stream
MIME-Version: 1.0
Content-Transfer-Encoding: base64
Content-Type: application/pdf
Content-Disposition: attachment; filename="data.txt"

77u/

--===============4516509904929376112==--

【问题讨论】:

【参考方案1】:

如果您查看 documentation for the MIMEApplication class,您应该在构造函数中传递 mime 类型,而不是将其作为单独的标头添加。

part = MIMEApplication(open("file.pdf", 'rb').read(), 'pdf')
filename="file.pdf"
part.add_header('Content-Disposition', 'attachment', filename=filename)

【讨论】:

如果我使用 part['Content-Type']='application/pdf' , 标题字典中的Content-Type(application/octet-stream) 不会改变? application/octet-stream 是当没有已知的 mime 类型时的默认值。在这种情况下,您知道要附加 pdf,因此您应该使用 pdf mime 类型。见:tools.ietf.org/rfc/rfc3778 我试试(part = MIMEApplication(open("D:\data.txt", 'rb').read(), 'application/pdf'))!并将附件内容类型更改为应用程序/应用程序! 试试 'pdf' 而不是 'application/pdf'

以上是关于smtp 发送电子邮件,为啥一个附件可以有两个 Content-Type?的主要内容,如果未能解决你的问题,请参考以下文章

自动化发送邮件之SMTP

使用 smtp 发送带有多个附件的电子邮件

python3 发送邮件携带附件(可携带多个不同格式的附件)

PHP通过SMTP实现发送邮件_包括附件

邮件模块

smtplib与email模块(实现邮件的发送)