python3收邮件_认真对待 Python3 收邮件

2023-11-08

前言

之前老是用Python发邮件,用起来挺方便的。但是一直没实现用Python收邮件,最近忙着笔试面试,但是又不能时刻打开浏览器,刷手机看看有没有新邮件(尤其是有没有关于面试,笔试通知的邮件)啊。所以写个脚本来做下定时任务,一旦有相关的主题邮件,结合GUI控件,声音组件,给出提醒。

想来还是不错的。

封装好的客户端源码放到了我的GitHub上,有兴趣的可以下载下来试一试。

先来看下效果吧

收邮件其实是被Python内置支持的,名为poplib。安装了Python的话,就会默认存在于标准库中,用起来也很方便。下面就一步步的来实现今天的任务吧。

准备

由于要使用非官方客户端的方式来收取邮件,所以需要打开相应的服务。我本人使用的邮箱是163邮箱,其他的邮箱操作也是类似的。如下:

点击设置

开启pop/smtp/imap协议

先发一封邮件

给目标邮箱发一封邮件吧。我的内容如下:

至此,准备阶段就算是完成了。

初体验

初体验嘛,肯定是会比较简单的了。比如下面我先获取一些常用的信息:

# coding: utf8

import poplib

# 邮箱个人信息

useraccount = '你的邮箱'

password = '你的密码(注意这个密码是授权码,不是你客户端直接登录用的密码)'

# 邮件服务器地址。如果你的邮箱是163,那么可以这么写。qq的话就是pop.qq.com

pop3_server = 'pop.163.com'

# 开始连接到服务器

server = poplib.POP3(pop3_server)

# 可选项: 打开或者关闭调试信息,1为打开,会在控制台打印客户端与服务器的交互信息

server.set_debuglevel(1)

# 可选项: 打印POP3服务器的欢迎文字,验证是否正确连接到了邮件服务器

print(server.getwelcome().decode('utf8'))

# 开始进行身份验证

server.user(useraccount)

server.pass_(password)

# 返回邮件总数目和占用服务器的空间大小(字节数), 通过stat()方法即可

print("Mail counts: {0}, Storage Size: {0}".format(server.stat()))

# 使用list()返回所有邮件的编号,默认为字节类型的串

resp, mails, octets = server.list()

print("响应信息: ", resp)

print("所有邮件简要信息: ", mails)

print("list方法返回数据大小(字节): ", octets)

# 关闭与服务器的连接,释放资源

server.close()

运行结果呢?如下:

+OK Welcome to coremail Mail Pop3 Server (163coms[726cd87d72d896a1ac393507346040fas])

*cmd* 'USER 我的邮箱账号'

*cmd* 'PASS 哈哈不给你看'

*cmd* 'STAT'

*stat* [b'+OK', b'9', b'52140']

Mail counts: (9, 52140), Storage Size: (9, 52140)

*cmd* 'LIST'

响应信息: b'+OK 9 52140'

所有邮件简要信息: [b'1 1595', b'2 1631', b'3 1568', b'4 26710', b'5 2851', b'6 6856', b'7 1494', b'8 6685', b'9 2750']

list方法返回数据大小(字节): 73

试水

经过刚才的初体验,想必已经会和邮件服务器互动了吧。下面正式开始获取邮件。

比如我想获取邮件服务器上其中一封邮件,那么指定一下索引就可以了。

划水

# coding: utf8

import poplib

from email.parser import Parser

import base64

def get_parsed_msg():

# 邮箱个人信息

useraccount = '我的邮箱账号'

password = '密码不告诉你'

# 邮件服务器地址

pop3_server = 'pop.163.com'

# 开始连接到服务器

server = poplib.POP3(pop3_server)

# 可选项: 打开或者关闭调试信息,1为打开,会在控制台打印客户端与服务器的交互信息

server.set_debuglevel(1)

# 可选项: 打印POP3服务器的欢迎文字,验证是否正确连接到了邮件服务器

print(server.getwelcome().decode('utf8'))

# 开始进行身份验证

server.user(useraccount)

server.pass_(password)

# 使用list()返回所有邮件的编号,默认为字节类型的串

resp, mails, octets = server.list()

print('邮件总数: {}'.format(len(mails)))

# 下面单纯获取最新的一封邮件

total_mail_numbers = len(mails)

# 默认下标越大,邮件越新,所以total_mail_numbers代表最新的那封邮件

response_status, mail_message_lines, octets = server.retr(total_mail_numbers)

print('邮件获取状态: {}'.format(response_status))

print('原始邮件数据:\n{}'.format(mail_message_lines))

print('该封邮件所占字节大小: {}'.format(octets))

msg_content = b'\r\n'.join(mail_message_lines).decode('gbk')

# 邮件原始数据没法正常浏览,因此需要相应的进行解码操作

msg = Parser().parsestr(text=msg_content)

print('解码后的邮件信息:\n{}'.format(msg))

# 关闭与服务器的连接,释放资源

server.close()

return msg

msg = get_parsed_msg()

print(msg)

获取到的结果如下:

+OK Welcome to coremail Mail Pop3 Server (163coms[726cd87d72d896a1ac393507346040fas])

*cmd* 'USER 我的邮箱账号'

*cmd* 'PASS 密码不告诉你'

*cmd* 'LIST'

邮件总数: 9

*cmd* 'RETR 9'

邮件获取状态: b'+OK 2750 octets'

原始邮件数据:

[b'Received: from smtpbg323.qq.com (unknown [14.17.32.33])', b'\tby mx38 (Coremail) with SMTP id WMCowEAJ7HMTgthYHvSICA--.9482S3;', b'\tMon, 27 Mar 2017 11:08:03 +0800 (CST)', b'DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=qq.com; s=s201512;', b'\tt=1490584083; bh=5mkEI/McRebiKTOSeIfoEIueMTpC8wHHmBUHOC6EIeY=;', b'\th=From:To:Subject:Mime-Version:Content-Type:Content-Transfer-Encoding:Date:Message-ID;', b'\tb=DOHiu0sjQqdYNTqsgSnoUcWztwB0g1xTHHdTJXXShRp8R72USTGblJP6lRU02p2JR', b'\t U4oG22TWhv3IJ3Or9qd1cKqJ8W/3Ya1ih+L1BTfEXhbUE59v1HDA5GjpCc/Cg7aMgA', b'\t PdtmwvW6H45brmgj3P8/KFeOz2GVKTsdZqV8VK1Y=', b'X-QQ-FEAT: Gf8h89u9tNzDNu+6K07CGaVRAG8UpkukGtC6J/Do7Z8trKQlxG+/B3qJrb7U5', b'\tp1QE1l6aary3W8oy+/VAtrDPVFS54LQa27g7fce+ra/0dXGlXVZsqlieRerMeDF/AgwswQF', b'\twZxxr068ee9tfDe5jX7JccTWC1uZPlqzuks9BPjfYmmnzjayMEYch+msiLwNMwLOZba24mn', b'\tucXTswC0032crI2RaLmiBzCuAdeKmZa+L9J6aS9JUD6zihYObJ6l4P/ps97QHqGBEs4MP4c', b'\tFKzdVlvFxtRg3X', b'X-QQ-SSF: 00010000000000F000000000000000Z', b'X-HAS-ATTACH: no', b'X-QQ-BUSINESS-ORIGIN: 2', b'X-Originating-IP: 111.117.136.219', b'X-QQ-STYLE: ', b'X-QQ-mid: webmail585t1490584082t821567', b'From: "=?gb18030?B?ufnosQ==?=" <1064319632@qq.com>', b'To: "=?gb18030?B?c3BpZGVyc21hbGw=?=" ', b'Subject: Test for poplib in Python3', b'Mime-Version: 1.0', b'Content-Type: multipart/alternative;', b'\tboundary="----=_NextPart_58D88212_0AF3CB08_64DBF547"', b'Content-Transfer-Encoding: 8Bit', b'Date: Mon, 27 Mar 2017 11:08:02 +0800', b'X-Priority: 3', b'Message-ID: ', b'X-QQ-MIME: TCMime 1.0 by Tencent', b'X-Mailer: QQMail 2.x', b'X-QQ-Mailer: QQMail 2.x', b'X-QQ-SENDSIZE: 520', b'Feedback-ID: webmail:qq.com:bgweb:bgweb125', b'X-CM-TRANSID:WMCowEAJ7HMTgthYHvSICA--.9482S3', b'Authentication-Results: mx38; spf=pass smtp.mail=1064319632@qq.com; dk', b'\tim=pass header.i=@qq.com', b'X-Coremail-Antispam: 1Uf129KBjDUn29KB7ZKAUJUUUUU529EdanIXcx71UUUUU7v73', b'\tVFW2AGmfu7bjvjm3AaLaJ3UbIYCTnIWIevJa73UjIFyTuYvjxUDMUqUUUUU', b'', b'This is a multi-part message in MIME format.', b'', b'------=_NextPart_58D88212_0AF3CB08_64DBF547', b'Content-Type: text/plain;', b'\tcharset="gb18030"', b'Content-Transfer-Encoding: base64', b'', b'SGkgYnJvLg0KDQoNCiBUaGlzIGlzIGEgc2ltcGxlIHRleHQgZm9yIHRlc3RpbmcgcmVjZWl2', b'aW5nIG1haWwgaW4gUHl0aG9uMy4NCiAgICA8YSBocmVmPSdodHRwOi8vYmxvZy5jc2RuLm5l', b'dC9tYXJrc2lub2JlcmcnPk15IEJsb2cgU2l0ZS48L2E+', b'', b'------=_NextPart_58D88212_0AF3CB08_64DBF547', b'Content-Type: text/html;', b'\tcharset="gb18030"', b'Content-Transfer-Encoding: base64', b'', b'PGRpdj48ZGl2PkhpIGJyby48L2Rpdj48ZGl2Pjxicj48L2Rpdj48ZGl2PiZuYnNwO1RoaXMg', b'aXMgYSBzaW1wbGUgdGV4dCBmb3IgdGVzdGluZyByZWNlaXZpbmcgbWFpbCBpbiBQeXRob24z', b'LjwvZGl2PjxkaXY+Jm5ic3A7ICZuYnNwOyAmbHQ7YSBocmVmPSdodHRwOi8vYmxvZy5jc2Ru', b'Lm5ldC9tYXJrc2lub2JlcmcnJmd0O015IEJsb2cgU2l0ZS4mbHQ7L2EmZ3Q7PC9kaXY+PC9k', b'aXY+', b'', b'------=_NextPart_58D88212_0AF3CB08_64DBF547--', b'']

该封邮件所占字节大小: 2750

解码后的邮件信息:

Received: from smtpbg323.qq.com (unknown [14.17.32.33])

by mx38 (Coremail) with SMTP id WMCowEAJ7HMTgthYHvSICA--.9482S3;

Mon, 27 Mar 2017 11:08:03 +0800 (CST)

DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=qq.com; s=s201512;

t=1490584083; bh=5mkEI/McRebiKTOSeIfoEIueMTpC8wHHmBUHOC6EIeY=;

h=From:To:Subject:Mime-Version:Content-Type:Content-Transfer-Encoding:Date:Message-ID;

b=DOHiu0sjQqdYNTqsgSnoUcWztwB0g1xTHHdTJXXShRp8R72USTGblJP6lRU02p2JR

U4oG22TWhv3IJ3Or9qd1cKqJ8W/3Ya1ih+L1BTfEXhbUE59v1HDA5GjpCc/Cg7aMgA

PdtmwvW6H45brmgj3P8/KFeOz2GVKTsdZqV8VK1Y=

X-QQ-FEAT: Gf8h89u9tNzDNu+6K07CGaVRAG8UpkukGtC6J/Do7Z8trKQlxG+/B3qJrb7U5

p1QE1l6aary3W8oy+/VAtrDPVFS54LQa27g7fce+ra/0dXGlXVZsqlieRerMeDF/AgwswQF

wZxxr068ee9tfDe5jX7JccTWC1uZPlqzuks9BPjfYmmnzjayMEYch+msiLwNMwLOZba24mn

ucXTswC0032crI2RaLmiBzCuAdeKmZa+L9J6aS9JUD6zihYObJ6l4P/ps97QHqGBEs4MP4c

FKzdVlvFxtRg3X

X-QQ-SSF: 00010000000000F000000000000000Z

X-HAS-ATTACH: no

X-QQ-BUSINESS-ORIGIN: 2

X-Originating-IP: 111.117.136.219

X-QQ-STYLE:

X-QQ-mid: webmail585t1490584082t821567

From: "=?gb18030?B?ufnosQ==?=" <1064319632@qq.com>

To: "=?gb18030?B?c3BpZGVyc21hbGw=?="

Subject: Test for poplib in Python3

Mime-Version: 1.0

Content-Type: multipart/alternative;

boundary="----=_NextPart_58D88212_0AF3CB08_64DBF547"

Content-Transfer-Encoding: 8Bit

Date: Mon, 27 Mar 2017 11:08:02 +0800

X-Priority: 3

Message-ID:

X-QQ-MIME: TCMime 1.0 by Tencent

X-Mailer: QQMail 2.x

X-QQ-Mailer: QQMail 2.x

X-QQ-SENDSIZE: 520

Feedback-ID: webmail:qq.com:bgweb:bgweb125

X-CM-TRANSID: WMCowEAJ7HMTgthYHvSICA--.9482S3

Authentication-Results: mx38; spf=pass smtp.mail=1064319632@qq.com; dk

im=pass header.i=@qq.com

X-Coremail-Antispam: 1Uf129KBjDUn29KB7ZKAUJUUUUU529EdanIXcx71UUUUU7v73

VFW2AGmfu7bjvjm3AaLaJ3UbIYCTnIWIevJa73UjIFyTuYvjxUDMUqUUUUU

This is a multi-part message in MIME format.

------=_NextPart_58D88212_0AF3CB08_64DBF547

Content-Type: text/plain;

charset="gb18030"

Content-Transfer-Encoding: base64

SGkgYnJvLg0KDQoNCiBUaGlzIGlzIGEgc2ltcGxlIHRleHQgZm9yIHRlc3RpbmcgcmVjZWl2

aW5nIG1haWwgaW4gUHl0aG9uMy4NCiAgICA8YSBocmVmPSdodHRwOi8vYmxvZy5jc2RuLm5l

dC9tYXJrc2lub2JlcmcnPk15IEJsb2cgU2l0ZS48L2E+

------=_NextPart_58D88212_0AF3CB08_64DBF547

Content-Type: text/html;

charset="gb18030"

Content-Transfer-Encoding: base64

PGRpdj48ZGl2PkhpIGJyby48L2Rpdj48ZGl2Pjxicj48L2Rpdj48ZGl2PiZuYnNwO1RoaXMg

aXMgYSBzaW1wbGUgdGV4dCBmb3IgdGVzdGluZyByZWNlaXZpbmcgbWFpbCBpbiBQeXRob24z

LjwvZGl2PjxkaXY+Jm5ic3A7ICZuYnNwOyAmbHQ7YSBocmVmPSdodHRwOi8vYmxvZy5jc2Ru

Lm5ldC9tYXJrc2lub2JlcmcnJmd0O015IEJsb2cgU2l0ZS4mbHQ7L2EmZ3Q7PC9kaXY+PC9k

aXY+

------=_NextPart_58D88212_0AF3CB08_64DBF547--

Received: from smtpbg323.qq.com (unknown [14.17.32.33])

by mx38 (Coremail) with SMTP id WMCowEAJ7HMTgthYHvSICA--.9482S3;

Mon, 27 Mar 2017 11:08:03 +0800 (CST)

DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=qq.com; s=s201512;

t=1490584083; bh=5mkEI/McRebiKTOSeIfoEIueMTpC8wHHmBUHOC6EIeY=;

h=From:To:Subject:Mime-Version:Content-Type:Content-Transfer-Encoding:Date:Message-ID;

b=DOHiu0sjQqdYNTqsgSnoUcWztwB0g1xTHHdTJXXShRp8R72USTGblJP6lRU02p2JR

U4oG22TWhv3IJ3Or9qd1cKqJ8W/3Ya1ih+L1BTfEXhbUE59v1HDA5GjpCc/Cg7aMgA

PdtmwvW6H45brmgj3P8/KFeOz2GVKTsdZqV8VK1Y=

X-QQ-FEAT: Gf8h89u9tNzDNu+6K07CGaVRAG8UpkukGtC6J/Do7Z8trKQlxG+/B3qJrb7U5

p1QE1l6aary3W8oy+/VAtrDPVFS54LQa27g7fce+ra/0dXGlXVZsqlieRerMeDF/AgwswQF

wZxxr068ee9tfDe5jX7JccTWC1uZPlqzuks9BPjfYmmnzjayMEYch+msiLwNMwLOZba24mn

ucXTswC0032crI2RaLmiBzCuAdeKmZa+L9J6aS9JUD6zihYObJ6l4P/ps97QHqGBEs4MP4c

FKzdVlvFxtRg3X

X-QQ-SSF: 00010000000000F000000000000000Z

X-HAS-ATTACH: no

X-QQ-BUSINESS-ORIGIN: 2

X-Originating-IP: 111.117.136.219

X-QQ-STYLE:

X-QQ-mid: webmail585t1490584082t821567

From: "=?gb18030?B?ufnosQ==?=" <1064319632@qq.com>

To: "=?gb18030?B?c3BpZGVyc21hbGw=?="

Subject: Test for poplib in Python3

Mime-Version: 1.0

Content-Type: multipart/alternative;

boundary="----=_NextPart_58D88212_0AF3CB08_64DBF547"

Content-Transfer-Encoding: 8Bit

Date: Mon, 27 Mar 2017 11:08:02 +0800

X-Priority: 3

Message-ID:

X-QQ-MIME: TCMime 1.0 by Tencent

X-Mailer: QQMail 2.x

X-QQ-Mailer: QQMail 2.x

X-QQ-SENDSIZE: 520

Feedback-ID: webmail:qq.com:bgweb:bgweb125

X-CM-TRANSID: WMCowEAJ7HMTgthYHvSICA--.9482S3

Authentication-Results: mx38; spf=pass smtp.mail=1064319632@qq.com; dk

im=pass header.i=@qq.com

X-Coremail-Antispam: 1Uf129KBjDUn29KB7ZKAUJUUUUU529EdanIXcx71UUUUU7v73

VFW2AGmfu7bjvjm3AaLaJ3UbIYCTnIWIevJa73UjIFyTuYvjxUDMUqUUUUU

This is a multi-part message in MIME format.

------=_NextPart_58D88212_0AF3CB08_64DBF547

Content-Type: text/plain;

charset="gb18030"

Content-Transfer-Encoding: base64

SGkgYnJvLg0KDQoNCiBUaGlzIGlzIGEgc2ltcGxlIHRleHQgZm9yIHRlc3RpbmcgcmVjZWl2

aW5nIG1haWwgaW4gUHl0aG9uMy4NCiAgICA8YSBocmVmPSdodHRwOi8vYmxvZy5jc2RuLm5l

dC9tYXJrc2lub2JlcmcnPk15IEJsb2cgU2l0ZS48L2E+

------=_NextPart_58D88212_0AF3CB08_64DBF547

Content-Type: text/html;

charset="gb18030"

Content-Transfer-Encoding: base64

PGRpdj48ZGl2PkhpIGJyby48L2Rpdj48ZGl2Pjxicj48L2Rpdj48ZGl2PiZuYnNwO1RoaXMg

aXMgYSBzaW1wbGUgdGV4dCBmb3IgdGVzdGluZyByZWNlaXZpbmcgbWFpbCBpbiBQeXRob24z

LjwvZGl2PjxkaXY+Jm5ic3A7ICZuYnNwOyAmbHQ7YSBocmVmPSdodHRwOi8vYmxvZy5jc2Ru

Lm5ldC9tYXJrc2lub2JlcmcnJmd0O015IEJsb2cgU2l0ZS4mbHQ7L2EmZ3Q7PC9kaXY+PC9k

aXY+

------=_NextPart_58D88212_0AF3CB08_64DBF547--

这样就获取到真正的数据了,对比之后不难发现。未解码之前和解码之后,差距还是很大的。

因为Python早已经想到了这一点。所以把原生数据解码后转换成email.message.Message对象。这样我们就可以根据属性获取到相应的值了。相比于原生的那些加密的数据,可谓是用心良苦。

蹚水

下面再往下挖一挖,已经获取到了解码后的数据了,怎么提取出我们想要的内容呢?

不妨想一下,我们需要什么?无非是发件人,收件人,主题,邮件正文。其他的貌似不是很重要了。

再次观察打印出的数据。不难发现有这样一串数据:

From: "=?gb18030?B?ufnosQ==?=" <1064319632@qq.com>

To: "=?gb18030?B?c3BpZGVyc21hbGw=?="

Subject: Test for poplib in Python3

对比准备阶段的发出的那封邮件,是不是有点眼熟呢?

仔细思考一下发现from等字段是被经过了编码处理的。而且根据对比From和To字段的格式。发现是

=?编码?B?base64编码串?=

注意B应该是代表的byte字节类型。于是提取出关键部分,我们需要的就是编码和base64编码后的串嘛。所以使用split方法就会很轻松了。因为要多次使用这些代码,所以还是封装成一个函数的好。

def decode_base64(s, charset='utf8'):

return str(base64.decodebytes(s.encode(encoding=charset)), encoding=charset)

获取解码后的结果

好了,既然这样就可以了,剩下的To, Subject字段也就可以这样做了。至于正文部分比较麻烦,待会再聊。

这里先把代码写出来(没有进行重构呢还,别急。)

def get_details(msg):

# 保存核心信息的字典,用于返回

details = {}

# 获取发件人详情

fromstr = msg.get('From')

print(fromstr)

from_nickname, from_account = get_mail_info(fromstr)

print(from_nickname, from_account)

# 获取收件人详情

tostr = msg.get('To')

to_nickname, to_account = get_mail_info(tostr)

print(to_account, to_nickname)

# 获取主题信息,也就是标题内容

subject = msg.get('Subject')

print(subject)

简单查看一下获取的结果。

"=?gb18030?B?ufnosQ==?=" <1064319632@qq.com>

郭璞 1064319632@qq.com

spidersmall@163.com spidersmall

Test for poplib in Python3

恩,这就可以了。该获取的也都获取到了。

潜水

最重要的部分要来了。那就是正文部分。因为正文部分比较特殊,所以处理起来要分而治之。

在163邮箱中,收到的邮件被分为两部分,一部分是文本信息,另一部分是添加了HTML代码的形式。但是不管哪一样,都是我们需要了解的。

还是查看刚才解码后的数据。

This is a multi-part message in MIME format.

------=_NextPart_58D88212_0AF3CB08_64DBF547

Content-Type: text/plain;

charset="gb18030"

Content-Transfer-Encoding: base64

SGkgYnJvLg0KDQoNCiBUaGlzIGlzIGEgc2ltcGxlIHRleHQgZm9yIHRlc3RpbmcgcmVjZWl2

aW5nIG1haWwgaW4gUHl0aG9uMy4NCiAgICA8YSBocmVmPSdodHRwOi8vYmxvZy5jc2RuLm5l

dC9tYXJrc2lub2JlcmcnPk15IEJsb2cgU2l0ZS48L2E+

------=_NextPart_58D88212_0AF3CB08_64DBF547

Content-Type: text/html;

charset="gb18030"

Content-Transfer-Encoding: base64

PGRpdj48ZGl2PkhpIGJyby48L2Rpdj48ZGl2Pjxicj48L2Rpdj48ZGl2PiZuYnNwO1RoaXMg

aXMgYSBzaW1wbGUgdGV4dCBmb3IgdGVzdGluZyByZWNlaXZpbmcgbWFpbCBpbiBQeXRob24z

LjwvZGl2PjxkaXY+Jm5ic3A7ICZuYnNwOyAmbHQ7YSBocmVmPSdodHRwOi8vYmxvZy5jc2Ru

Lm5ldC9tYXJrc2lub2JlcmcnJmd0O015IEJsb2cgU2l0ZS4mbHQ7L2EmZ3Q7PC9kaXY+PC9k

aXY+

------=_NextPart_58D88212_0AF3CB08_64DBF547--

是不是发现了Content-type, charset等熟悉的字段呢?这其实就是相关于正文的信息了。

正文信息是被base64编码后的串,这是因为要做一下安保措施(但是base64不是加密手段,切记切记)。

查阅了官方手册之后,我发现还是比较容易处理的。如下:

parts = msg.get_payload()

# print('8'*9, parts[0].as_string())

content_type = parts[0].get_content_type()

content_charset = parts[0].get_content_charset()

# parts[0] 默认为文本信息,而parts[1]默认为添加了HTML代码的数据信息

content = parts[0].as_string().split('base64')[-1]

print('Content*********', decode_base64(content, content_charset))

content = parts[1].as_string().split('base64')[-1]

print('HTML Content:', decode_base64(content, content_charset))

打印的结果呢?如下:

Content********* Hi bro.

This is a simple text for testing receiving mail in Python3.

My Blog Site.

HTML Content:

Hi bro.
 This is a simple text for testing receiving mail in Python3.
    <a href='http://blog.csdn.net/marksinoberg'>My Blog Site.</a>

对比咱们发送的真实的邮件内容。发现没毛病了。

至此,简单的获取文本邮件就算是搞定了。

拓展

至于获取附件等复杂类型的邮件,我还没做具体的测试,但是大致看了下官方文档。

应该还是不会很难的,毕竟Python。

有点跑偏了,现在已经获取到邮件相关的详细内容了,下一步对发件人进行白名单,黑名单的判断啊也变得很随意了。

关于内容可以借助贝叶斯来过滤出垃圾邮件,并调用poplib的删除邮件的方法自动的删除。

或者统计一下邮件正文的词频,借助nltk实现简单的统计分析。等等吧。

最后,因为Python3.6没能装上去pywin32,控件的事就先暂且搁置一下。

最后的最后,来分析一下收邮件的使用场景。其实这个收邮件的作用并不是很大,日常主要是发邮件用的比较多。

但是对于不能时刻查阅重要邮件的场景,比如等待面试,笔试通知。还是比较实用的。

需要源码的小伙伴,可以在博客下面留下您的邮箱,或者在博客栏目左侧找到我的联系方式与我联系。

晚上再来更新一下。

演示动图

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

python3收邮件_认真对待 Python3 收邮件 的相关文章

  • Threejs加载OBJ模型

    threejs加载OBJ模型代码
  • 2014年6月23日-6月29日(共11小时,剩4424小时)

    6月23日 上午有事 下午1小时 剩4438小时 6月24日 3小时 剩4435小时 6月25日 5小时 剩4430小时 6月26日 1小时 剩4429小时 6月27日 3小时 剩4426小时 6月29日 2小时 剩4424小时
  • 论文笔记:When Do Contrastive Learning Signals Help Spatio-TemporalGraph Forecasting?

    2022 SigSpatial 1 intro 1 1 背景 论文认为数据稀缺是阻碍时空图 STG 预测的一个关键问题 在这一领域的公共数据集通常只包含几个月的数据 限制了可以构建的训练实例数量 gt 学习模型可能会对训练数据过拟合 导致泛
  • Redis的这些都没有掌握,你还想要拿Offer?

    Redis 简介 Redis 是完全开源免费的 遵守 BSD 协议 是一个高性能的 key value 数据库 Redis 与 其他 key value 缓存产品有以下三个特点 Redis 支持数据持久化 可以将内存中的数据保存在磁盘中 重
  • 反爬虫策略的应对方法汇总

    现在越来越多的工作需要用到爬虫程序 但是同时也有很多人会通过爬虫程序恶意竞争 因此为了能够保护自己的正当权益 各种反爬虫程序被研发利用起来 所以很多时候 在进行爬虫工作的时候首要面对的就是爬虫和反爬虫的拉锯战 这里就说一下常见的防爬虫策略和
  • c语言排序之冒泡排序升序的使用详解

    在c语言中实现冒泡排序 简介 冒泡 这个名字的由来是因为越大的元素会经由交换慢慢 浮 到数列的顶端 故名 冒泡排序应该是最常见的排序方法了 c语言初学者一定要学会使用 冒泡排序 BubbleSort 的基本概念是 依次比较相邻的两个数 将小
  • OpenCV中RotatedRect的角度问题与平行判定

    OpenCV中RotatedRect的角度问题与平行判定 在运用OpenCV的过程中 想对两个细窄长方形进行平行判定 但是因为RotatedRct的角度问题 走了很多弯路 RotatedRect OpenCV中 以左上角角点为O点 竖直向下
  • Nginx 部署 Django Python虚拟环境创建 傻瓜教程

    这里不讨论uwsgi 与 nginx之间的关系 但是建议学习 通俗说 Nginx就是可以让你的网页支持更多请求时保证负载均衡 简单的网页用uwsgi部署配合django runserver也可以达到要求 所以从负载能力是 Nginx gt
  • 浮点数在计算机中存储方式

    C语言和C 语言中 对于浮点类型的数据采用单精度类型 float 和双精度类型 double 来存储 float数据占用32bit double数据占用64bit 我们在声明一个变量float f 2 25f的时候 是如何分配内存的呢 如果
  • 什么是软件测试?零基础入门知识要点总结篇,5分钟带你快速了解

    1 什么是软件测试 软件测试 英语 Software Testing 描述一种用来促进鉴定软件的正确性 完整性 安全性和质量的过程 换句话说 软件测试是一种实际输出与预期输出之间的审核或者比较过程 通俗的来讲 软件测试 就是软件测试人员验证
  • 如何使用 Flask 和 GPT-4 API 创建人工智能驱动的 Python Web 应用程序

    欢迎来到 Web 开发的未来 人工智能 AI 正在彻底改变我们创建在线应用程序并与之交互的方式 在这篇博文中 我们将向您介绍使用 Flask 网络框架和 OpenAI 最先进的 GPT 4 API 创建尖端的人工智能 Python 网络应用
  • Vue06/Vue中this.$nextTick( ) 的用法及详细介绍

    一 nextTick 语法 this nextTick 箭头函数体 作用 this nextTick这个方法作用是当数据被修改后使用这个方法 回调函数获取更新后的dom再渲染出来 注意 1 data改变 更新DOM是异步的 2 获取更新后的
  • 基于Camera2和MediaRecorder实现视频录制

    一 概述 视频录制 在一般开发中很少遇到 大部分开发工作都是写写页面 请求接口 展示数据等等 真要遇到 可能采用第三方库实现 一来实现快速 二来可能觉得别人实现的比较好 特别是在开发周期很紧的情况下 一般都不会自己花时间实现 其实最好是使用
  • 「AntV」使用AntV X6实现流程编排设计器

    通过对BPMN的深入学习 以及对业界成熟的流程编排设计器的调研 了解到要研发一个流程编排设计器 需要实现如下几个主要的功能 支持创建各种流程图元素 包括任务 活动 网关 事件等 支持绘制各种连接线 包括普通连接线 条件连接线 消息连接线等
  • osg学习(四十八)Windows Error #2000

    Windows Error 2000 Win32WindowingSystem OpenGLContext Unable to restore current OpenGL rendering context Reason 无效的像素格式
  • 海思移植opencv+人脸检测+速度优化

    文章为9crk大神发表在海思论坛 为了备忘 特转到自己博客 地址 http www ebaina com bbs thread 4858 1 1 html 1 确保ubuntu能上网 2 安装cmake 代码 全选 sudo apt get
  • 关于KEIL5编译出现“Target not createt”全系列解决办法——情况1:字节限制 RESTRICTED VERSION WITH 0800H BYTE CODE SIZE LIMIT

    前言 在KEIL5编程 往往遇到许多 Target not createt 即目标不能实现这类情况 由此为帮助大家解决这些问题特开此贴 情况如下 1 2K字节限制错误 ERROR RESTRICTED VERSION WITH 0800H
  • 01背包问题动态规划(二维数组)

    01背包问题动态规划 二维数组 问题描述 一个旅行者有一个最多能装 M 公斤的背包 现在有 n 件物品 它们的重量分别是W1 W2 Wn 它们的价值分别为C1 C2 Cn 求旅行者能获得最大总价值 输入格式 第一行 两个整数 M 背包容量
  • maven项目中新建Servlet问题

    maven项目中新建Servlet问题 该文章分享本人在maven基础学习中遇到的一些问题 以及解决的方法 在IDEA中创建一个maven的web骨架项目后 然后在src main下新建一个directory java 并且设置文件夹为So

随机推荐

  • 为什么选择软件测试这个岗位?(面经)

    面试官 这么多岗位 你为什么会选择软件测试这个岗位 言外之意 你比起这么多应聘者有什么优势 从以下方面回答 1 对软件测试的理解 2 对岗位职责的了解 用自己在大学期间的学习 实习以及自己的优势对于这个岗位有什么好处和满足这个岗位的招聘需求
  • 微信小程序保存图片到相册

    先来看小程序中的保存图片到相册的api wx saveImageToPhotosAlbum filePath test png 这个只是测试路径 没有效果 success res console log success fail funct
  • java环境检测_如何检查是否安装了java环境(即JRE)

    浏览器访问一些调用了图形界面的网页 需要使用JRE 这个时候我们就需要检测操作系统是否已经安装了java环境 JRE 1 点击开始菜单 输入cmd 2 在cmd窗口中输入java 若提示 java 不是内部或外部命令 也不是可运行的程序或批
  • Spring Boot系列之修改内置Tomcat版本

    背景 在 spring boot 出来之前 或者没有使用 spring boot 时 Java EE 开发时如果选择 tomcat servlet 需要自己指定 tomcat 版本 此处没有考虑那种直接把打包的 war 直接扔到本地安装的任
  • 流提取运算符( >> )过滤空白符

    流提取运算符 gt gt 过滤空白符 转载于 https www cnblogs com kevinGaoblog archive 2012 04 12 2444822 html
  • SpringBoot中Swagger2多包扫描问题

    API接口类没有能都放在同一个包下 是按功能模块分的 所以涉及多包扫描的问题 贴出来解决办法 Swagger在POM配置好后 修改SwaggerConfig类 我只贴出要修改的 直接用 swagger2的配置文件 在项目的启动类的同级文件建
  • idea中编写spark程序并打包到集群执行

    本篇主要介绍了如何使用IDEA在本地打包Spark应用程序 以K Means为例 并提交到集群执行 1 安装JDK与Scala SDK JDK和Scala SDK的安装在这里不再赘述 需要注意的是 要设置好环境变量 这样新建项目时就能自动检
  • matlab训练神经网络时,使用mse(均方误差)以外的性能函数。

    除了默认的mse 均方误差 这个性能函数外 还有mae 平均绝对误差 sae 绝对值和误差 sse 平方和误差 crossentropy 交叉熵 要调用其他性能函数 只需要加一行代码 net performFcn mae net是网络名 这
  • Python第二章作业(初级)

    第1关 三角形周长及面积 任务描述 输入的三角形的三条边a b c 的长度 计算并依次输出三角形的周长和面积 结果严格保留2位小数 测试用例的数据保证三角形三边数据可以构成三角形 三角形面积计算公式 公式 其中s a b c 2 输入格式
  • 添加锚点的三种方式

    1 通过链接跳转到指定id的位置 a href a 跳转到指定位置 a ul li 1 li li 1 li li style color red 2 li li 1 li li 1 li ul 2 只有对a标签有效的方法 设置name属性
  • 深度学习09 -Transformer2 - 理论篇

    参考文档 详解Transformer 1 开局来一张Transformer的整体结构图 2 结构图每步分析 1 Encoder 1 Input Embedding 就是对输入的数据进行向量化编码 可能是one hot等等 2 Positio
  • 基于Sqli-Labs靶场的SQL注入-17~22关

    目录 Less 17 基于POST请求方式的中级注入 爆破数据库名 爆破表名 爆破列名 爆破字段值 第十七关代码审计 Less 18 HTTP头部注入 UA注入 爆破数据库名 爆破表名 爆破列名 爆破字段值 HTTP头部注入判断方法 Les
  • mybatis 中 Example 的使用 :条件查询、排序、分页(三种分页方式 : RowBounds、PageHelpler 、limit )

    前些天发现了一个巨牛的人工智能学习网站 通俗易懂 风趣幽默 忍不住分享一下给大家 点击跳转到教程 import tk mybatis mapper entity Example import com github pagehelper Pa
  • 不要再无头苍蝇般寻找AI工具了--100个AI工具网站请查收

    随着ChatGPT的爆火 人工智能也成为当今最热门的领域之一 它正在改变我们的生活和工作方式 想要学习人工智能的基础知识 或者利用人工智能来提升业务效率和创新能力 都需要找到合适的AI工具来帮助您实现目标 然而 在海量的AI工具中 如何快速
  • python写闲鱼脚本_自动化篇

    1 目 标 场 景 前篇文章讲了如何在 iOS 端使用 Airtest 实现自动化的操作 本篇将继续带大家做 iOS 端的自动化项目 如果你经常用闲鱼 应该每天都要进行下面操作 App 签到 鱼塘签到 擦亮宝贝 这一系列操作都是重复且枯燥的
  • 利用opencv进行目标跟踪(python和c++)

    参考来自 https www cnblogs com annie22wang p 9366610 html https learnopencv com object tracking using opencv cpp python pyth
  • win10 pro 使用远程桌面

    今天升级到了win10 专业版 有了几个家庭版没有的功能 比如win10自带的远程桌面功能 远程桌面就是可以通过其他设备访问并操作电脑的功能 比如说Android手机 使用win10家庭版的同学可以参考我的这篇文章升级成为win10专业版
  • 数据列表组件 jqGrid 二次封装

    前段时间在jqgrid基础上 进行了二次封装 应用在公司新的开发平台上 相比以前效果更佳 开发更方便 减少代码50 共享下提供大家参考学习 先看效果 数据表格 树结构表格 多级表头 最多支持3级 用法
  • c++ set用法 入门必看 超详细

    1 set的作用 set就是集合的意思 集合的特点就是不会出现重复的内容 一般用来作查重或去重操作 举个场景 给出一个表 姓名 爱好 小明 打篮球 小刚 画画 小明 听音乐 问该表中出现了多少个人 学会了set 就可以很轻松地解决这个问题
  • python3收邮件_认真对待 Python3 收邮件

    前言 之前老是用Python发邮件 用起来挺方便的 但是一直没实现用Python收邮件 最近忙着笔试面试 但是又不能时刻打开浏览器 刷手机看看有没有新邮件 尤其是有没有关于面试 笔试通知的邮件 啊 所以写个脚本来做下定时任务 一旦有相关的主