我正在开发一个应用程序,可以为我整理电子邮件。它登录到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()
@ 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\"")