Python Imaplib搜索在将一些邮件移动到垃圾箱后返回错误的UID

Python Imaplib搜索在将一些邮件移动到垃圾箱后返回错误的UID,python,email,gmail,imap,imaplib,Python,Email,Gmail,Imap,Imaplib,我正在尝试使用imaplib获取gmail帐户中收件箱文件夹的所有UID(出于测试目的,该帐户是新的)。起初它工作得很好(即,当我只向帐户发送邮件时),但在将一些邮件移动到垃圾箱后,我的代码现在返回了错误数量的UID(8封,收件箱文件夹中有7封电子邮件),同时也丢失了一个UID con = imaplib.IMAP4_SSL(imap_server, imap_port) con.login(user, password) con.select("INBOX") result, numbers

我正在尝试使用imaplib获取gmail帐户中收件箱文件夹的所有UID(出于测试目的,该帐户是新的)。起初它工作得很好(即,当我只向帐户发送邮件时),但在将一些邮件移动到垃圾箱后,我的代码现在返回了错误数量的UID(8封,收件箱文件夹中有7封电子邮件),同时也丢失了一个UID

con = imaplib.IMAP4_SSL(imap_server, imap_port)
con.login(user, password)
con.select("INBOX")
result, numbers = con.uid('search', None, 'ALL')
uids = numbers[0].split()
在我的具体案例中,打印“UID”会给出以下列表

[b'1', b'3', b'4', b'7', b'8', b'9', b'10', b'11']
通过编写列表
[b'1',b'2'…,b'11']
并获取电子邮件主题,手动检查邮件,我发现以下UID有独特的邮件:

[b'1', b'2' OR b'3', b'4', b'5', b'6', b'7', ONE OF b'8' to b'11']
b'1'
b'2'
返回相同的邮件,
b'6'
丢失,
b'8'
通过
b'11
返回相同的邮件

在问这个问题之前,我在这里搜索了一下,发现了这个问题:。答案中有一段代码,用于获取文件夹中所有邮件的id:

resp, items = m.search(None, "ALL") # you could filter using the IMAP rules here (check http://www.example-code.com/csharp/imap-search-critera.asp)
items = items[0].split() # getting the mails id
与我的代码类似,只是不使用
uid
方法。然而,在我的例子中,这就列出了:

[b'1', b'2', b'3', b'4', b'5', b'6', b'7', b'8']
所以也不正确。我找到的另一个答案是:

似乎
M.uid
只是指定返回值为uid,因此仍然需要指定发送的参数为uid,而不是消息ID。这就解决了这个问题:

在评论中:

rv, data = M.uid("search", None, '(UID 29540:*)')
但两者都为我返回了一个错误:
UID命令错误:错误[b'无法解析命令]


我做错了什么,和/或有更好的方法吗?

您是否检查了这些“额外”消息的标志?它们可能被标记为
\Deleted
,这通常意味着您应该忽略它们。目前的问题并不能真正说明为什么您认为UID是错误的,也没有显示获取手动UID列表的代码。如果将uid与
fetch
(而不是uid fetch)混合使用,您将得到非常混乱的结果。现在我可以回答评论的第二部分(我对IMAP非常陌生,必须了解如何获取标志):我没有使用任何代码生成手动uid列表,我只是键入了它(我想不出更好的方法来检查搜索是否缺少uid,或者它是否是程序中其他地方的问题,至少它帮助隔离了问题)我认为您可以只使用con.uid('search','ALL')。与con.search()不同,此命令不接受charset参数版本。由于额外的“无”,您可能实际上正在发送UID SEARCH NIL ALL或UID SEARCH“”ALL。通过将连接对象上的“设置.调试”设置为相当大的值来打开协议日志记录,可能有助于您查看发送的内容。我尝试使用con.UID('SEARCH','ALL')),但它返回的值与字符集
None
的值相同。我不确定什么是一个相当大的值。debug,但从docs values>3跟踪所有命令,因此我使用了4。从调试输出来看,命令似乎成功(即在收件箱中搜索“all”),但它们仍然返回错误的值。我会发布调试输出,但您似乎无法格式化注释,而且我也不确定它是否位于正确的位置。我对堆栈溢出和编程都是新手,因此如果您对如何前进有建议,我将不胜感激。请使用尽可能多的信息更新问题,并提供您的建议精确的代码比提供问题更有用。
rv, data = M.uid("search", None, '(UID 29540:*)')