【问题标题】:How to delete emails using UID in imaplib python如何在 imaplib python 中使用 UID 删除电子邮件
【发布时间】:2020-11-11 14:22:47
【问题描述】:

我正在尝试按 UID 删除电子邮件。这是我正在访问的 hotmail 电子邮件帐户。

这就是我正在做的事情:

1。连接到电子邮件

imap = imaplib.IMAP4_SSL('imap-mail.outlook.com')
imap.login('my_email@hotmail.com', "password")

2。从电子邮件中获取 UID

resp, _ = imap.select('Inbox')
mbox_response, msgnums = imap.search( None,'FROM', 'email@sender.com')

messages = [] #Appending UID to this dictionary

for num in msgnums[0].split():
    msg_uid = imap.fetch(num, 'UID')
    messages.append({'uid':imap.fetch(num, 'UID')})

3。打印 UID

print(messages)

我得到以下输出:

[{
  'uid': ('OK', [b'1 (UID 111)']), 
  'uid': ('OK', [b'2 (UID 114)'])
}]

4。如何删除?

如何使用这些 UID 删除特定消息?

我试过这个没有成功...

for m in messages:
    imap.store(m['uid'],'+X-GM-LABELS', '\\Trash')

我收到以下错误:

TypeError: can't concat tuple to bytes

【问题讨论】:

  • 如果你使用 imap.uid('SEARCH') 而不是 imap.search(...),你会直接得到 UID 结果,并且可以在不重新获取 uid 的情况下使用它们。 uids 删除的命令是 imap.uid('store', ...)。等等所有的uid命令都使用imap.uid(...)
  • 我实际上做了比上面描述的更多的事情,所以理想情况下希望将其保留为:imap.search。但是我可以检查一下,你能告诉我替换 imap.search(None,'FROM','email@sender.com') 的完整语法是什么吗?
  • 您会发现在任何地方使用 UID 都容易得多。在序列号和 UID 之间来回切换是一种痛苦的方法。你可以把它改成imap.uid('SEARCH', 'FROM', 'email@sender.com')
  • 但是,您的根本问题是您没有从获取响应中解析 UID。您正在存储('OK', [b'1 (UID 111)']),一个字符串元组和一个单字节列表,而不仅仅是111

标签: python imap imaplib


【解决方案1】:
from imap_tools import MailBox
with MailBox('imap.mail.com').login('test@mail.com', 'pwd', 'INBOX/test') as mailbox:
    # DELETE all messages from current folder (INBOX/test)
    mailbox.delete([msg.uid for msg in mailbox.fetch()])

https://github.com/ikvk/imap_tools

【讨论】:

  • 不会删除所有消息吗?我只是希望它根据 UID 删除特定消息
  • “if”运算符呢?尝试阅读文档。在我的帖子中 - 回答你的问题。 "Fetch" 产生带有解析数据的 msg
猜你喜欢
  • 2017-05-14
  • 2019-08-26
  • 2017-01-04
  • 2011-03-02
  • 2010-12-19
  • 2023-03-25
  • 2021-11-27
  • 2017-04-04
  • 2011-04-28
相关资源
最近更新 更多