【问题标题】:IMAP COPY command not working on Inbox - PythonIMAP COPY 命令在收件箱上不起作用 - Python
【发布时间】:2021-07-26 17:25:24
【问题描述】:

我正在使用带有 IMAP4 模块的 Python3.6。我正在尝试将电子邮件从“收件箱”复制到“mytestfolder”。 我得到“OK”作为响应,但电子邮件本身没有被复制到“mytestfolder”。 当相同的代码 sn-p 第一次用于“someotherfolder”到“mytestfolder”时没有任何问题,之后它就不起作用了。下面是代码 sn-p 有人可以帮我解决这个问题。

import config
import imaplib
from creds import username,password
imap = imaplib.IMAP4_SSL(config.imap_server,config.imap_port)
r, d = imap.login(username, password)
assert r == 'OK', 'login failed: %s' % str (r)
print(" > Signed in as %s" % username, d)

imap.select("Inbox")
r, d = imap.search(None, "ALL")
allIds = d[0].decode('utf8').split(' ')
''' Login works and iam getting msg_ids as well'''

for msg_id in allIds:
    apply_lbl_msg = imap.uid('COPY', msg_id, 'mytestfolder')
    if apply_lbl_msg[0] == 'OK':
        mov, data = imap.uid('STORE', msg_id , '+FLAGS', '(\Deleted)')
        imap.expunge()

【问题讨论】:

  • 不要混合 UID 和序列 ID!要么使用所有 .uid 命令(.uid('SEARCH'),要么不使用 .uid 命令(.copy(...))。如果您使用序列 ID,请将 .expunge 移到循环之外,这样序列 ID 不会重新编号,直到您'完成了。,
  • 是的,感谢您的评论。

标签: python python-3.x imap imaplib


【解决方案1】:

TLDR:您通过删除东西然后按过去的顺序索引来计算错误。

您的代码可以:

r, d = imap.search(None, "ALL")

“给我收件箱中所有邮件的序号”,所以你得到 1、2、3、4、5 等等。 d 中的最后一个数字将等于上面几行 select() 的返回值。然后你循环,我会解释第一次迭代:

apply_lbl_msg = imap.uid('COPY', msg_id, 'mytestfolder')
if apply_lbl_msg[0] == 'OK':

“将第一条消息复制到 mytestfolder,如果可行的话……”

    mov, data = imap.uid('STORE', msg_id , '+FLAGS', '(\Deleted)')
    imap.expunge()

“...然后删除收件箱中的第一条消息”,这意味着第二条消息现在变成了第一条。

下一次迭代对邮箱中当前第二个的消息进行操作,并且曾经是第三个,因此您永远不会对开始时为 2 的消息进行操作。第三次迭代对当前第三次的消息进行操作,并且曾经是......我认为是第五次?没关系。

您可以通过切换到相同的 UID 版本来纠正此问题。重新编号时,UID 不会改变。

您也可以通过发出一个复制所有消息的 COPY 命令,然后发出一个将它们标记为已删除的单个 STORE 来使这个正确并且非常快。你甚至不需要 SEARCH,因为搜索的结果只是从 1 到返回值select() 的所有数字。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-08-13
    • 1970-01-01
    • 2011-09-20
    • 2013-12-19
    • 2011-05-30
    • 1970-01-01
    • 2017-06-15
    相关资源
    最近更新 更多