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==--