【发布时间】:2016-12-14 00:51:57
【问题描述】:
在没有太多 MIME 知识的情况下,我尝试学习如何编写 Python 脚本来发送带有文件附件的电子邮件。在交叉引用 Python 文档、Stack Overflow 问题和一般网络搜索之后,我使用以下代码 [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()
-
我现在大致了解了这个脚本的工作原理,并制定了以下工作流程。请让我知道我的流程图(?)有多准确。
as.string() | +------------MIMEMultipart | |---content-type | +---header---+---content disposition +----.attach()-----+----MIMEBase----| | +---payload (to be encoded in Base64) +----MIMEText 我如何知道何时使用 MIMEMultipart、MIMEText 和 MIMEBase?这似乎是一个复杂的问题,所以也许只是向我提供一些一般的经验法则?
- 我读到 MIME 具有树状结构[2],这是否意味着 MIMEMultipart 始终位于顶部?
- 在第一个代码块中,MIMEMultipart 编码 ['From']、['To'] 和 ['Subject'],但在 Python 文档中,MIMEText 也可用于编码 ['From']、[ 'To'] 和 ['Subject']。我该如何决定使用一个?
- 究竟什么是“有效载荷”?是要传输的内容吗?如果是这样,这包括什么样的内容(我注意到正文和附件被视为有效负载)?我认为这将是一个简单的问题,但我找不到令人满意、可靠和简单的答案。
- 是真的,虽然 MIME 可以附加文件格式比只是一些文本简单得多,但最后所有的编码、标题信息和有效负载都变成了字符串,以便可以将它们传递给 .sendmail()?
[1]http://naelshiab.com/tutorial-send-email-python/
[2]http://blog.magiksys.net/generate-and-send-mail-with-python-tutorial
【问题讨论】:
标签: python email smtp mime smtplib