我无法使用 Python 在 Gmail 中搜索已发送的电子邮件

Posted

技术标签:

【中文标题】我无法使用 Python 在 Gmail 中搜索已发送的电子邮件【英文标题】:I cannot search sent emails in Gmail with Python 【发布时间】:2011-03-17 02:01:41 【问题描述】:

我正在尝试在已发送消息中搜索消息(实际上我都关心),但我只收到传入消息。 暂时我有

imap_conn.select()
str_after = after.strftime('%d-%b-%Y')
typ, msg_ids = imap_conn.search('UTF-8','SINCE',str_after)

这给出了相同的结果

imap_conn.select('INBOX')

当我用 ALL 或 SENT 替换 INBOX 时,我得到: 命令 SEARCH 在 AUTH 状态下非法,仅在 SELECTED 状态下允许

【问题讨论】:

【参考方案1】:
import imaplib
obj = imaplib.IMAP4_SSL('imap.gmail.com',993)
obj.login('userid','password')
obj.select('Sent')  # <-- response like ('OK', ['74']) --> total no. of mail in sent folder
obj.uid('SEARCH',None,'All') # <-- Returns the list of uids of the sent folder.

【讨论】:

它在 Gmail 上对我不起作用,所以我使用了:imap_conn.select('[Gmail]/Sent Mail') 'Sent' 从 'Imap/Sent' 文件夹而不是从 'Gmail/Sent Mail' 文件夹中选择邮件。如果您在 Thunderbird 中配置您的 gmail 帐户,那么它将自动创建“Imap/Sent”文件夹以将已发送邮件的副本放置到该文件夹​​中。如果您想从“Gmail/Sent Mail”文件夹中选择邮件,那么您的代码就可以了。【参考方案2】:

你需要使用:imap_conn.select('[Gmail]/Sent Mail')

只是想为看到此内容的未来用户指出这一点。它隐藏在 cmets 中。

【讨论】:

请注意:文件夹的名称似乎会根据语言而变化。例如,对我来说,[Gmail]/Sent Mail 不起作用,但 [Gmail]/L&amp;AOQ-hetetyt viestit 起作用(如果我将 Gmail 的显示语言从芬兰语更改为英语,反之亦然)。【参考方案3】:

伙计,错误信息太误导人了。真正的意思是您尝试选择无效的文件夹名称,因此搜索操作失败。

要验证/检查当前有效的文件夹/标签,请执行以下操作:

使用 ImapClient

from imapclient import IMAPClient
## Connect, login and select the INBOX
imap_conn = IMAPClient('imap.gmail.com', use_uid=True, ssl=ssl)
imap_conn.login(USERNAME, PASSWORD)

print(imap_conn.list_folders())

使用 imaplib

import imaplib
mail = imaplib.IMAP4_SSL('imap.gmail.com')
mail.login('myusername@gmail.com', 'mypassword')
print(mail.list())

在我看到它所期望的文件夹名称后,一切都很好。

【讨论】:

【参考方案4】:

需要使用打印imap_conn.list()。标签是基于语言的。例如西班牙语是[Gmail]/Todos

【讨论】:

【参考方案5】:

确保在字符串中使用额外的引号:

imap_conn.select('"[Gmail]/Sent Mail"')  

这对我有用。

【讨论】:

啊哈,额外的引号!谢谢!

以上是关于我无法使用 Python 在 Gmail 中搜索已发送的电子邮件的主要内容,如果未能解决你的问题,请参考以下文章

如何在Python中执行IMAP搜索(使用Gmail和imaplib)?

通过 Gmail API 发送 Excel 文件,但附件已损坏

在 Python 中使用 Gmail API 使用 message-id 搜索电子邮件

使用 Python IMAP 阅读 Gmail 邮件

您如何使用 gmail api 查询已发送的项目?

如何在 Gmail 中使用标签来识别单个邮件,而不是已由脚本处理的线程