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

2024-05-23 13:30:51 发布

您现在位置:Python中文网/ 问答频道 /正文

Iam正在使用带有IMAP4模块的Python3.6。Iam正在尝试将电子邮件从“收件箱”复制到“mytestfolder”。 我的回复是“OK”,但电子邮件本身没有被复制到“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()

Tags: inimportidconfig电子邮件usernameloginok
1条回答
网友
1楼 · 发布于 2024-05-23 13:30:51

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不会随着重新编号而改变

您还可以通过发出一个复制所有消息的单一复制命令,然后发出一个将消息标记为已删除的单一存储,来纠正此错误并大大加快。您甚至不需要搜索,因为搜索结果只是从1到返回值select()的所有数字

相关问题 更多 >