imaplib操作邮件移动至文件夹失败且无报错日志的问题咨询
根因分析
从你提供的调试日志可以直接定位到核心问题:
- 你执行
UID COPY操作时,当前选中的邮箱是目标归档文件夹2021-11-0,而非邮件所在的收件箱INBOX。你在run方法中先选中INBOX拿到了收件箱内的邮件UID列表,但是在move_handled_mails方法开头就通过self.mail.select(archiving_folder)切换到了归档文件夹,后续所有邮件操作的上下文都是归档文件夹,归档文件夹内不存在你要复制的UID对应的邮件,所以日志明确返回No messages copied。 - 你后续执行的标记删除操作同样是在归档文件夹上下文下执行,完全不会影响收件箱内的邮件,所以自然没有邮件被移动。
修复方案
调整操作顺序,在执行邮件复制、删除前切回收件箱即可,修改后的move_handled_mails代码参考如下:
def move_handled_mails(self, mail_list, suffix=0): archiving_folder = ''.join([str(current_year), '-', str(current_month), '-', str(suffix)]) self.mail.debug = 4 # 仅校验归档文件夹是否存在、创建时操作归档文件夹 typ, data = self.mail.select(archiving_folder) if typ != 'OK': if "NONEXISTENT" in data[0].decode(): self.mail.create(archiving_folder) typ, data = self.mail.select(archiving_folder) if "Too many mail in folder" in data[0].decode(): return self.move_handled_mails(mail_list, suffix+1) if typ != 'OK': exit() # 关键:操作邮件前切回收件箱INBOX typ, data = self.mail.select('INBOX') if typ != 'OK': exit() for num in mail_list: print(num) typ, data = self.mail.uid('COPY', num, archiving_folder) if typ == 'OK': typ, data = self.mail.uid('STORE', num, '+FLAGS', '(\\Deleted)') if typ != 'OK': exit() print("Executing expunge") typ, data = self.mail.expunge() if typ != 'OK': exit()
其他可选优化
你也可以用self.mail.list()方法直接判断归档文件夹是否存在,不需要通过select操作校验,减少不必要的邮箱上下文切换。
内容的提问来源于stack exchange,提问作者yoon
相关产品推荐
相关产品推荐

