【问题标题】:Python IMAP: Cannot mark email as seenPython IMAP:无法将电子邮件标记为已见
【发布时间】:2013-02-25 08:51:16
【问题描述】:

我正在尝试使用 Python IMAP 库将电子邮件设置为已读。就像在这个例子中一样: Python, IMAP and GMail. Mark messages as SEEN

我选择一个 GMail 帐户的“所有电子邮件”文件夹,然后通过搜索命令获取特定电子邮件的 UID。然后我使用该 UID 尝试将其标记为已读,但失败了。

    result, data = mail.uid('fetch', email_uid, '(FLAGS)')

    print "RESULT: ",result,data

    mail.select(folder_name, readonly=False)
    result, data = mail.store(email_uid, '+FLAGS', '\\Seen')

    print "RESULT OF OPERATION FOR UID",email_uid,result,data

无论我运行这段代码多少次,我总是获得不包含 \Seen 标志的标志。

示例执行(忽略 Django 打印):

FINAL QUERY: (SENTSINCE 07-Mar-2013 SENTBEFORE 11-Mar-2013 LARGER 7508 SMALLER 7510)
RESULT:  OK ['31424 (UID 54264 FLAGS (NotJunk $NotJunk))']
RESULT OF OPERATION FOR UID 54264 OK [None]

[09/Mar/2013 17:30:37] "GET /api/mark_as_read/320/?token=8e3c057b841b75c864685786b2a9657aadf17e3bfb991b103b7c4b3ffdd2a753&refresh_mode=all&folder_mode=inbox HTTP/1.1" 200 144
FINAL QUERY: (SENTSINCE 07-Mar-2013 SENTBEFORE 11-Mar-2013 LARGER 7508 SMALLER 7510)
RESULT:  OK ['31424 (UID 54264 FLAGS (NotJunk $NotJunk))']
RESULT OF OPERATION FOR UID 54264 OK [None]

[09/Mar/2013 17:30:44] "GET /api/mark_as_read/320/?token=8e3c057b841b75c864685786b2a9657aadf17e3bfb991b103b7c4b3ffdd2a753&refresh_mode=all&folder_mode=inbox HTTP/1.1" 200 144
FINAL QUERY: (SENTSINCE 07-Mar-2013 SENTBEFORE 11-Mar-2013 LARGER 7508 SMALLER 7510)
RESULT:  OK ['31424 (UID 54264 FLAGS (NotJunk $NotJunk \\Seen))']
RESULT OF OPERATION FOR UID 54264 OK [None]

我尝试了多种变体。我尝试设置标志\Seen,Seen,\Seen,SEEN,带括号,不带括号,不知道除此之外我还能尝试什么。

我怀疑这里可能有一些非常具体的细节 - 也许 GMail“所有电子邮件”文件夹不允许将电子邮件标记为已读?

我也不知道,在 mail.store 命令返回的 (result,data) 元组中,data 变量是否应该具有正常执行的“[None]”变量,或者它是否表示有问题。

如果我尝试设置错误标志,例如 \\Seen,mail.store 命令会引发错误。因此,当设置 \Seen 标志时,它是一个有效的 IMAP 标志。

我不知道下一步该尝试什么。

任何帮助将不胜感激。

【问题讨论】:

  • RESULT: OK ['31424 (UID 54264 FLAGS (NotJunk $NotJunk \\Seen))'] 这不是显示设置了 Seen 标志吗?
  • 您是对的,在这种情况下,它确实将电子邮件标记为已查看,但并不总是按预期运行。打印非常不规则。
  • 我不知道您的代码是否正常工作,但我昨天尝试通过 UID 设置 FLAG 时遇到了这个问题。我让它工作的唯一方法是通过顺序 ID 设置它。无论如何,如果你得到它的工作,请告诉我们谢谢!

标签: python imap imaplib


【解决方案1】:

你可以使用 imap_tools 包: https://pypi.org/project/imap-tools/

with MailBox('imap.mail.com').login('test@mail.com', 'pwd', initial_folder='INBOX') as mailbox:

    # SEEN: mark all messages sent at 05.03.2007 in current folder as unseen, *in bulk
    mailbox.seen(mailbox.fetch("SENTON 05-Mar-2007"), False)

【讨论】:

    【解决方案2】:

    IMAP specification for the STORE command 没有通过 UID 设置标志的选项。您只能通过message set 设置它们(如您链接到的示例中)。
    有时起作用的唯一原因是您的 UID 和消息集的序列相对接近(3142454264)。

    RESULT:  OK ['31424 (UID 54264 FLAGS (NotJunk $NotJunk))']
    

    您实际上并没有曾经通过UID 设置标志,而是通过message set 设置它们...偶尔对应于UID


    可以通过UID 设置标志(只是不能使用STORE 命令)。您可以发出UID Command,第一个参数为store 来设置标志:

    result, data = mail.uid('store', '542648', '+FLAGS', '(\\Seen)')  
    

    如果成功,服务器将响应您使用的 UID 对应的message set - 例如(使用您的示例):

    OK ['31424 (FLAGS (\\Seen))']
    

    【讨论】:

      猜你喜欢
      • 2014-10-09
      • 1970-01-01
      • 2012-09-30
      • 2014-08-06
      • 2013-06-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-12-15
      相关资源
      最近更新 更多