imaplib和带空格的文件夹

问题描述 投票:0回答:1

我正在开发一个应用程序,可以为我整理电子邮件。它登录到IMAP服务器,执行一些搜索,然后将项目复制到文件夹并将其标记为从收件箱中删除。

我的某些文件夹名称中带有空格。

POC工作正常,但不是“质量”代码。规则被硬编码到一组元组中。每个元组都是一个规则,包括要搜索的字段,要搜索的字符串以及匹配的电子邮件应位于的文件夹。所有规则均有效,但可维护性和代码质量为。 。 。低。

POC的第一个版本使用SQLite数据库存储规则(以及与该问题不相关的其他内容)。当它命中目标文件夹中带有空格的规则时,最终将COPY命令发送到在该空格处被截断的服务器。我假设它以某种方式给人一种不应该引用它的印象。

烘烤面条的部分是这样的:在两种情况下,规则都是从某个来源分配给变量的。唯一的区别是,在一种情况下,源是数据库。另一方面,它是一个硬编码的数组。

我什至在哪里开始揭开这个?

编辑后添加了一些示例代码:

这有效(假设M是一个imaplib.IMAP4实例,并且它已连接并登录):

rules = [
    ("FROM", "[email protected]", "Vendors/Insurance Company"),
    ("SUBJECT", "[CDLUG]", "Mailing lists/CDLUG")
]

。 。 。

for rule in rules:
    field, value, target = rule
    status, detail = M.search(None, field, value)
    for id in result[0].split():
        status, deatail = M.copy(id, target)
        if (status == "OK"):
            M.store(id, "+FLAGS", "\\Deleted")
    M.expunge()

现在,如果我将这些元组放入sqlite数据库的表中,并更改代码以使其看起来像这样,当它用空格击中文件夹名称时,它将失败:

dbi = sqlite3.connect("/home/pi/.mailsort/mailsort.db")
cursor = dbi.cursor()
cursor.execute("Select field, searchstring, destination from rule")
for result in cursor:
    field, searchstring, destination = result
    print field, searchstring, destination
    status, result = M.search(None, field, searchstring)
    for msgid in result[0].split():
        print "Copying message", msgid
        status, detail = M.copy(msgid, destination)
        if (status == "OK"):
            M.store(id, "+FLAGS", "\\Deleted")
    M.expunge()
python sqlite imaplib
1个回答
0
投票

@ jlh的评论imaplib and folders with spaces为我完成了工作。

使用空格需要用双引号引起来的文件夹名称。

# delete a folder with a space inside    
conn.delete("\"old folder\"")

同样适用于查询包含空格的邮件:

# search messages with a specific subject containing spaces
conn.select(mailbox='INBOX', readonly=True)   
typ, msgnums = conn.search(None, 'SUBJECT', "\"Subject with spaces\"")
© www.soinside.com 2019 - 2024. All rights reserved.