IMAP COPY 命令不适用于收件箱 - Python

IMAP COPY command not working on Inbox - Python

我正在使用 Python3.6 和 IMAP4 module.Iam 尝试将电子邮件从“收件箱”复制到“mytestfolder”。 我得到“确定”作为响应,但电子邮件本身没有被复制到“mytestfolder”。 相同的代码片段第一次在“someotherfolder”到“mytestfolder”上工作时没有任何问题,之后它就不起作用了。下面是代码片段,有人可以帮我解决这个问题吗?

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()

TLDR:您通过删除内容然后按过去的顺序编制索引而计算错误。

您的代码:

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

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

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().

的 return 值的所有数字