MIMEMultipart,MIMEText,MIMEBase和有效负载,用于在Python

时间:2016-08-08 09:45:19

标签: python email smtp mime smtplib

如果没有MIME的先验知识,我试图学习如何编写Python脚本来发送带有文件附件的电子邮件。在交叉引用Python文档,Stack Overflow问题和一般的Web搜索之后,我使用以下代码 [1] 进行了测试,并对其进行了测试。

import smtplib
from email.MIMEMultipart import MIMEMultipart
from email.MIMEText import MIMEText
from email.MIMEBase import MIMEBase
from email import encoders

fromaddr = "YOUR EMAIL"
toaddr = "EMAIL ADDRESS YOU SEND TO"

msg = MIMEMultipart()

msg['From'] = fromaddr
msg['To'] = toaddr
msg['Subject'] = "SUBJECT OF THE EMAIL"

body = "TEXT YOU WANT TO SEND"

msg.attach(MIMEText(body, 'plain'))

filename = "NAME OF THE FILE WITH ITS EXTENSION"
attachment = open("PATH OF THE FILE", "rb")

part = MIMEBase('application', 'octet-stream')
part.set_payload((attachment).read())
encoders.encode_base64(part)
part.add_header('Content-Disposition', "attachment; filename= %s" % filename)

msg.attach(part)

server = smtplib.SMTP('smtp.gmail.com', 587)
server.starttls()
server.login(fromaddr, "YOUR PASSWORD")
text = msg.as_string()
server.sendmail(fromaddr, toaddr, text)
server.quit()
  1. 我已经大致了解了这个脚本现在的工作原理,并制定了以下工作流程。请告诉我我的流程图(?)的准确程度。

     as.string()  
     |
     +------------MIMEMultipart  
                  |                                                |---content-type  
                  |                                   +---header---+---content disposition  
                  +----.attach()-----+----MIMEBase----|  
                                     |                +---payload (to be encoded in Base64)
                                     +----MIMEText
    
  2. 我如何知道何时使用MIMEMultipart,MIMEText和MIMEBase?这似乎是一个复杂的问题,所以也许只是给我一些一般的经验法则?

  3. 我读到MIME有一个树状结构 [2] ,这是否意味着MIMEMultipart始终位于顶部?
  4. 在第一个代码块中,MIMEMultipart对[' From'],[' To']和[' Subject']进行编码,但是在Python文档中,MIMEText也可用于编码[' From'],[' To']和[' Subject']。怎么做我决定使用一个?
  5. "有效载荷究竟是什么?#34;?是否有一些内容需要运输?如果是这样,这包括什么样的内容(我注意到正文和附件被视为有效载荷)?我认为这将是一个简单的问题,但我找不到令人满意,可靠和简单的答案。
  6. 虽然MIME可以附加比单纯文本更简单的文件格式,但最后所有的编码,标题信息和有效负载都被转换成字符串,以便它们可以传递到.sendmail()?< / LI>

    [1] http://naelshiab.com/tutorial-send-email-python/
    [2] http://blog.magiksys.net/generate-and-send-mail-with-python-tutorial

1 个答案:

答案 0 :(得分:4)

电子邮件

电子邮件由标题(例如,“发件人”,“收件人”,“主题”等)和正文(请参见RFC 822, section 3.1)组成。

默认情况下,邮件正文被视为纯ASCII文本。 MIME(RFC 2045RFC 2046RFC 2047RFC 2048RFC 2049)定义了扩展名,这些扩展名允许指定不同类型的电子邮件内容。

使用MIME可以做的一件非常有用的事情是指定内容类型(例如text/htmlapplication/octet-stream)。

另一个有用的事情是,您可以创建包含多个部分的消息(例如,如果要在HTML中同时包含HTML和图像)。通过指定multipart内容类型(RFC 2046, section 5.1)即可完成。

多段消息

如果消息具有multipart内容类型,则表示它由多条消息组成,并且每条消息都定义了自己的内容类型(可以是多部分内容,也可以是其他内容)。分段消息是使用MIMEMultipart类表示的Python。

因此,要回答问题3 :使用MIMEMultipart时,是的,它是树状结构,但是如果仅使用MIMEText,则它是不是树。

问题4 询问在哪个类上设置标头(“ To”,“ From”等)-这是Message类,但所有{{1} }类继承自MIME,因此可以在任何一个类上完成,但是这些标头仅在多部分消息的根部分有意义。

换句话说,如果邮件仅包含一个MIME部分,请在该部分上指定标头。如果它由多个部分组成,则根为Message-在该部分上指定标题。

问题2 询问“何时使用MIMEMultipart,MIMEText和MIMEBase” 。 -MIMEMultipart只是基类。正如specification所说:“通常,您不会专门创建MIMEBase的实例” -MIMEBase用于文本(例如MIMETexttext/plain),如果整个消息都是文本格式,或者部分消息是文本格式。 -text/html是说“我有多个零件” ,然后列出零件-如果您有附件,也可以这样做,以提供相同的替代版本内容(例如纯文本版本和HTML版本)

问题5 “什么是“有效载荷”?” -仅仅是消息(或消息部分)内容的一个奇特词

问题6 有一个限制,即在SMTP中仅使用7位。有关更多详细信息,请参见this answer

我没有完全理解问题1 ,但是该图表或多或少是正确的。顺便说一句,我这里不使用MIMEMultipart,因为这里有MIMEApplication似乎更适合于预期的目的。