Python使用poplib模块实现收取邮件

  介绍

本篇文章为大家展示了Python使用poplib模块实现收取邮件,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。

使用poplib模块收取邮件也很简单,该模块提供了poplib。POP3和poplib。POP3_SSL两个类,分别用于连接普通的流行服务器和基于SSL的流行服务器。

一旦使用poplib。POP3或poplib。POP3_SSL连接到服务器之后,接下来基本就按照POP3协议与服务器进行交互。为了更好地理解poplib模块的运行机制,下面先简单介绍POP3协议内容。

POP3协议也属于请求,响应式交互协议,当客户端连接到服务器之后,客户端向流行服务器发送请求,而流行服务器则对客户端生成响应数据,客户端可通过响应数据下载得到邮件内容。当下载完成后,邮件客户端可以删除或修改任意邮件,而无须与电子邮件服务器进行进一步交互。

POP3的命令和响应数据都是基于ASCII文本的,并以CR和低频(/r/n)作为行结束符,响应数据包括一个表示返回状态的符号(+/)和描述信息。

请求和响应的标准格式如下:

请求标准格式:命令,[参数),CRLF   响应标准格式:+ OK /(错),description  CRLF

POP3协议客户端的命令和服务器端对应的响应数据如下:

用户名:向流行服务器发送登录的用户名。

通过字符串:向流行服务器发送登录的密码。

退出:退出流行服务器。

统计:统计邮件服务器状态,包括邮件数和总大小。

[msg_no]:列表列出全部邮件或指定邮件。返回邮件编号和对应大小。

retr msg_no:获取指定邮件的内容(根据邮件编号来获取,编号从1开始)。

删除msg_no:删除指定邮件(根据邮件编号来删除,编号从1开始)。

等待:空操作。仅用于与服务器保持连接。

资源集:用于撤销削除命令。

poplib模块完全模拟了上面命令,poplib。POP3或poplib。POP3_SSL为上面命令提供了相应的方法,开发者只要依次使用上面命令即可从服务器端下载对应的邮件。

使用poplib收取邮件可分为两步:

使用poplib。POP3或poplib。POP3_SSL按POP3协议从服务器端下载邮件。

使用email.parser。解析器或email.parser。BytesParser解析邮件内容,得到EmailMessage对象,从EmailMessage对象中读取邮件内容。

下面程序示范了如何使用poplib模块来收取邮件:

import  poplib,, os.path, mimetype   得到email.parser  import  BytesParser,解析器   得到email.policy  import 违约      #,输入邮件地址,,口令和POP3服务器地址:   时间=email  & # 39; kongyeeku@qq.com& # 39;   时间=password  & # 39; 123456 & # 39;   时间=pop3_server  & # 39; pop.qq.com& # 39;      #,连接到POP  3服务器:   # conn =, poplib.POP3 (pop3_server, 110)   时间=conn  poplib.POP3_SSL (pop3_server, 995)   #,可以打开或关闭调试信息:   conn.set_debuglevel (1)   #,可选:打印POP  3服务器的欢迎文字:   打印(conn.getwelcome () .decode (& # 39; utf - 8 # 39;))   #,输入用户名:密码信息   #,相当于发送POP  3的用户命令   conn.user(电子邮件)   #,相当于发送POP  3的通过命令   conn.pass_(密码)   #,获取邮件统计信息,相当于发送POP  3的stat命令   message_num, total_size =, conn.stat ()   打印(& # 39;邮件数:,% s只总大小:,% & # 39;,%,(message_num, total_size))   #,获取服务器上的邮件列表,相当于发送POP  3的列表命令   #,resp保存服务器的响应码   #,邮件列表保存每封邮件的编号,大小   分别地,,邮件,,octets =, conn.list ()   打印(职责,邮件)   #,获取指定邮件的内容(此处传入总长度,也就是获取最后一封邮件)   #,相当于发送POP  3的retr命令   #,resp保存服务器的响应码   #,数据保存该邮件的内容   分别地,,数据,octets ,=, conn.retr (len(邮件)   #,将数据的所有数据(原本是一个字节列表)拼接在一起   时间=msg_data  b # 39; \ r \ n # 39; . join(数据)   #,将字符串内容解析成邮件,此处一定要指定政策=违约   时间=msg  BytesParser(政策=默认).parsebytes (msg_data),,,,,,, #①   print(类型(msg))   打印(& # 39;发件人:& # 39;,+,味精(& # 39;从# 39;])   打印(& # 39;收件人:& # 39;,+,味精(& # 39;使# 39;))   打印(& # 39;主题:& # 39;,+,味精(& # 39;主题# 39;])   打印(& # 39;第一个收件人名字:& # 39;,+,味精(& # 39;伍仟# 39;].addresses [0] .username)   打印(& # 39;第一个发件人名字:& # 39;,+,味精(& # 39;从# 39;].addresses [0] .username)   for  part  msg.walk拷贝():   ,,,counter =1   ,,,#,如果maintype是扇形,说明是容器(用于包含正文,附件等)   ,,,if  part.get_content_maintype(),==, & # 39;多部分# 39;,:   ,,,,,,,继续   ,,,#,如果maintype是扇形,说明是邮件正文部分   ,,,elif  part.get_content_maintype(),==, & # 39;文本# 39;:   ,,,,,,,印刷(part.get_content ())   ,,,#,处理附件   ,,,else :   ,,,,,,,#,获取附件的文件名   ,,,,,,,filename =, part.get_filename ()   ,,,,,,,#,如果没有文件名,程序要负责为附件生成文件名   ,,,,,,,if  not 文件名:   ,,,,,,,,,,,#,根据附件的contnet_type来推测它的后缀名   ,,,,,,,,,,,ext =, mimetypes.guess_extension (part.get_content_type ())   ,,,,,,,,,,,#,如果推测不出后缀名   ,,,,,,,,,,,if  not  ext:   ,,,,,,,,,,,,,,,#,使用。斌作为后缀名   ,,,,,,,,,,,,,,,ext =, & # 39;。斌# 39;   ,,,,,,,,,,,#,程序为附件来生成文件名   ,,,,,,,,,,,filename =, & # 39;部分03 - % d % & # 39;, %,(计数器,ext)   null   null   null   null   null   null

Python使用poplib模块实现收取邮件