接收邮件有两种协议:POP3和IMAP
POP3协议允许电子邮件客户端下载服务器上的邮件,但是在客户端上的操作(如移动邮件、标记已读等)不会反馈到服务器上
IMAP协议提供邮件服务器和电子邮件客户端之间的双向通信,任何在客户端上做的改变都会同步到服务器上。
IMAP协议提供的摘要浏览功能可以让我们在阅读完所有的邮件信息(到达时间、主题、发件人、大小等)后才做出是否下载的决定。此外,IMAP协议能更好地支持在多个不同设备上随时访问新邮件的功能
使用POP3协议接收邮件
下面举个例子来演示使用POP3接收邮件的过程
在这个例子中,你需要把邮箱地址、密码、服务器的pop3地址更换成自己使用的邮箱的地址
import poplib
from email.parser import Parser
username = 'xxxx@xx.xxx'
password = 'xxxxxx'
pop_server = poplib.POP3_SSL('pop.xxxxx.com', 995)
print(pop_server.getwelcome().decode("utf-8"))
pop_server.user(username)
pop_server.pass_(password)
#打印出当前邮箱的状态。第一个返回值为邮件数,第二个返回值为占用的空间
print('Server stat', pop_server.stat())
#获取所有的邮件列表
resp, mails, octets = pop_server.list()
print(mails)
#获取最新的一封邮件(序号最大的),邮件索引从1开始计数!
index = len(mails)
resp, lines, octets = pop_server.retr(index)
msg_content = b'\r\n'.join(lines).decode('utf-8')
#解析出邮件
msg = Parser().parsestr(msg_content)
print(msg)
#可以根据邮件索引号直接从服务器删除邮件
pop_server.dele(index)
#关闭连接
pop_server.quit()
使用IMAP接收邮件
使用IMAP接收邮件的的方法与POP3的基本相同
import imaplib
import email
username = 'xxx@xx.com'
password = 'xxxx'
imap_server = imaplib.IMAP4_SSL('imap.xxxx.xx', 993)
imap_server.login(username, password)
print('=========LOG=========')
imap_server.print_log()
print('=====================')
#获取邮箱目录
resp, data = imap_server.list()
print(data)
#选择默认收件箱并打印邮件数量
result, data = imap_server.select('INBOX')
print(result, data)
print(data[0])
#获取最新的一封邮件
typ, lines = imap_server.fetch(data[0], '(RFC822)')
#解析出邮件
msg = email.message_from_string(lines[0][1].decode('utf-8'))
print(msg)
imap_server.close()