转载请注明出处:https://blog.csdn.net/l1028386804/article/details/79972801
一、生成电子邮件
示例中有两个创建电子邮件消息的示例,即 make_mpa_msg()和 make_img_msg(),两者都创建了一条带有附件的电子邮件消息。前者创建并发送了一条多部分消息,后者创建并发送了一条电子邮件消息,其中含有一幅图片。示例代码后面是逐行解释。
具体代码如下:
#!/usr/bin/env python
'email-examples.py - demo creation of email messages'
from email.mime.image import MIMEImage
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText
from smtplib import SMTP
# multipart alternative: text and html
def make_mpa_msg():
email = MIMEMultipart('alternative')
text = MIMEText('Hello World!\r\n', 'plain')
email.attach(text)
html = MIMEText(
'<html><body><h4>Hello World!</h4>'
'</body></html>', 'html')
email.attach(html)
return email
# multipart; images
def make_img_msg(fn):
f = open(fn, 'r')
data = f.read()
f.close()
email = MIMEImage(data, name=fn)
email.add_header('Content-Disposition',
'attachment; filename="%s"' % fn)
return email
def sendMsg(fr, to, msg):
s = SMTP('localhost')
errs = s.sendmail(fr, to, msg)
s.quit()
if __name__ == '__main__':
print 'sending multipart alternative msg'
msg = make_mpa_msg()
msg['From'] = SENDER
msg['To'] = ', '.join(RECIPS)
msg['Subject'] = 'multipart alternative test'
sendMsg(SENDER, RECIPS, msg.as_string())
print 'sending image msg'
msg = make_img_msg(SOME_IMG_FILE)
msg['From'] = SENDER
msg['To'] = ', '.join(RECIPS)
msg['Subject'] = 'image file test'
sendMsg(SENDER, RECIPS, msg.as_string())
代码具体解释如下:
第 1~7 行
除了标准的起始行和 docstring,还导入了 MIMEImage、 MIMEMultipart、 MIMEText、SMTP 类。
第 9~18 行
多部分选择消息通常包含两部分,一是以纯文本表示的邮件消息正文,以及等价的 HTML格式。由邮件客户端来决定显示哪一部分。例如,基于 Web 的电子邮件系统会显示 HTML版本,而基于命令行的邮件阅读器只会显示纯文本版本。为了创建这种类型的消息,需要使用 email.mime.multiple.MIMEMultipart 类,并传递alternative 作为唯一的参数来实例化这个类。如果不传递这个参数,则前面的纯文本和 HTML会分别作为消息中的附件,这种情况下,有些邮件系统会同时显示这两部分的内容。这两部分都会用到 email.mime.text.MIMEText 类,因为这两部分内容都是纯文本。每个部分都要附加到邮件中,因为这两部分是在邮件创建之后才创建的。
第 20~28 行
make_img_msg()函数使用一个文件名作为参数。使用文件中的数据生成一个新的email.mime.image.MIMEImage 实例。添加一个 Content-Disposition 头,接着将消息返回给用户。
第 30~33 行
sendMsg()的唯一目的是获取基本的电子邮件发送信息(发件人、收件人、消息正文),接着传送消息,然后返回给调用者。要查看更详尽的输出内容,可以试试这个扩展:s.set_debuglevel(True),其中 s 是 smtplib.SMTP服务器。最终,与前面一样,因为许多 SMTP 服务器需要登录,所以需要在这里登录(在登录之后,发送电子邮件消息之前)。
第 35~48 行
这是这段脚本的主要部分,它仅仅测试这两个函数。用这两个函数创建消息,然后添加From、 To、 Subject 字段,然后将消息传送给这些收件人。当然,为了让应用能够工作,需要填充下面的字段: SENDER、 RECIPS、 SOME_IMG_FILE
二、解析电子邮件
与从零生成一封电子邮件相比,解析电子邮件简单一些。一般要用到 email 包中的几个工具 ,如 email.message_from_string()函数,以及 message.walk()和 message.get_payload()方法。
下面是一个典型的模式。
def processMsg(entire_msg):
body = ''
msg = email.message_from_string(entire_msg)
if msg.is_multipart():
for part in msg.walk():
if part.get_content_type() == 'text/plain':
body = part.get_payload()
break
else:
body = msg.get_payload(decode=True)
else:
body = msg.get_payload(decode=True)
return body
这段代码很容易理解。下面是其中的主要函数解释。
• email.message_from_string():用来解析消息。
• msg.walk():遍历消息的附件。
• part.get_content_type():获得正确 MIME 类型。
• msg.get_payload():从消息正文中获取特定的部分。通常 decode 标记会设为 True,即邮件正文根据每个 Content-Transfer-Encoding 头解码。