我正在尝试创建一种用Python归档收件箱的方法。我希望代码能够遍历Outlook收件箱中特定文件夹中的所有电子邮件,并检查它们是否已经完成。检查它们是否“完成”将基于与特定电子邮件关联的“TaskCompletedDate”。如果特定电子邮件的“TaskCompletedDate”是一个特定的值,表示该电子邮件尚未完成,它将保持该电子邮件的原样,并继续发送下一封电子邮件。如果它遇到一封电子邮件,其中“TaskCompletedDate”是一个表示已完成的特定值,它会将该电子邮件移动到存档文件夹
以下是我在移动任何实际电子邮件之前测试它的内容,以确保它能正常工作。在下面的代码中,我创建了每封电子邮件主题行的列表(在本例中称为“a”),然后尝试使用While循环遍历每封电子邮件,并检查与之关联的“TaskCompletedDate”是什么。如果它在While循环中通过If条件(在本例中表示尚未完成的电子邮件,应保持原样),它将移动到下一个索引号并继续。如果它到达某个特定电子邮件关联的“TaskCompletedDate”不满足If条件的索引,它将从列表中删除与该索引关联的条目(“a”)。在真实场景中,电子邮件在存档时会从文件夹中删除,这可能意味着每封电子邮件的索引都会因此发生变化。因此,我还包含了一个子句,用于在每次从列表中删除条目(或在真实场景中存档)时将范围长度(表示文件夹中的电子邮件总数)减少1
import win32com.client
outlook = win32com.client.Dispatch("Outlook.Application").GetNamespace("MAPI")
folder = outlook.Folders.Item("Example@Example.com")
inbox = folder.Folders.Item("Inbox")
msg = inbox.Items
a=[]
for i in range(len(msg)):
a.append(msg[i].Subject)
aLen = len(a)
i = 0
while i < aLen:
if str(msg[i].TaskCompletedDate)[0:4] != '2020':
i += 1
else:
del a[i]
aLen = aLen - 1
列表的期望结束状态是,它将仅包含While循环中满足If条件的电子邮件的主题行(表示未存档的电子邮件),并且将从列表中删除不满足If条件的电子邮件的所有主题行(表示已存档并从收件箱中删除的电子邮件)
我遇到的问题是,最终状态似乎出现了一个空列表,我不完全确定原因。文件夹中肯定有满足If条件的电子邮件,因此如果我理解正确,不应从列表中删除这些电子邮件
任何帮助或想法都将不胜感激
提前谢谢你
当您减少
aLen
以避免索引超出范围错误时,有可能(即使有一个值不满足您的条件)您没有完全迭代msg
。根据物品的订购方式,这可能会导致您的问题。我还要检查msg
是否为非空如果您需要或觉得想要保持循环,我建议只添加符合条件的项目。从存储优化和最佳实践的角度来看,这比用所有可能的项填充
a
并删除不符合条件的项更干净、更高效。因此,我将用以下内容替换for和while循环:否则,一种更有效的填充
a
的方法是:最后,我建议大家阅读for循环以及while循环和where for循环的用法,因为您的一些语法可以简化和清理一点。 以下是一些指向Python文档部分的好链接: https://docs.python.org/3/reference/compound_stmts.htmlhttps://docs.python.org/3/tutorial/controlflow.html#for-statements
希望这有帮助:)
相关问题 更多 >
编程相关推荐