我正在开发一个应用程序来为我排序电子邮件。它登录到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()
答案 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\"")