Python 3 邮件的接收(IMAP)

因为前段时间在使用Ubuntu的时候,不想在GUI下接收邮件所以就打算自己写一个在命令行下接收邮件的程序,考虑到开发效率问题所以就直接用Python来写了。
(开发环境是Python3 + Ubuntu16.04 + IMAP协议)
参考资料:
python3 imaplib库的官方文档
python3 email库的官方文档


邮件协议

在开始之前下面我们来认识一下邮件协议(POP3,IMAP,SMTP)

协议 功能
POP3 主要用于客户端远程管理服务器上的邮件
IMAP 交互式邮件访问协议
SMTP 简单邮件传输协议

下面就简单的来说一下各协议的区别,协议的详细内容可以自行查看网络资料,和相关书籍

POP3

POP3协议是Post Office Protocol 3的简称,即邮局协议的第3个版本,是TCP/IP协议族中的一员(默认端口是110)。本协议主要用于支持使用客户端远程管理在服务器上的电子邮件。

IMAP

IMAP全称是Internet Mail Access Protocol,即交互式邮件访问协议,是一个应用层协议(端口是143)。用来从本地邮件客户端(Outlook Express、Foxmail、Mozilla Thunderbird等)访问远程服务器上的邮件。

SMTP

SMTP的全称是“Simple Mail Transfer Protocol”,即简单邮件传输协议(25号端口)。它是一组用于从源地址到目的地址传输邮件的规范,通过它来控制邮件的中转方式。SMTP 协议属于 TCP/IP 协议簇,它帮助每台计算机在发送或中转信件时找到下一个目的地。我们知道SMTP协议简单来说就是一个邮件发送的传输协议(不提供邮件接收功能),而POP3和IMAP这两个协议是邮件的接收(下载)协议。那么POP3和IMAP的区别是什么呢?

POP3和IMAP协议的区别

下面就来说一说这两个协议的主要区别。
虽然这两个协议都是从邮件服务器那里下载邮件到本地的协议,但是不同的是IMAP提供跟邮件服务器的双向通信,也即在客户端所作的更改会反馈给服务器端,跟服务器端形成同步(例如删除邮件,创建文件夹等等的操作)。而POP3是单向通信的,即下载邮件到本地就算了,所作的更改都只是在客户端,不会反映到服务器端。所以使用IMAP协议也会更便捷,体验更好,更可靠。


用Python3开发

因为我本身的开发环境的问题,所以就直接采用python进行开发。

登陆邮箱

用python来开发邮件接收程序非常的简单,主要还是用两个自带的库就可以了,imaplib库和email库。一开始先用import把两个库导入进来。

import imaplib
import email  #导入两个库

conn = imaplib.IMAP4_SSL(port = '***',host = '***')
print('已连接服务器')
conn.login('***@outlook.com','password')
print('已登陆')

上面的代码中port和host可以在网页上登陆服务器然后在邮箱设置里面就能看到邮箱提供的IMAP协议的域名跟端口了。conn.login('账号','密码')用来登陆邮箱(使用平时登陆的账号密码)。完成这两步连接并登陆上邮箱后,就可以进行下一步的相关操作了。

下载邮件

在下载邮件之前我们必须先选择邮箱中的一个文件夹
conn.select()
查看官方文档可以知道这个函数的默认值是’INBOX’,如果之前自己没有改过邮箱的收件夹,一般默认就是INBOX,不用在函数里面填写其他参数。
选完文件夹后使用
type, data = conet.search(None, 'ALL')
搜索匹配的邮件,第一个参数是字符集,None默认就是ASCII编码,第二个参数是查询条件,这里的ALL就是查找全部。该函数返回的是字符数组,我们只需要数组的第一个元素,数组的第一个元素是邮件的编号,并且按接收时间按升序排序并且中间用空格隔开。例如[‘1 2 3 4 5 6 7 8 9 10 ……’],所以现在我们只需把这些用空格隔开的数分离开来放到一个新的数组就OK了,newlist=data[0].split()
然后可以调用fetch()方法来取回邮件,不过取回来的邮件是一堆乱七八糟不知道什么鬼的东西,我们要把我们取回的邮件用email库来进行一些处理。

#如果我们要取回第一封邮件可以把newlist[0]传递给fetch()

type, data = conet.fetch(newlist[0], '(RFC822)')

msg = email.message_from_string(data[0][1].decode('utf-8')) 

#用utf-8解码,否侧会报错

这样我们就把取回来的乱七八糟的东西交给了email库来处理,接下来我们只需要操作email库就好了。

解析邮件

我们把解析的任务交给email库来处理。
我们现在就可以用email库来从邮件中提取出我们需要的信息了,例如标题,邮件的日期,等等有用的信息。
要提取出标题信息我们可以用get()

 sub = msg.get('subject')

 #用get()获取标题并进行初步的解码。

 subdecode = email.header.decode_header(a)[0][0]

  #打印标题
 print(subdecode.decode('utf-8'))

其他的标头信息都可以通过get()来获得。

下面来获取信体部分

 for part in msg.walk():
        # 如果ture的话内容是没用的
        if not part.is_multipart():            
            print(part.get_payload(decode=True).decode('utf-8')) 
            # 解码出文本内容,直接输出来就可以了。

walk()函数能历遍邮件所有部分,所以通常都把它放到for循环里面使用。然后再使用is_multipart()函数来判断内容是否有用,打印出有用内容最后用get_payload(decode=True).decode('utf-8')解码并且打印到控制台。通常这个循环有两次,第一次是单纯的字符串格式的,能在控制台显示出来的,第二次循环打印的是像HTML的格式,能在浏览器里查看,就像平时看到的邮件那样。


好了,邮件的接收就说到这里了。更多的详细情况可以自己去我在开头给的两个连接里面查看。有什么错误也可以在下面给我留言。


Python 3 邮件的接收(IMAP)_第1张图片
喜欢可以加我的个人公众号,扫上面的二维码,或者搜索微信公众号“科学技术工作室”
我会发一些有趣的科学技术文章,喜欢的朋友可以加一下。

你可能感兴趣的:(编程综合)