POP3接收邮件
POP3(Pst Office Protocol 3),即邮局协议的第3个版本,是TCP/IP协议族的一员,适用于C/S构架结构,它规定怎样将个人计算机连接到Internet的邮件服务器和下载电子邮件的电子协议。而Python内置一个poplib模块,实现了POP3协议,可以直接用来收邮地址解析协议。本实验目的是了解POP协议接收邮件的实现过程。
实现步骤:
1、使用网易163邮箱,在设置/常规设置页面开启POP3/SMTP服务,复制记录下此时的授权码,此授权码只出现一次,后续的编程需要用到。
2、编写代码实现POP3接收邮件,并将邮件信息输出。用Python的poplib模块收取邮件分两步:第一步是用POP3协议把邮件获取到本地,第二步是用email模块把原始邮件解析为Message对象,然后,用适当的形式把邮件内容展示给用户即可。代码如下:
import poplib #导入smtplib模块
from email.header import decode_header #专门构建邮件标题的,这样可以支持标题中文
from email.parser import Parser #解析邮件内容
def print_msg(msg, indent=0):
if indent == 0:
for header in ["From", "To", "Subject", "Date"]:
value = msg[header]
if value:
value = decode_str(value)
print("%s%s: %s" % (" " * indent, header, value))
if msg.is_multipart():
parts = msg.get_payload()
for n, part in enumerate(parts):
print("%spart %s" % (" " * indent, n))
print_msg(part, indent + 1)
else:
content_type = msg.get_content_type()
if content_type == "text/plain" or content_type == "text/html": #plain 代表纯文本
content = msg.get_payload(decode=True)
charset = get_charset(msg)
if charset:
content = content.decode(charset)
print("%sText: %s" % (" " * indent, content))
else:
print("%sAttachment: %s" % (" " * indent, content_type))
def decode_str(s):
l = decode_header(s)
value, charset = l[0]
if charset:
value = value.decode(charset)
if len(l) == 2:
value_tmp = l[1][0]
value = value + value_tmp.decode(charset)
return value
def get_charset(msg):
charset = msg.get_charset()
if charset is None:
content_type = msg.get("Content-type", "").lower()
pos = content_type.find("charset=")
if pos >= 0:
charset = content_type[pos + 8:].strip()
return charset
from_email = "C1362019****@163.com" #邮箱账号
from_email_pwd = "ZDXKBZBNHQMG****" #授权码
pop_server = "pop.163.com" #pop服务器
server = poplib.POP3(pop_server) #连接邮件服务器pop3.com
server.set_debuglevel(1) #查看实时登录日志信息,可以打开或关闭调试信息
print(server.getwelcome().decode("utf-8")) #获取服务器的输出,可选:打印POP3服务器的欢迎文字:
#身份验证
server.user(from_email)
server.pass_(from_email_pwd)
print("Messages: %s Size: %s" % (server.stat())) # stat()返回邮件数量和占用空间
resp, mails, octets = server.list() # list()返回所有邮件的编号
index = len(mails) # 获取最新一封邮件, 注意索引号从1开始
resp, lines, octets = server.retr(index) # lines存储了邮件的原始文本的每一行
msg_content = b"\r\n".join(lines).decode("utf-8") # 可以获得整个邮件的原始文本
msg = Parser().parsestr(msg_content) # 稍后解析出邮件
print_msg(msg) #打印邮件信息
server.quit() # 关闭连接
3、把上面的代码整理好,我们就可以来试试收取一封邮件。先往自己的邮箱发一封邮件,然后用浏览器登录邮箱,看看邮件收到没,如果收到了,我们就来用Python程序把它收到本地,在控制台上输出。运行结果如下:
+OK Welcome to coremail Mail Pop3 Server (163coms[10774b260cc7a37d26d71b52404dcf5cs])
该信息由代码中print(server.getwelcome().decode(“utf-8”)) 打印输出,改语句的功能是获取服务器的输出,打印POP3服务器的欢迎文字。
Messages: 4 Size: 19317
该信息由代码中print(“Messages: %s Size: %s” % (server.stat()))打印输出,其中 stat()返回邮件数量和占用空间。
Subject: test2
Date: Sat, 27 Mar 2021 14:40:45 +0800
part 0
Text: hello
part 1
Text: <meta http-equiv="Content-Type"content=“text/html;charset=GB18030”>
该邮件的标题是test2,发送时间是2021.2.37,星期六,14:40,邮件内容为hello。其中邮件内容输出有两种格式,一种是plain纯文本输出,另一个是html格式输出。
程序实现流程