代码之家  ›  专栏  ›  技术社区  ›  Rishik Mani

如何从IMAP服务器中选择特定邮箱?

  •  0
  • Rishik Mani  · 技术社区  · 6 年前

    我的IMAP服务器上有以下邮箱(请参阅随附的屏幕截图)。 enter image description here

    我只想选择邮箱文件夹1并检查是否有任何子目录。我已经尝试了以下代码:

    svr = imaplib.IMAP4_SSL(imap_address)
    svr.login(user, pwd)
    svr.select('inbox') <<<<<<<<<<<<<<<<<
    rv, data = svr.search(None, "ALL")
    test, folders = svr.list('""', '*')
    print(folders)
    

    我认为将“收件箱”更改为“folder1”(用箭头指示的语句)将选择folder1,然后我可以检索子目录。但什么都没发生,结果仍然与“收件箱”相同。

    有人能帮我理解我做错了什么吗。

    1 回复  |  直到 6 年前
        1
  •  1
  •   Rishik Mani    6 年前

    由于我不知道文件夹的名称,我尝试了另一种方法。我首先收集根目录中的所有文件夹,然后逐个解析它们,以检查是否存在任何子目录。

    root_folders = []
    svr = imaplib.IMAP4_SSL(imap_address)
    svr.login(user, pwd)
    svr.select('inbox')
    response, folders = svr.list('""', '*')
    
    def parse_mailbox(data):
        flags, b, c = data.partition(' ')
        separator, b, name = c.partition(' ')
        return flags, separator.replace('"', ''), name.replace('"', '')
    
    def subdirectory(folder):
        #For directories 'Deleted Items', 'Sent Items', etc. with whitespaces,
        #the name of the directory needs to be passed with double quotes, hence '"' + name + '"'
        test, folders = obj.list('""','"' + name+ '/*"')
        if(folders is not None):
            print('Subdirectory exists') # you can also call parse_mailbox to find the name of sub-directory
    
    for mbox in folders:
        flags, separator, name = parse_mailbox(bytes.decode(mbox))
        fmt = '{0}    : [Flags = {1}; Separator = {2}'
        if len(name.split('/')) > 1:
            continue
        else:
            root_folders.append(name)
    
    for folder in root_folders:
        subdirectory(folder)
    

    虽然这是我脚本中定制的代码,但这应该是提出的问题的解决方案。