Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sqlite/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python imaplib和带有空格的文件夹_Python_Sqlite_Imaplib - Fatal编程技术网

Python imaplib和带有空格的文件夹

Python imaplib和带有空格的文件夹,python,sqlite,imaplib,Python,Sqlite,Imaplib,我正在开发一个应用程序,为我整理电子邮件。它登录到IMAP服务器,执行一些搜索,然后将项目复制到文件夹,并将其标记为从收件箱中删除 我的一些文件夹的名称中有空格 POC运行良好,但不是“质量”代码。这些规则被硬编码到一个元组数组中。每个元组都是一个规则,由一个要搜索的字段、一个要搜索的字符串以及匹配的电子邮件应该位于的文件夹组成。所有规则都有效,但可维护性和代码质量。低 第一个post POC版本使用SQLite数据库来存储规则(以及一些与问题无关的其他内容)。当它点击目标文件夹中带有空格的规则

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

我的一些文件夹的名称中有空格

POC运行良好,但不是“质量”代码。这些规则被硬编码到一个元组数组中。每个元组都是一个规则,由一个要搜索的字段、一个要搜索的字符串以及匹配的电子邮件应该位于的文件夹组成。所有规则都有效,但可维护性和代码质量。低

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

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

我从哪里开始解释这个问题呢

编辑以添加一些示例代码:

这是可行的(假设M是一个imaplib.IMAP4实例,并且已连接并登录):

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的评论对我起到了作用

使用空格需要用双引号引用文件夹名称

# 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\"")

是否有任何示例代码?您可能需要转义空格。如果您使用的是imaplib,则需要引用文件夹名称-这对您没有多大帮助。还有一些关于其他角色的特殊规则。您也可以尝试IMAPClient()。它为您解决所有文件夹名称问题。@Windmill,添加了示例代码。我不确定我会在哪里逃离这些空间,但我真正感到困扰的是,我无法解释这两种方法之间的不同行为。@Menno Smits,在哪里引用?在这两种情况下,文件夹名称都是包含在变量中的字符串。我要在变量的内容前加引号吗?如果是这样的话,为什么当它来自数组中的元组时它会工作,而当它来自数据库中的表时它就不工作了呢?为了让其他有这个问题的人明白:你必须用双引号引用文件夹名称,例如,你要使用
“我的文件夹”而不是
“我的文件夹”
# search messages with a specific subject containing spaces
conn.select(mailbox='INBOX', readonly=True)   
typ, msgnums = conn.search(None, 'SUBJECT', "\"Subject with spaces\"")