– IMAP4协议客户端 – 互联网协议和支持(Python教程)(参考资料)
imaplib
– IMAP4协议客户端
源代码: Lib / imaplib.py
这个模块定义了三个类IMAP4
, IMAP4_SSL
和IMAP4_stream
,它封装了与IMAP4服务器的连接,并实现了 RFC 2060 中定义的IMAP4rev1客户端协议的大部分子集。它向后兼容IMAP4( RFC 1730 )服务器,但是IMAP4不支持STATUS
命令.
三个类由imaplib
模块提供,IMAP4
是基类:
- class
imaplib.
IMAP4
(host=””, port=IMAP4_PORT) -
该类实现了实际的IMAP4协议。创建连接并在实例初始化时确定协议版本(IMAP4或IMAP4rev1)。如果没有指定host,
""
(使用本地主机)。如果port省略,使用标准的IMAP4端口(143).IMAP4
班级支持with
声明。像这样使用时,IMAP4LOGOUT
当with
语句退出时,命令自动发出。例如:>>> from imaplib import IMAP4>>> with IMAP4("domain.org") as M:... M.noop()...("OK", [b"Nothing Accomplished. d25if65hy903weo.87"])
在版本3.5中更改:添加了对
with
声明的支持.
三个异常被定义为IMAP4
class的属性:
- exception
IMAP4.
error
-
在任何错误上引发异常。异常的原因作为字符串传递给构造函数.
- exception
IMAP4.
abort
-
IMAP4服务器错误导致引发此异常。这是
IMAP4.error
的子类。请注意,关闭实例并实例化新的实例通常会允许从此异常中恢复.
- exception
IMAP4.
readonly
-
当可写邮箱的状态由服务器更改时,会引发此异常。这是
IMAP4.error
。其他一些客户端现在具有写权限,需要重新打开邮箱才能重新获得writepermission .
还有一个用于安全连接的子类:
- class
imaplib.
IMAP4_SSL
(host=””, port=IMAP4_SSL_PORT, keyfile=None, certfile=None, ssl_context=None) -
这是从
IMAP4
派生的子类,它通过SSL加密套接字连接(要使用此类,您需要一个使用SSL支持编译的套接字模块)。如果没有指定host,""
(本地主机)被使用。如果省略port,则使用标准的IMAP4-over-SSL端口(993).ssl_context是ssl.SSLContext
允许将SLSL配置选项,证书和私钥捆绑到单个(可能是长期存在的)结构中的对象。请阅读安全考虑最好的做法.keyfile和certfile是ssl_context的遗留替代品 – 他们可以指向SSL连接的PEM格式的私钥和证书链文件。注意keyfile/certfile参数与具有互补性ssl_context, 一个
ValueError
被提升keyfile/certfile随提供ssl_context.改版3.3:ssl_context参数添加了
版本3.4更改:该类现在支持使用
ssl.SSLContext.check_hostname
和Server Name Indication进行主机名检查(参见ssl.HAS_SNI
).自版本3.6以后不推荐使用:keyfile和certfile被弃用赞成ssl_context。请改用
ssl.SSLContext.load_cert_chain()
,或者让ssl.create_default_context()
为你选择系统的可信CAcertificates
第二个子类允许子进程创建的连接:
- class
imaplib.
IMAP4_stream
(command) -
这是一个子类源自
IMAP4
连接到stdin/stdout
通过传递command到subprocess.Popen()
.
创建的文件描述符定义了以下实用函数:
imaplib.
Internaldate2tuple
(datestr)-
解析IMAP4
INTERNALDATE
字符串并返回相应的localtime。返回值为time.struct_time
元组或None
如果字符串格式错误.
imaplib.
Int2AP
(num)-
将整数转换为一个字符串表示使用集合中的字符[
A
..P
].
imaplib.
ParseFlags
(flagstr)-
转换IMAP4
FLAGS
响应一个元组个别旗帜
imaplib.
Time2Internaldate
// (date_time)-
转换date_time到IMAP4
INTERNALDATE
表示。返回值是一个字符串form:"DD-Mmm-YYYY HH:MM:SS+HHMM"
(包括双引号)。date_time参数可以是一个数字(int或float),表示自纪元以来的秒数(由time.time()
返回),一个代表time.struct_time
的本地时间实例的9元组(由time.localtime()
),一个知道datetime.datetime
的实例,或一个双引号的字符串。在最后一种情况下,假设格式正确.
注意IMAP4消息号随邮箱的变化而变化;特别是在EXPUNGE
命令执行删除剩余的消息已编号。因此,建议使用UID代替UID命令.
在模块的最后,有一个测试部分,其中包含更广泛的使用示例.
参见
描述协议的文档,以及实现它的服务器的来源和二进制文件,都可以在华盛顿大学找到IMAPInformation Center(https://www.washington.edu/imap/)
IMAP4对象
所有IMAP4rev1命令都由同名的方法表示,无论是大写还是小写.
命令的所有参数都转换为字符串,除了AUTHENTICATE
,以及APPEND
它作为IMAP4文字传递。如果必要(字符串包含IMAP4协议敏感字符,并且没有括号或双引号),则引用每个字符串。但是,password对LOGIN
命令总是引用。如果你想避免引用参数字符串(例如:flags参数STORE
)然后将字符串括在括号中(例如:r"(\Deleted)"
).
每个命令都返回一个元组:(type, [data, ...])
其中type通常是"OK"
或"NO"
,而data是来自命令响应的文本,或来自命令的强制结果。每个data都是一个字符串,或者是一个元组。如果是一个元组,那么第一部分是响应的标题,第二部分包含数据(即:’literal’值).
message_set以下命令的选项是一个字符串指定一个或多个要采取行动的消息。它可以是一个简单的消息号("1"
),一个消息号范围("2:4"
),或一组由逗号("1:3,6:9"
)分隔的非连续范围。一个范围可以包含一个星号来表示一个无限上限("3:*"
).
一个IMAP4
实例有以下几种方法:
IMAP4.
append
(mailbox, flags, date_time, message)-
将message附加到命名邮箱.
IMAP4.
authenticate
(mechanism, authobject)-
Authenticate命令 – 需要响应处理.
mechanism指定要使用的认证机制 – 它应该出现在实例变量
capabilities
中,形式为AUTH=mechanism
.authobject必须是可调用的对象:
data = authobject(response)
它将被调用以处理服务器继续响应;它被传递的response参数将是
bytes
。它应该返回bytes
data将进行base64编码并发送到服务器。它应该返回None
如果客户端中止响应*
应该发送更改版本3.5:字符串用户名和密码现在编码为
utf-8
而不是限制为ASCII.
IMAP4.
create
(mailbox的末尾)-
创建名为mailbox.
IMAP4.
delete
(mailbox)的新邮箱-
删除名为mailbox.
IMAP4.
deleteacl
(mailbox, who)的旧邮箱-
删除为邮箱上的人设置的ACL(删除任何权限)
IMAP4.
enable
(capability)-
启用capability(见RFC 5161 )。大多数功能都不需要被启用。目前只支持
UTF8=ACCEPT
功能(参见 RFC 6855 ).版本3.5中的新功能:
enable()
方法本身,和 RFC 6855 support.
IMAP4.
expunge
()-
永久删除所选邮箱中已删除的项目。生成
EXPUNGE
每个已删除邮件的响应。返回的数据包含EXPUNGE
消息号码按顺序收到.
IMAP4.
fetch
(message_set, message_parts)-
获取(部分)消息。message_parts应该是括在括号内的一串消息部分名称,例如:
"(UID BODY[TEXT])"
。返回的数据是消息部分信封和数据的元组.
IMAP4.
getacl
(mailbox)-
获取
ACL
s mailbox。该方法是非标准的,但是由Cyrus
服务器支持
IMAP4.
getannotation
// (mailbox, entry, attribute)-
检索指定的
ANNOTATION
smailbox。该方法是非标准的,但是由Cyrus
server.
IMAP4.
getquota
(root)-
得到
quota
root的资源使用和限制。此方法是rfc2087中定义的IMAP4 QUOTA扩展的一部分.
IMAP4.
getquotaroot
(mailbox)-
获取
quota
roots
为了命名mailbox。此方法是rfc 2087中定义的IMAP4 QUOTA扩展的一部分.
IMAP4.
list
( [directory [, pattern]])-
列出directory中的邮箱名称匹配pattern. directory默认为顶级邮件文件夹,而pattern默认为匹配任何内容。Returneddata包含
LIST
的列表
IMAP4.
login
//(user, password)-
使用明文密码识别客户端。password将被引用.
IMAP4.
login_cram_md5
(user, password)-
强行使用
CRAM-MD5
识别客户端以保护密码时的身份验证。只有服务器CAPABILITY
回复包括词语AUTH=CRAM-MD5
.
IMAP4.
logout
()-
关闭与服务器的连接。返回服务器
BYE
response.
IMAP4.
lsub
(directory=””””, pattern=”*”)-
列出目录匹配模式中的订阅邮箱名称。directory默认为顶级目录和pattern默认匹配任何邮箱。返回的数据是邮件部分信封和数据的元组.
IMAP4.
myrights
(mailbox)-
显示我的邮箱的ACL(即我拥有的权利)在邮箱上。)
IMAP4.
namespace
()-
返回RFC 2342 .
IMAP4.
noop
()-
发送
NOOP
到服务器
IMAP4.
open
(host, port)-
打开插座port在 host。这个方法被含蓄地调用
IMAP4
构造函数。由thismethod建立的连接对象将用于IMAP4.read()
,IMAP4.readline()
,IMAP4.send()
和IMAP4.shutdown()
方法。你可以改写这种方法.
IMAP4.
proxyauth
(user)-
认证为user。允许授权管理员代理任何用户的邮箱.
IMAP4.
read
(size)-
从远程服务器读取size字节。您可以覆盖此方法.
IMAP4.
readline
( )-
从远程服务器读取一行。您可以覆盖此方法.
IMAP4.
recent
()-
提示服务器进行更新。如果没有新消息则返回数据
None
,否则RECENT
响应
IMAP4.
rename
//(oldmailbox, newmailbox)-
将名为oldmailbox的邮箱重命名为newmailbox.
IMAP4.
response
(code)-
如果收到回复数据code,要么
None
。返回给定的代码,而不是通常的类型.
IMAP4.
search
(charset, criterion [, …])-
搜索邮箱以查找匹配的邮件charset可能是
None
,在哪个赌场CHARSET
将在对服务器的请求中指定。IMAP协议要求至少指定一个标准;服务器返回错误时将发生异常。charset 一定是None
如果UTF8=ACCEPT
使用enable()
命令。例:
# M is a connected IMAP4 instance...typ, msgnums = M.search(None, "FROM", ""LDJ"")# or:typ, msgnums = M.search(None, "(FROM "LDJ")")
IMAP4.
select
(mailbox=”INBOX”, readonly=False)-
选择一个邮箱。返回的数据是mailbox(
EXISTS
响应)。默认mailbox是"INBOX"
。如果设置了readonly标志,则不允许修改邮箱.
IMAP4.
setacl
(mailbox, who, what)-
设置
ACL
对于mailbox。该方法是非标准的,但由Cyrus
服务器支持
IMAP4.
setannotation
(mailbox, entry, attribute [, …])-
为
ANNOTATION
设置mailbox s。该方法是非标准的,但由Cyrus
server.
IMAP4.
setquota
(root, limits)-
设置
quota
root的资源支持limits。这个方法是rfc2087中定义的IMAP4QUOTA扩展的一部分.
IMAP4.
shutdown
()-
在
open
中建立的关闭连接。这个方法由IMAP4.logout()
隐式调用。您可以覆盖此方法.
IMAP4.
socket
()-
Returns socket实例用于连接服务器.
IMAP4.
sort
(sort_criteria, charset, search_criterion [, …] )-
sort
命令是search
的变种,具有结果的排序语义。返回的数据包含一个空格分隔的匹配messagenumbers列表.Sort在search_criterion参数之前有两个参数;sort_criteria的隐藏列表,以及搜索charset。注意,不喜欢
search
,搜索charset参数是强制性的。还有uid sort
命令对应sort
uid search
对应的方式search
。sort
命令首先使用charset参数在邮箱中搜索与给定搜索条件匹配的消息,以解释搜索条件中的字符串。然后返回匹配消息的数量.这是个
IMAP4rev1
扩展命令.
IMAP4.
starttls
(ssl_context=None)-
寄一个
STARTTLS
命令。ssl_context论证是选择,应该是ssl.SSLContext
宾语。这将启用IMAP连接的加密。请阅读安全考虑最好的做法.新版本3.2.
更改版本3.4:该方法现在用
ssl.SSLContext.check_hostname
和Server Name Indication支持主机名检查(见ssl.HAS_SNI
).
IMAP4.
status
(mailbox, names)-
请求mailbox.
IMAP4.
store
(message_set, command, flag_list)-
的命名状态条件更改邮箱中邮件的标记处置。command由 RFC 2060 的第6.4.6节规定为“FLAGS”,“+ FLAGS”或“-FLAGS”之一,可选地后缀为“.SILENT”。
例如,在所有消息上设置删除标志:
typ, data = M.search(None, "ALL")for num in data[0].split(): M.store(num, "+FLAGS", "\\Deleted")M.expunge()
IMAP4.
thread
(threading_algorithm, charset, search_criterion [, …])-
thread
命令是search
结果的线程语义。返回的数据包含一个空格分隔的线程成员列表.线程成员由零个或多个消息号组成,由空格分隔,表示连续的父和子.
在search_criterion参数之前有两个参数;一个threading_algorithm和搜索charset。请注意,与
search
不同,搜索charset参数是必需的。还有uid thread
命令对应thread
uidsearch
对应search
。thread
命令首先使用charsetargument在邮箱中搜索与给定搜索条件匹配的邮件,以便在搜索条件中解释字符串。然后根据指定的线程算法返回匹配的消息.这是
IMAP4rev1
扩展命令.
IMAP4.
uid
(command, arg [, …])-
使用UID标识的消息执行命令args,而不是messagenumber。返回适合命令的响应。必须提供至少一个论点;如果没有提供,服务器将返回错误并将引发异常.
IMAP4.
xatom
(name [, …])-
允许服务器通知的简单扩展命令
CAPABILITY
response.
在IMAP4
:
IMAP4.
PROTOCOL_VERSION
-
中最新支持的协议
CAPABILITY
来自服务器的回复.
IMAP4.
debug
-
用于控制调试输出的整数值。初始化值取自模块变量
Debug
。大于三的值跟踪每个命令.
IMAP4.
utf8_enabled
-
布尔值通常是
False
,但是设置为True
如果enable()
命令成功发出UTF8=ACCEPT
能力新版本3.5.
IMAP4示例
这是一个最小的例子(没有错误检查)打开邮箱并检索并打印所有邮件:
import getpass, imaplibM = imaplib.IMAP4()M.login(getpass.getuser(), getpass.getpass())M.select()typ, data = M.search(None, "ALL")for num in data[0].split(): typ, data = M.fetch(num, "(RFC822)") print("Message %s\n%s\n" % (num, data[0][1]))M.close()M.logout()
评论被关闭。