imaplib和带空格的文件夹

时间:2017-05-03 01:03:42

标签: python sqlite imaplib

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

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

POC运行良好,但不是“质量”代码。规则被硬编码成一组元组。每个元组都是一个规则,包括要搜索的字段,要搜索的字符串以及匹配的电子邮件应该最终进入的文件夹。所有规则都有效,但可维护性和代码质量都是。 。 。低。

第一个后POC版本使用SQLite数据库来存储规则(以及其他一些与问题无关的事情)。当它命中目标文件夹中带有空格的规则时,它最终会将COPY命令发送到在该空格处截断的服务器。我假设它不知何故给人的印象是它不应该引用它。

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

我在哪里开始解开这个?

编辑添加一些示例代码:

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

rules = [
    ("FROM", "agent@insurancecompany.com", "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()

1 个答案:

答案 0 :(得分: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\"")