5.4 接收邮件
5.4.1 接收邮件协议IMAP与POP3
Python内置一个poplib
模块,实现了POP3协议,可以直接用来收邮件。
POP3协议收取的不是一个已经可以阅读的邮件本身,而是邮件的原始文本,这和SMTP协议很像,SMTP发送的也是经过编码后的一大段文本。要把POP3收取的文本变成可以阅读的邮件,还需要用email
模块提供的各种类来解析原始文本,变成可阅读的邮件对象。
所以,收取邮件分两步:
第一步:用poplib
把邮件的原始文本下载到本地;
第二步:用email
解析原始文本,还原为邮件对象。
例如:
#!/usr/bin/python3
import poplib
import getpass
from email.parser import Parser
# 输入邮件地址, 口令和POP3服务器地址:
mail_from = 'liugz@wanho.net'
mail_password = getpass.getpass('Password: ')
pop3_server = 'pop.exmail.qq.com'
# 连接到POP3服务器:
server = poplib.POP3(pop3_server)
# server.set_debuglevel(1)
server.user(mail_from)
server.pass_(mail_password)
# stat()返回邮件数量和占用空间:
print('Messages: %s. Size: %s' % server.stat())
# list()返回所有邮件的编号:
resp, mails, octets = server.list()
# 可以查看返回的列表类似[b'1 4475', b'2 550080', ...]
print(mails)
# 获取最新一封邮件, 注意索引号从1开始:
index = len(mails)
resp, lines, octets = server.retr(index)
# lines存储了邮件的原始文本的每一行,
# 可以获得整个邮件的原始文本:
message = b'\r\n'.join(lines).decode('utf-8')
# 解析出邮件:
msg = Parser().parsestr(message)
print(msg)
# 关闭连接:
server.quit()
结果为:
root@liu-ubuntu:~# ./21-pop3.py
Password:
Messages: 11. Size: 696435
[b'1 4475', b'2 550080', b'3 4246', b'4 3489', b'5 5230', b'6 121217', b'7 4235', b'8 831', b'9 734', b'10 734', b'11 1164']
Date: Mon, 18 Jun 2018 10:57:40 +0800
X-QQ-mid: bizesmtp13t1529290659td2reasw
Received: from [127.0.1.1] (unknown [114.222.123.246])
by esmtp4.qq.com (ESMTP) with SMTP id 0
for <liugz@wanho.net>; Mon, 18 Jun 2018 10:57:39 +0800 (CST)
X-QQ-SSF: 00110000002000305260B00A0000001
X-QQ-FEAT: +Uz4s21GnHpIBMhi0Jwxq8oYwPIAuxwtr3vzud87lRDVUHo4bqX2/c7HhqZ8q
KBGMXPiGu1EFJdbpn49fywR7eiVpu9anXuf+J8KSV755fPyHBymETd3w7zUT7YYR87Dw36I
yJTmh53v5ybkqPAYCvSC8loNW98zwuiCVkI+thMgVG65J9bSqqi5PmDilzVHD+FbXJiL9Ex
hx164oq6jgpxoHydWpt9YUzfZ+1ejeFA=
Content-Type: multipart/mixed; boundary="===============6900250946369473361=="
MIME-Version: 1.0
Subject: =?utf-8?b?UHl0aG9u5Y+R6YCB5bim6ZmE5Lu255qE6YKu5Lu2?=
From: liugz@wanho.net
To: liugz@wanho.net
--===============6900250946369473361==
Content-Type: text/plain; charset="us-ascii"
MIME-Version: 1.0
Content-Transfer-Encoding: 7bit
Content-Type: application/octet-stream
Content-Disposition: attachment; filename="test.conf"
[sec_a]
a_key1 = 20
a_key2 = 10
[sec_b]
b_key1 = 121
b_key2 = abcd
b_key3 = new-$r
b_key4 = 127.0.0.1
b_newkey = new-value
[a_new_section]
new_key = new_value
--===============6900250946369473361==--