【发布时间】:2018-06-27 21:48:42
【问题描述】:
我开发了一个代码来遍历 Outlook 文件夹并从具有预定义主题行的电子邮件中下载附件,并删除邮件并删除主题与预定义主题不同的邮件。代码如下
folder = inbox.Folders("folder")
for msg in folder.Items:
if msg.Subject == "Predefined msg Subject":
for att in msg.Attachments:
msg_date = msg.SentOn.srftime(%Y-%m-%d)
att.SaveAsFile(os.path.join(dest_folder, msg_date + "_" + att.Filename)
else:
pass
msg.Delete()
continue
我的文件夹中有大约 150 条消息,大约有 8 条带有必需附件的消息,其他的只是删除。但上面的循环恰好在 73 处中断(我使用了一个计数器和 msg。受它中断的位置和原因)。然后第二次运行在~24 之后中断,依此类推。我必须再运行 3 次代码才能查看文件夹中的所有电子邮件。知道为什么代码退出循环
【问题讨论】:
-
在另一张纸条上,你为什么在循环结束时
continue? -
你不需要
else: pass -
您的代码是优雅退出还是中断?如果是稍后,请尝试添加
try-except块并记录异常/堆栈跟踪。 -
我相信
msg.Delete()可能会缩小folder.Items,因此您最终会在迭代中跳过项目。与其删除它们,不如尝试将它们添加到msgs_to_delete列表中(如msgs_to_delete.append(msg)),然后当你完成循环后执行for msg in msgs_to_delete: msg.Delete(),当然你需要在第一个循环之前创建msgs_to_delete = []。 -
@Heisenberg:如果容器正在缩小带有范围的 for 循环,则无法解决问题。最终索引会超出范围。
标签: python loops email outlook