最小 Python IMAP over TLS 示例

注意: 在某些情况下你可能需要考虑使用 IMAP over SSL。请参见最小 Python IMAP over SSL 示例

此示例代码将登录服务器,启动 TLS 会话,列出邮箱并立即注销。

minimal-python-imap-tls.py
#!/usr/bin/env python3
import imaplib
import ssl

# 加载系统信任的 SSL 证书
tls_context = ssl.create_default_context()

# 连接(首先未加密)
server = imaplib.IMAP4('imap.mydomain.com')
# 启动 TLS 加密。如果无法建立 TLS 会话将失败
server.starttls(ssl_context=tls_context)
# 登录。仅在 server.starttls() 之后执行此操作!!
server.login('email@mydomain.com', 'password')
# 打印服务器上的邮箱列表
code, mailboxes = server.list()
for mailbox in mailboxes:
    print(mailbox.decode("utf-8"))
# 选择邮箱
server.select("INBOX")
# 清理
server.close()

记住替换:

你必须绝对确保先运行 server.starttls(...),然后才执行 server.login(...)。如果不这样做,窃听者可能能够读取你未加密的用户名和密码!

运行此脚本时,成功输出可能如下所示:

imap-mailboxes.txt
(\HasChildren) "." INBOX
(\HasNoChildren) "." INBOX.Spam
(\HasNoChildren) "." INBOX.Drafts
(\HasNoChildren) "." INBOX.Sent
(\HasNoChildren) "." INBOX.Trash

如果你的凭据不起作用,你将看到类似这样的错误消息:

imap-error-auth.txt
Traceback (most recent call last):
  File "./imaptest.py", line 5, in <module>
    server.login('email@domain.com', 'mypassword')
  File "/usr/lib/python3.6/imaplib.py", line 598, in login
    raise self.error(dat[-1])
imaplib.error: b'[AUTHENTICATIONFAILED] Authentication failed.'

注意为了能够 server.close() 连接,需要先 server.select() 一个邮箱;这就是为什么我们不能省略 server.select("INBOX") 行,即使我们实际上没有对邮箱做任何事情。请参见此文章了解此行为的更简洁示例。


Check out similar posts by category: Python