13.4.4 列出邮箱
要获取一个账户的可用邮箱,可以使用list()方法。
import imaplib
from pprint import pprint
from imaplib_connect import open_connection
with open_connection() as c:
typ,data = c.list()
print('Response code:',typ)
print('Response:')
pprint(data)
返回值是一个tuple,其中包含一个响应码,以及由服务器返回的数据。响应码为OK,除非出现错误。list()的数据是一个字符串序列,其中包含标志、层次结构定界符和每个邮箱的邮箱名。
可以使用re或csv键各个响应串划分为3个部分。
import imaplib
import re
from imaplib_connect import open_connection
list_response_pattern = re.compile(
r'\((?P<flags>.*?)\) "(?P<delimiter>.*)" (?P<name>.*)'
)
def parse_list_response(line):
match = list_response_pattern.match(line.decode('utf-8'))
flags,delimiter,mailbox_name = match.groups()
mailbox_name = mailbox_name.strip('"')
return (flags,delimiter,mailbox_name)
with open_connection() as c:
typ,data = c.list()
print('Response code:',typ)
for line in data:
print('Server response:',line)
flags,delimiter,mailbox_name = parse_list_response(line)
print('Parsed response:',(flags,delimiter,mailbox_name))
如果邮箱名包含空格,那么服务器会对邮箱名加引号,不过以后在对服务器的其他调用中使用邮箱名时需要将这些引号去掉。
list()有一些参数可以指定层次结构中的邮箱。例如,要列出Example中的子文件夹,需要传入"Example"作为directory参数。
import imaplib
from imaplib_connect import open_connection
with open_connection() as c:
trp,data = c.list(directory='Example')
print('Response_code:',typ)
for line in data:
print('Server response:',line)
这会返回父文件夹和子文件夹。
或者,要列出与一个模式匹配的文件夹,需要传入pattern参数。
import imaplib
from imaplib_connect import open_connection
with open_connection() as c:
typ,data = c.list(pattern-'*Example*')
print('Response code:',typ)
for line in data:
print('Server response:',line)
在这种情况下,Example和Example.2016都会包含在响应中。