用于用Python发送带有文件附件的电子邮件的mimeultipart、MIMEText、MIMEBase和有效负载

2024-05-20 03:13:52 发布

您现在位置:Python中文网/ 问答频道 /正文

由于之前对MIME不太了解,我试图学习如何编写Python脚本来发送带有文件附件的电子邮件。在交叉引用了Python文档、堆栈溢出问题和一般的web搜索之后,我用下面的代码解决了这个问题,并测试了它是否正常工作。

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. 如何知道何时使用mimeultipart、MIMEText和MIMEBase?这似乎是一个复杂的问题,所以也许给我一些一般的经验法则?

  3. 我读到MIME有一个树状结构,这是否意味着mimultipart总是在顶部?
  4. 在第一个代码块中,MIMEMultipart编码['From']、['To']和['Subject'],但在Python文档中,MIMEText还可以用于编码['From']、['To']和['Subject']。我如何决定使用一个?
  5. 什么是“有效载荷”?是不是有些东西要运输?如果是,这包括什么样的内容(我注意到正文和附件被视为有效载荷)?我原以为这是个简单的问题,但我就是找不到一个令人满意、可靠和简单的答案。
  6. 是真的吗,尽管MIME可以附加比一些文本简单得多的文件格式,但在最后,所有编码、头信息和有效负载都被转换成字符串,以便可以传递到.sendmail()?

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


Tags: tofromimportserveremailmsgmimepart
1条回答
网友
1楼 · 发布于 2024-05-20 03:13:52

电子邮件

电子邮件由标题(例如“From”、“To”、“Subject”等)和正文(请参见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内容类型,这意味着它由多个消息组成,每个消息定义自己的内容类型(也可以是多部分或其他类型)。多部分消息在Python中由^{}类表示。

所以,要回答问题3:当使用MIMEMultipart时,那么是的,它是一个树状结构,但是如果只使用^{},那么它不是树。

问题4询问在哪个类上设置头(“to”、“From”等)-这是由^{}类完成的,但所有MIME类都继承自Message,因此可以在其中任何类上完成,但这些头只在多部分消息的根部分上有意义。

换言之,如果一条消息只包含一个MIME部分,则在该部分上指定标题。如果它由多个部分组成,那么根是一个MIMEMultipart-指定该部分的头。

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

问题5“有效载荷”到底是什么-这只是一个用于消息内容(或消息部分)的花哨的词

问题6在SMTP中仅使用7位是有限制的。有关详细信息,请参见this answer

我没有完全理解问题1,但似乎图表或多或少是正确的。顺便说一句,我不会在这里使用MIMEBase,因为这里有^{}似乎更适合预期的用途。

相关问题 更多 >