信息访问协议
SMTP 是用于发送电子邮件的协议,而 IMAP 指定如何与电子邮件服务提供商的服务器通信以检索发送到您的电子邮件地址的电子邮件。
有了模块,就有第三方模块
import imapclient
#创建一个IMAPClient对象,大多数邮件提供商要求SSL加密,传入ssl = True关键字参数
imapObj = imapclient.IMAPClient('imap.qq.com',ssl = True)
#取得IMAPClient后,调用login()方法,传入用户名和密码字符串
imapObj.login('111111@qq.com','password')
搜索消息:
1. 选择要搜索的文件夹;2. 必须调用对象的 () 方法并传入 IMAP 搜索关键字字符串
选择文件夹:几乎每个帐户默认都有一个INBOX文件夹,但您也可以调用对象的()方法来获取文件夹列表。
() 方法返回一个元组列表,每个元组包含一个文件夹信息
import pprint
pprint.pprit(imapObj.list_folders())
#要选择一个文件夹进行搜索,就调用select_folder()方法,传入该文件夹的名称字符串
imapObj.select_folder('INBOX',readonly = True)
当搜索的文件夹不存在时,可以忽略()的返回值,抛出imap.error异常
= True 关键字参数可防止您在后续方法调用中意外更改或删除该文件夹中的任何电子邮件
执行搜索:一旦选择了文件夹,您就可以调用对象的()方法来搜索电子邮件。
() 方法的参数是一个字符串列表,每个字符串都被格式化为 IMAP 搜索键。
IMAP 搜索关键字:
“ALL”:返回文件夹中的所有邮件。如果您请求大型文件夹中的所有邮件,可能会遇到大小限制。
'/ON/SINCE date':返回 IMAP 服务器在指定日期之前、当天和之后收到的邮件。日期格式必须为 05-Jul-2017
此外,虽然“SINCE 05-Jul-2017”将匹配 7 月 5 日及之后的消息,但“05-Jul-2017”仅匹配 7 月 5 日之前(不包括 7 月 5 日)的消息。
'/BODY/TEXT':返回分别出现在主题、正文或主题或正文中的消息。如果有空格,请使用双引号。
“FROM/TO/CC/BCC”:返回所有出现“发件人”电子邮件地址、“收件人”电子邮件地址、“抄送”(抄送)地址或“密件抄送”(密件抄送)地址的消息。
如果有多个电子邮件地址,请用空格分隔并使用双引号。
'SEEN/':返回所有带有和不带有 \Seen 标签的消息。如果电子邮件已通过 fetch() 方法调用访问,或者您已在电子邮件程序或 Web 浏览器中单击过它,
会有一个“已读”的标记,而且更常用的词是“已读”而不是“已读”
'/':返回所有带 \ 标记和不带 \ 标记的消息。如果该消息已被回复,则会带有 \ 标记。
'/':返回所有带有和不带有 \ 标记的消息。使用 () 方法删除的消息将带有 \ 标记,直到调用 () 方法为止。
将被永久删除
“DRAFT/”:返回所有带有和不带有 \Draft 标签的邮件。草稿邮件通常保存在单独的草稿文件夹中,而不是收件箱中。
'/':返回所有带有和不带有 \ 标签的消息,该标签通常用于将电子邮件标记为“重要”或“紧急”
'/N': 分别返回大于或小于N字节的所有信息
'NOT -key':返回搜索键不会返回的信息
'OR -key1 -key2':返回与第一个或第二个搜索键匹配的信息
imapObj.search(['all'])
imapObj.search(['ON 05-Jul-2017'])
imapObj.search(['SINCE 01-Jul-2017','BEFORE 05-Jul-2017'])
imapObj.search(['OR FROM alie@qq.com FROM habo@qq.com'])
#search不返回电子邮件本身,而是返回邮件的唯一整数ID(UID),然后可以将这些UID传入fetch(),获得邮件内容
UIDS = []
UIDS = imapObj.search(['all'])
大小限制:
如果搜索匹配了大量的电子邮件,可能会抛出 imap.error: got more than 10000 bytes 异常,您必须断开连接并重新连接到 IMAP 服务器。
字节限制可以调整
import imaplib
imaplib._MAXLINE = 10000000
检索电子邮件并将其标记为已读
一旦您有了 UID 列表,您就可以调用对象的 fetch() 方法来获取实际的电子邮件内容。
UID 列表是 fetch() 函数的第一个参数。第二个参数应该是 ['BODY[]'],它告诉 fetch() 下载 UID 列表中指定的电子邮件的所有内容。
rawMessages = imapObj.fetch(UIDS,['BODY[]'])
pprint.pprint(rawMessages)
打印结果:
返回值是一个嵌套的消息字典,以 UID 为键。每条消息也保存为一个字典,包含两个键 'BODY[]' 和 'SEQ'
'BODY[]' 映射到电子邮件的实际正文;'SEQ' 键是序列号
如:{UID: {'BODY[]':邮件正文内容,'SEQ':序列号}}
'BODY[]' 键中的消息内容相当难以理解。此格式称为 ,旨在由 IMAP 服务器读取,然后由模块解析
如果选择要搜索的文件夹,则需要使用关键字 = True 参数调用 ()。这将防止意外删除电子邮件。
但这也意味着当你使用 fetch() 方法检索电子邮件内容时,它们不会被标记为已读
如果确实需要在获取文件夹时将其标记为已读,可以将 =False 传递给()方法,即选定的文件夹处于只读模式。
imapObj.select_folder('INBOX',readonly = False)
从原始邮件中获取电子邮件地址
该模块解析原始信息并返回一个包含邮件正文,主题,收件人,发件人等字段信息的对象。
#导入pyzmail模块后,调用pyzmail.PeekMessage.factory()函数,创建一个PyzMessage对象
import pyzmail
messageObj = pyzmail.PeekMessage.factory(rawMessages[40041]['BODY[]'])
() 方法将主题作为简单字符串返回,而 () 返回传递的字段的地址元组列表(参数为“from”、“to”、“cc”、“bcc”)。
每个元组包含两个字符串,第一个是与电子邮件地址关联的名称,第二个是电子邮件地址本身。如果请求的字段中没有地址,则返回空列表。
messageObj.get_subject()
messageObj.get_addresses('from')
messageObj.get_addresses('to')
messageObj.get_addresses('cc')
messageObj.get_addresses('bcc')
获取原始邮件的正文
电子邮件可以是纯文本、HTML 或两者的混合
纯文本电子邮件仅包含文本,而 HTML 电子邮件可以具有颜色、字体、图像和其他功能。
如果电子邮件是纯文本,则该对象会将该属性设置为 None。同样,当电子邮件仅为 HTML 时,该对象会将该属性设置为 None。
否则,将会有一个 () 方法将电子邮件正文作为字节数据类型返回,但这仍然不是我们可以使用的字符串,
最后一步是针对 () 返回的字节值调用 () 方法。 () 方法接受一个参数:消息的字符编码,存储在 中。或
.在属性中
if messageObj.text_part != None:
messageConten = messageObj.text_part.get_payload().decode(text_part.charset)
pprint.pprint(messageConten)
elif messageObj.html_part != None:
messageConten = messageObj.html_part.get_payload().decode(html_part.charset)
pprint.pprint(messageConten)
else:
pass
删除电子邮件
要删除电子邮件,您需要将消息 UID 列表传递给对象的 () 方法,该方法会在电子邮件中添加 \ 标记。
调用 () 方法将永久删除当前选定文件夹中所有标有 \ 的电子邮件。
imapObj.select_folder('INBOX',readonly = False)
UIDs = imapObj.search('ON 09-Jul-2017')
imapObj.delete_messages(UIDs)
imapObj.expunge()
断开与 IMAP 服务器的连接
#调用对象的()方法
imapObj.logout()
扫一扫在手机端查看
-
Tags : imapclient search
我们凭借多年的网站建设经验,坚持以“帮助中小企业实现网络营销化”为宗旨,累计为4000多家客户提供品质建站服务,得到了客户的一致好评。如果您有网站建设、网站改版、域名注册、主机空间、手机网站建设、网站备案等方面的需求,请立即点击咨询我们或拨打咨询热线: 13761152229,我们会详细为你一一解答你心中的疑难。