前言
最近在学习利用python3 imaplib发送,接收和管理邮件中,发现了一些小坑,所以就写了这一篇文章。废话不多说,直接开始。
正文
先简单介绍一下着两个库把,email库和imaplib库
email库
是用来管理邮件消息,对邮件消息的编码和解码处理的(我也不知道用什么词来形容,就暂且用编码解码来描述这两个过程把),他并不能够发送邮件,和查看邮件。他是符合RFC标准的
imap库
通过IMAP协议来管理邮箱用的,称作交互邮件访问协议,具体的一些定义看百度百科
开始
1,我们需要连接和登陆我们的IMAP服务器,连接IMAP服务器有两种连接方式一个使用SSL连接,另一个是普通连接。具体说两个有什么区别呢,我认为SSL更安全一些吧。
SSL连接:
conn=imaplib.IMAP4_SSL(port="993",host="imap.xxx.com")
conn.login("这里填写你的邮箱账号","这里填写你的授权码")
普通连接:
conn=imaplib.IMAP4(port="143",host="imap.xxx.com")
conn.login("这里填写你的邮箱账号","这里填写你的授权码")
注意点
- SSL用的是993端口,普通连接用的是143端口
- 如果你用的是163的服务器,第一次连接会报这样一个错误:command SEARCH illegal in state AUTH, only allowed in states SELECTED
解决办法:打开http://config.mail.163.com/settings/imap/index.jsp?uid=你的邮箱名字@126.com配置一下即可
连接完成了之后我们选择我们的信箱,默认就可以了
conn.select()#这里有两个参数,第一个参数是信箱名,第二个参数是信箱是否可以只读
接下来就开始搜索匹配我们邮箱的内容(第一个参数为None表示编码为默认编码,通过search的第二个参数就型匹配)
typ,data=conn.search(None,'ALL')#返回一个元组,data为此邮箱的所有邮件数据
返回的data是个数组,我们只需要数组的第一个元素,数组的第一个元素是邮件的编号,并且按接收时间按升序排序并且中间用空格隔开。
接下来我们要开始整理并且挨个获取数据
for num in data[0].split():
typ,data=conn.fetch(num,"(RFC822)")#通过邮箱编号和选择获取什么数据
msg=email.message_from_string(data[0][1].decode("utf-8"))#用email库获取解析数据
msgCharset=email.header.decode_header(msg.get('Subject'))[0][1]#获取邮件标题并进行进行解码,通过返回的元组的第一个元素我们得知消息的编码
msg1=email.header.decode_header(msg.get('Subject'))[0][0].decode(msgCharset)#获取标题并通过标题进行解码
print("Message %s\n%s\n"%(num,msg1))#打印输出标题
接下来我们获取邮件的主题内容了
for part in msg.walk():
if not part.is_multipart():
name=part.get_param("name")
if not name:#如果邮件内容不是附件可以打印输出
print(part.get_payload(decode=True).decode(msgCharset))
这一段代码我就不解释了,在参考里面比我解释的更清楚。
参考
https://blog.csdn.net/diyiday/article/details/80907236
https://blog.csdn.net/iteye_13695/article/details/82679570
https://blog.csdn.net/diyiday/article/details/80908708