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 值的所有数字
我正在使用 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()
.