【问题标题】:Some emails use / and some emails use . when listing the subfolders, how to account for this?一些电子邮件使用 / 和一些电子邮件使用 .列出子文件夹时,如何解决这个问题?
【发布时间】:2022-06-14 12:04:10
【问题描述】:

我正在制作一个在 Google 表格中记录电子邮件收据的脚本,它允许用户登录到他们选择的电子邮件,然后提示他们输入他们希望脚本运行的邮箱文件夹。

问题是,如果您使用 IMAP4.list() 您会注意到一些电子邮件服务会列出他们的文件夹,例如 收件箱.文件夹 而其他人将其列为 收件箱/文件夹

我尝试让代码搜索 IMAP4.list() 以确定服务器是否正在使用 .或 /

我尝试过尝试,但如果 IMAP4.select() 失败,它不会移动到 except,如果我通过并进行两次尝试,除非它只是使用后一个。

我觉得https://docs.python.org/3/library/imaplib.html 上没有足够的信息来帮助我了解是否有可以用来缩小搜索范围的参数

【问题讨论】:

  • IMAP 服务器报告分隔符是什么,例如* LIST (\Noselect) "/" INBOX/folder。我希望 imaplib 以某种方式将其传递给您,但不知道如何。

标签: python email imap


【解决方案1】:

层次分隔符包含在LIST 响应中。参见例如the RFC,显示 IMAP 服务器响应如下:

* LIST (\Noselect) "/" ~/Mail/foo

响应的第二个字段 ("/") 是层次分隔符。

在 Python 中,调用 list 方法可以有效地为您提供原始 IMAP 响应。回想一下 list 返回一个 (status, data) 元组,所以:

>>> res = server.list()
>>> res[0]
'OK'
>>> len(res[1])
83

如果我们在回复中使用邮箱:

>>> res[1][0]
b'(\\HasNoChildren) "/" "INBOX"'

我们在预期的位置找到邮箱分隔符。

解析出来需要一些工作; imaplib 没有提供任何解析 IMAP 响应的工具(至少,我上次没有看到它),所以你必须弄清楚如何提取该值。

【讨论】:

    【解决方案2】:
    from imap_tools import MailBox
    
    with MailBox('imap.mail.com').login('test@mail.com', 'pwd') as mailbox:
        for f in mailbox.folder.list('INBOX'):
            print(f)  
            # FolderInfo(name='INBOX|cats', delim='|', flags=('\\Unmarked', '\\HasChildren'))
    

    输出:

    FolderInfo(name='Archive', delim='/', flags=('\\Archive', '\\HasNoChildren'))
    FolderInfo(name='Bulk', delim='/', flags=('\\Junk', '\\HasNoChildren'))
    FolderInfo(name='Draft', delim='/', flags=('\\Drafts', '\\HasNoChildren'))
    FolderInfo(name='Inbox', delim='/', flags=('\\HasNoChildren',))
    FolderInfo(name='Sent', delim='/', flags=('\\Sent', '\\HasNoChildren'))
    FolderInfo(name='Trash', delim='/', flags=('\\Trash', '\\HasNoChildren'))
    FolderInfo(name='test', delim='/', flags=('\\HasChildren',))
    FolderInfo(name='test/base', delim='/', flags=('\\HasNoChildren',))
    FolderInfo(name='test/temp1', delim='/', flags=('\\HasNoChildren',))
    FolderInfo(name='test/temp2', delim='/', flags=('\\HasNoChildren',))
    

    扩展库:https://pypi.org/project/imap-tools/

    我是作者

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-06-09
      • 1970-01-01
      • 2012-05-03
      • 2017-10-10
      • 1970-01-01
      相关资源
      最近更新 更多