【问题标题】:Problem deleting emails in gmail using imaplib使用 imaplib 在 gmail 中删除电子邮件时出现问题
【发布时间】:2011-04-28 15:56:21
【问题描述】:

我尝试从收件箱文件夹中删除邮件,一切正常,但是当我切换到所有邮件文件夹时,删除不起作用。 expunge() 方法返回 ('OK', [None]) 并且消息没有被删除:

>>>import imaplib
>>>server = imaplib.IMAP4_SSL('imap.gmail.com','993')
>>>server.login('likvidator89@gmail.com','Password')
>>>server.select('inbox')
>>>for i in server.search(None,'all')[1][0].split():
...    print i+"\n"+server.fetch(i,'(BODY[HEADER.FIELDS (Subject)])')[1][0][1]
...
#  that how i know what UID hame my message? I select by subject
#....
#28
#Subject: 1 Question Has 1 Answer - Stack Overflow
#
#
#29
#Subject: 2222222222
#...
>>>server.store(29,'+FLAGS','\\Deleted')
#('OK', ['29 (FLAGS (\\Seen \\Deleted))'])
>>>server.expunge()
#('OK', ['29'])
>>> server.select('[Gmail]/All Mail')
('OK', ['47'])
>>> for i in server.search(None,'all')[1][0].split():
...  print i+"\n"+server.fetch(i,'(BODY[HEADER.FIELDS (Subject)])')[1][0][1]
... 
#....
#
#46
#Subject: 2222222222
#
#
#47
#Subject: 3333333333333333
#
#....
>>> server.store(47,'+FLAGS','\\Deleted')
('OK', ['47 (FLAGS (\\Seen \\Deleted))'])
>>> server.expunge()
('OK', [None])

【问题讨论】:

    标签: python gmail imap imaplib gmail-imap


    【解决方案1】:

    正如gmail blog site 上所说,Google 的 IMAP 实现有点不同。当您按照说明获取更常用的语义时,是否有帮助?

    还有一些比较晦涩的 那些想要的人的选择 让 Gmail 的 IMAP 工作起来更像 传统 IMAP 提供商:您可以 关闭自动清除或垃圾箱 当它们不再存在时的消息 通过 IMAP 可见。

    IMAP 协议允许消息 被标记为删除,一种 消息仍然存在的边缘状态 存在于文件夹中,但预定 下次文件夹被删除时 删除。在我们的标准 IMAP 实现,当你标记一个 邮件已删除,Gmail 不允许 它停留在那个状态——它删除 (或自动删除)它从文件夹中 马上。如果你想要两阶段 启用后删除进程 这个实验室,只需选择“不要 自动删除邮件'下 中的“转发和 POP/IMAP”选项卡 设置。

    同样,大多数 IMAP 系统不支持 分享 Gmail 的归档理念 消息(发送消息到 [Gmail]/所有邮件文件夹而不是 [Gmail]/垃圾箱)。如果你愿意 已删除的消息不保留在任何 其他可见的 IMAP 文件夹被发送到 [Gmail]/垃圾箱,高级 IMAP 控件可让您设置首选项 这边走。在“IMAP 访问:”中 “转发和 POP/IMAP”选项卡,找到“当 消息从最后一个被删除 可见 IMAP 文件夹:' 选项。选择 “将邮件移至 Gmail 垃圾箱。” 如果你想迈出一步 此外,您可以选择“立即 永远删除这条消息。'

    【讨论】:

      【解决方案2】:

      使用Gmail advanced IMAP controls,您可以设置当您通过 IMAP 删除邮件时会发生什么。

      只需在 Gmail 实验室中启用“高级 IMAP 控件”即可。设置页面将如下所示:

      然后,当您根据this answer 将邮件标记为已删除和删除时,它将被移动到垃圾箱、永久删除或存档到“所有邮件”,具体取决于您选择的设置。

      【讨论】:

      • 我已经尝试过您的方法,但是当我删除一条消息时,该消息将有一个收件箱标签,而如果我们从 gmail 本身删除该消息将没有任何标签。
      • 我知道这是一个非常古老的线程,但是为了帮助其他人解决上述 Rahul 的问题,您只需要先删除“收件箱标签”,然后再添加垃圾标签。即imap.store(num, '-X-GM-LABELS', '\\Inbox')
      【解决方案3】:

      它将给定 gmail 标签中的所有邮件移动到 gmail 垃圾箱

      #!usr/bin/python
      import email, imaplib
      
      user = 'xxx'
      pwd = 'xxx'
      
      m = imaplib.IMAP4_SSL("imap.gmail.com")
      m.login(user,pwd)
      
      m.select("some_gmail_label")
      m.store("1:*",'+X-GM-LABELS', '\\Trash')
      
      m.expunge() # should be useless, but gmail server says it is ok
      

      记得刷新你的gmail界面,因为它有缓存

      【讨论】:

      • 很好的建议。关于 m.store() 用法的文档在哪里?
      • @jml: 引用 IMAP spec, RFC 3501 : * represents the largest number in use
      【解决方案4】:

      这是一个与 Gmail 配合使用并且执行速度非常快的方法(无需存储在 for 循环中)。随心所欲地定制它,但想法都在于如何使用选择/搜索然后执行存储,或者只是为具有特定标签/文件夹的所有项目自行选择:

      #!/bin/python
      
      import datetime
      import imaplib
      
      m = imaplib.IMAP4_SSL("imap.gmail.com")  # server to connect to
      print "Connecting to mailbox..."
      m.login('gmail@your_gmail.com', 'your_password')
      
      print m.select('[Gmail]/All Mail')  # required to perform search, m.list() for all lables, '[Gmail]/Sent Mail'
      before_date = (datetime.date.today() - datetime.timedelta(365)).strftime("%d-%b-%Y")  # date string, 04-Jan-2013
      typ, data = m.search(None, '(BEFORE {0})'.format(before_date))  # search pointer for msgs before before_date
      
      if data != ['']:  # if not empty list means messages exist
          no_msgs = data[0].split()[-1]  # last msg id in the list
          print "To be removed:\t", no_msgs, "messages found with date before", before_date
          m.store("1:{0}".format(no_msgs), '+X-GM-LABELS', '\\Trash')  # move to trash
          print "Deleted {0} messages. Closing connection & logging out.".format(no_msgs)
      else:
          print "Nothing to remove."
      
      #This block empties trash, remove if you want to keep, Gmail auto purges trash after 30 days.
      print("Emptying Trash & Expunge...")
      m.select('[Gmail]/Trash')  # select all trash
      m.store("1:*", '+FLAGS', '\\Deleted')  #Flag all Trash as Deleted
      m.expunge()  # not need if auto-expunge enabled
      
      print("Done. Closing connection & logging out.")
      m.close()
      m.logout()
      print "All Done."
      

      【讨论】:

        猜你喜欢
        • 2017-05-14
        • 2019-08-26
        • 2017-01-04
        • 2011-03-02
        • 2010-12-19
        • 2011-07-30
        • 2011-04-01
        • 1970-01-01
        • 2011-10-28
        相关资源
        最近更新 更多