如何使用Python以相反的顺序浏览Outlook电子邮件

ulmd4ohb  于 2023-06-28  发布在  Python
关注(0)|答案(3)|浏览(123)

我想阅读我的Outlook电子邮件,只未读的。我现在的代码是:

import win32com.client

outlook = win32com.client.Dispatch("Outlook.Application").GetNamespace("MAPI")
inbox = outlook.GetDefaultFolder(6)
messages = inbox.Items
message = messages.GetFirst ()
while message:
    if message.Unread == True:
        print (message.body)
        message = messages.GetNext ()

但这是从第一封电子邮件到最后一封电子邮件。我想按相反的顺序去,因为未读的电子邮件将在顶部。有办法做到吗?

q8l4jmvw

q8l4jmvw1#

我同意科尔的观点,for循环可以很好地遍历所有的代码。如果从最近收到的电子邮件开始很重要(例如对于特定的顺序,或限制您通过的电子邮件数量),您可以使用Sort函数按Received Time属性对它们进行排序。

outlook = win32com.client.Dispatch("Outlook.Application").GetNamespace("MAPI")
inbox = outlook.GetDefaultFolder(6)
messages = inbox.Items
#the Sort function will sort your messages by their ReceivedTime property, from the most recently received to the oldest.
#If you use False instead of True, it will sort in the opposite direction: ascending order, from the oldest to the most recent.
messages.Sort("[ReceivedTime]", True)

for message in messages:
     if message.Unread == True:
         print (message.body)
uujelgoq

uujelgoq2#

为什么不使用for循环?从第一个到最后一个浏览你的信息,就像它似乎是你试图做的那样。

for message in messages:
     if message.Unread == True:
         print (message.body)
qcbq4gxm

qcbq4gxm3#

这是一个有点老的问题,但这是谷歌上关于这个问题的热门帖子之一,所以我想补充一下我的经验。
使用for循环来迭代消息是一种更“pythonic”的代码结构化方式,但是根据我的经验,它经常会导致这个特定的库/API失败,因为任何外部更改(例如:当程序迭代时,电子邮件被移动到另一个文件夹)可能会导致可怕的4096异常。
此外,您会发现任何非电子邮件(例如:会议邀请)可能导致意外的结果/异常。
因此,我使用的代码是原始海报代码的网格,Bex Way的公认答案,以及我自己的发现:

import win32com.client

outlook = win32com.client.Dispatch("Outlook.Application").GetNamespace("MAPI")
inbox = outlook.GetDefaultFolder(6)
messages = inbox.Items
messages.Sort("[ReceivedTime]", True)
message = messages.GetFirst ()
while message:
    if message.Class != 43: #Not an email - ignore it
        message = messages.GetNext ()
    elif message.Unread == True:
        print (message.body)
        message = messages.GetNext ()

相关问题