如何使用imaplib创建一个没有\\NoSelect属性的邮箱
我正在尝试在一个 Gmail 的 IMAP 账户中创建目录树。我使用了 imaplib 中的 "create()" 命令,但似乎创建的文件夹会添加一个叫做 \\Noselect 的属性。这会导致 Gmail 的嵌套标签功能出现问题——有没有办法去掉这个 \\Noselect 属性,或者在一开始就避免它被创建呢?
举个例子:
>> imap.create("foo/bar")
('OK', [b'Success'])
>> imap.list()
[b'(\\Noselect \\HasChildren) "/" "foo"', b'(\\HasNoChildren) "/" "foo/bar"',...
2 个回答
2
bjeanes: Sam的解决方案对我有效,只要我不加上最后的层级分隔符。
所以,如果我想创建一个嵌套文件夹 a/b/c,我首先只创建一个普通的 "a" 文件夹。如果我执行一个 xlist 操作,它会显示 "a" 没有子文件夹的标志。接着,我创建 "a/b" 文件夹,这时 xlist 会显示 "a" 有子文件夹的标志,而 "a/b" 仍然没有子文件夹的标志。最后,我创建 "a/b/c" 文件夹,这样 "b" 也会有子文件夹的标志。查看 Gmail 的网页界面也能确认这一点。
Sam: 感谢你找出这个问题并分享解决方案。"Hacky"(小聪明的解决办法)总比"不工作"要好。:^)
4
我找到了一种解决办法——不过不确定这是不是最好的方法。当你在一个命令中创建嵌套邮箱时,最上层的邮箱会自动被标记为\\Noselect。这可能有点不太正规,但你可以通过逐层明确创建每个邮箱来去掉这个标记。
举个例子:
folder = "abc/def/ghi/jkl"
target = ""
for level in folder.split('/'):
target += "{}/".format(level)
imap.create(target)
我会把这个问题保持开放,看看有没有人能提供更好的解决方案。