본문 바로가기

개발하자

Python을 사용하여 Outlook 이메일을 역순으로 검토하는 방법

반응형

Python을 사용하여 Outlook 이메일을 역순으로 검토하는 방법

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 ()

하지만 이것은 첫번째 이메일에서 마지막 이메일로 넘어갑니다. 읽지 않은 메일이 맨 위에 있기 때문에 역순으로 가고 싶습니다. 그렇게 할 수 있는 방법이 있나요?




for 루프를 사용하면 어떨까요? 처음부터 끝까지 메시지를 마치려고 하는 것처럼 보여요.

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



나는 포 루프가 그들 모두를 통과하는 데 좋다는 콜의 말에 동의한다. 가장 최근에 수신한 전자 메일에서 시작하는 것이 중요한 경우(예: 특정 주문 또는 전자 메일 수 제한) 이 기능을 사용하여 속성별로 정렬할 수 있습니다.

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)



조금 오래된 질문이지만 이것은 이 질문에 대한 구글의 최고 게시물 중 하나이기 때문에 저는 제 경험을 추가하고 싶습니다.

메시지를 통해 반복할 때 for 루프를 사용하는 것은 코드를 구성하는 더 "파이토닉" 방식이지만, 내 경험에 따르면 프로그램이 반복되는 동안 이메일이 다른 폴더로 이동되는 등의 외부 변경으로 인해 이 특정 라이브러리/API에서 오류가 발생하는 경우가 많다.

또한 전자 메일이 아닌 경우(예: 회의 초대) 예상치 못한 결과/예외가 발생할 수 있습니다.

그러므로 나는 원래 포스터의 코드, 벡스 웨이의 수락된 답변, 그리고 나 자신의 발견을 망라한 코드를 사용한다:

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 ()

반응형