Python之——Python之生成并解析电子邮件

转载请注明出处: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 头解码。


阅读更多
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/l1028386804/article/details/79972801
文章标签: Python
个人分类: python
所属专栏: Python
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

关闭
关闭
关闭