首页 > 编程知识 正文

pop3协议用于发送邮件,电子邮件使用pop3协议

时间:2023-05-05 10:42:26 阅读:249932 作者:1437

收取邮件就是编写一个MUA作为客户端,从MDA把邮件获取到用户的电脑或者手机上。收取邮件最常用的协议是POP协议,目前版本号是3,俗称POP3

Python内置一个poplib模块,实现了POP3协议,可以直接用来收邮件。

注意到POP3协议收取的不是一个已经可以阅读的邮件本身,而是邮件的原始文本,这和SMTP协议很像,SMTP发送的也是经过编码后的一大段文本。

要把POP3收取的文本变成可以阅读的邮件,还需要用email模块提供的各种类来解析原始文本,变成可阅读的邮件对象。

所以,收取邮件分两步:

第一步:用poplib把邮件的原始文本下载到本地;

第二部:用email解析原始文本,还原为邮件对象。

# -*- coding: utf-8 -*-"""Created on Wed Dec 12 08:47:07 2018@author: yufeng"""import poplib from email.parser import Parserfrom email.header import decode_headerfrom email.utils import parseaddr# 输入邮件地址, 密码 和 POP3服务器的地址email = input('Email: ')password = input('Password: ')pop3_server = "pop3.sina.com"def guess_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 charsetdef decode_str(s): value, charset = decode_header(s)[0] if charset: value = value.decode(charset) return valuedef print_info(msg, indent=0): if indent == 0: for header in ['From', 'To', 'Subject']: value = msg.get(header, '') if value: if header=='Subject': value = decode_str(value) else: hdr, addr = parseaddr(value) name = decode_str(hdr) value = u'%s <%s>' % (name, addr) 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('%s--------------------' % (' ' * indent)) print_info(part, indent + 1) else: content_type = msg.get_content_type() if content_type=='text/plain' or content_type=='text/html': content = msg.get_payload(decode=True) charset = guess_charset(msg) if charset: content = content.decode(charset) print('%sText: %s' % (' ' * indent, content + '...')) else: print('%sAttachment: %s' % (' ' * indent, content_type))# 连接到POP3服务器server = poplib.POP3(pop3_server)# 可以打开或关闭调试信息server.set_debuglevel(1)# 打印POP3服务器的欢迎文字print(server.getwelcome().decode('utf-8'))# 身份验证server.user(email)server.pass_(password)# stat()返回邮件数量和占用空间print("Message: %s. Size: %s" % server.stat())# list()返回所有邮件的编号resp, mails, octets = server.list()# 可以查看返回的列表类似[b'1 82923', b'2 2184', ...]print(mails)# 获取最新一封邮件, 注意索引号从1开始:index = len(mails)resp, lines, octets = server.retr(index)# lines存储了邮件的原始文本的每一行,# 可以获得整个邮件的原始文本:msg_content = b'rn'.join(lines).decode('utf-8')# 稍后解析出邮件:msg = Parser().parsestr(msg_content)print_info(msg)# 可以根据邮件索引号直接从服务器删除邮件:# server.dele(index)# 关闭连接:server.quit()

先使用之前的SMTP协议发送一封测试邮件,然后运行代码接收邮件

使用POP3接收邮件

+OK sina pop3 server ready*cmd* 'USER xxxx@sina.com'*cmd* 'PASS xxxxxx'*cmd* 'STAT'*stat* [b'+OK', b'9', b'144135']Message: 9. Size: 144135*cmd* 'LIST'[b'1 10594', b'2 2686', b'3 1077', b'4 1078', b'5 1168', b'6 1094', b'7 42119', b'8 42184', b'9 42135']*cmd* 'RETR 9'From: test <xxx@sina.com>To: 接收邮件测试账号 <xxx@sina.com>Subject: 基于SMTP协议发送邮件的测试part 0-------------------- Text: Python使用POP3收取邮件...part 1-------------------- Attachment: image/png*cmd* 'QUIT'
一文让你快速了解JavaScript栈jquery可不可以获取链接的内容

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。