【问题标题】:For loop exits while downloading outlook email attachments python下载outlook电子邮件附件python时for循环退出
【发布时间】: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


【解决方案1】:

您的代码正在修改它正在迭代的集合。不要使用“for”循环,而是使用 items.Count down 到 1 的循环。

附带说明,遍历文件夹中的所有邮件是一个可怕的想法 - 使用 Items.RestrictItems.Find/FindNext 让邮件存储为您找到匹配项。

【讨论】:

  • 伟大的工作家伙.. 我做了 Items.Restrict 列表要通过(但是“或”对于限制上的两个条件不起作用,我将对此进行进一步研究)和 Items.FindNext找到下一个项目。这成功了。
  • 如果这回答了您的问题,请将其标记为答案。
猜你喜欢
  • 2019-06-18
  • 2020-07-20
  • 1970-01-01
  • 2018-01-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-02-11
相关资源
最近更新 更多