복붙노트

[PYTHON] MAPI를 통해 Python으로 Outlook에서 전자 메일 읽기

PYTHON

MAPI를 통해 Python으로 Outlook에서 전자 메일 읽기

데이터를 조작 할 수 있도록 교환 / Outlook 프로필의 폴더 안에있는 전자 메일의 내용을 읽을 수있는 짧은 프로그램을 작성하려고합니다. 그러나 파이썬 및 Exchange / Outlook 통합에 대한 많은 정보를 찾는 데 문제가 있습니다. 많은 것들이 매우 오래된 / 아무 문서도 / 설명되지 않았습니다. 몇 가지 미리보기를 시도했지만 동일한 오류가 발생하는 것 같습니다. Tim Golden의 코드를 사용해 보았습니다.

import win32com.client

session = win32com.client.gencache.EnsureDispatch ("MAPI.Session")

#
# Leave blank to be prompted for a session, or use
# your own profile name if not "Outlook". It is also
# possible to pull the default profile from the registry.
#
session.Logon ("Outlook")
messages = session.Inbox.Messages

#
# Although the inbox_messages collection can be accessed
# via getitem-style calls (inbox_messages[1] etc.) this
# is the recommended approach from Microsoft since the
# Inbox can mutate while you're iterating.
#
message = messages.GetFirst ()
while message:
    print message.Subject
    message = messages.GetNext ()

그러나 나는 오류가 발생합니다 :

pywintypes.com_error: (-2147221005, 'Invalid class string', None, None)

내 프로필 이름이 무엇인지 잘 모름 :

session.Logon()

메시지가 나타나지만 작동하지 않습니다 (같은 오류). 또한 Outlook을 열고 닫은 상태에서 시도해 보았고 아무 것도 변경하지 않았습니다.

해결법

  1. ==============================

    1.나는 똑같은 문제를 겪었습니다. 그러나 다음 코드는 매력처럼 작동합니다.

    나는 똑같은 문제를 겪었습니다. 그러나 다음 코드는 매력처럼 작동합니다.

    import win32com.client
    
    outlook = win32com.client.Dispatch("Outlook.Application").GetNamespace("MAPI")
    
    inbox = outlook.GetDefaultFolder(6) # "6" refers to the index of a folder - in this case,
                                        # the inbox. You can change that number to reference
                                        # any other folder
    messages = inbox.Items
    message = messages.GetLast()
    body_content = message.body
    print body_content
    
  2. ==============================

    2.나는 파이썬을 통해 Outlook 개체를 반복하는 자체 iterator를 만들었습니다. 문제는 python이 Index [0]으로 시작하는 반복을 시도하지만 Outlook에서 첫 번째 항목 인 Index [1]이 필요하다는 것입니다. Ruby를 더 단순하게 만들려면 다음과 같은 헬퍼 클래스 Oli가 있습니다. 행동 양식:

    나는 파이썬을 통해 Outlook 개체를 반복하는 자체 iterator를 만들었습니다. 문제는 python이 Index [0]으로 시작하는 반복을 시도하지만 Outlook에서 첫 번째 항목 인 Index [1]이 필요하다는 것입니다. Ruby를 더 단순하게 만들려면 다음과 같은 헬퍼 클래스 Oli가 있습니다. 행동 양식:

    .items () - 튜플 (인덱스, 항목)을 생성합니다.

    .prop () - 사용 가능한 속성 (메서드 및 특성)을 노출하는 Outlook 개체 인트로 스 스팅 지원

    from win32com.client import constants
    from win32com.client.gencache import EnsureDispatch as Dispatch
    
    outlook = Dispatch("Outlook.Application")
    mapi = outlook.GetNamespace("MAPI")
    
    class Oli():
        def __init__(self, outlook_object):
            self._obj = outlook_object
    
        def items(self):
            array_size = self._obj.Count
            for item_index in xrange(1,array_size+1):
                yield (item_index, self._obj[item_index])
    
        def prop(self):
            return sorted( self._obj._prop_map_get_.keys() )
    
    for inx, folder in Oli(mapi.Folders).items():
        # iterate all Outlook folders (top level)
        print "-"*70
        print folder.Name
    
        for inx,subfolder in Oli(folder.Folders).items():
            print "(%i)" % inx, subfolder.Name,"=> ", subfolder
    
  3. ==============================

    3.내 하찮은 영어 실력에 죄송하다는 말씀을 드리고 싶습니다. Python을 사용하여 MAPI로 메일을 확인하는 것이 더 쉽습니다.

    내 하찮은 영어 실력에 죄송하다는 말씀을 드리고 싶습니다. Python을 사용하여 MAPI로 메일을 확인하는 것이 더 쉽습니다.

    outlook =win32com.client.Dispatch("Outlook.Application").GetNamespace("MAPI")
    folder = outlook.Folders[5]
    Subfldr = folder.Folders[5]
    messages_REACH = Subfldr.Items
    message = messages_REACH.GetFirst()
    

    여기서 가장 먼저 메일을 메일 상자 또는 하위 폴더로 가져올 수 있습니다. 실제로 사서함 번호와 방향을 확인해야합니다. 이 분석을 통해 각 사서함 및 하위 사서함 폴더를 확인할 수 있습니다.

    마찬가지로 우리가 볼 수있는 아래 코드를 마지막 / 이전 메일에서 찾으십시오. 어떻게 확인해야하는지.

    `outlook =win32com.client.Dispatch("Outlook.Application").GetNamespace("MAPI")
    folder = outlook.Folders[5]
    Subfldr = folder.Folders[5]
    messages_REACH = Subfldr.Items
    message = messages_REACH.GetLast()`
    

    이렇게하면 가장 최근의 전자 메일을 사서함으로 가져올 수 있습니다. 위에서 언급 한 코드에 따르면 우리는 모든 메일 함 및 하위 폴더를 확인할 수 있습니다.

  4. ==============================

    4.나는 같은 문제가 있었다. 인터넷 (그리고 위에서)의 다양한 접근법을 결합하면 다음과 같은 접근 방식이 생깁니다 (checkEmails.py)

    나는 같은 문제가 있었다. 인터넷 (그리고 위에서)의 다양한 접근법을 결합하면 다음과 같은 접근 방식이 생깁니다 (checkEmails.py)

    class CheckMailer:
    
            def __init__(self, filename="LOG1.txt", mailbox="Mailbox - Another User Mailbox", folderindex=3):
                self.f = FileWriter(filename)
                self.outlook = win32com.client.Dispatch("Outlook.Application").GetNamespace("MAPI").Folders(mailbox)
                self.inbox = self.outlook.Folders(folderindex)
    
    
            def check(self):                
            #===============================================================================
            # for i in xrange(1,100):                           #Uncomment this section if index 3 does not work for you
            #     try:
            #         self.inbox = self.outlook.Folders(i)     # "6" refers to the index of inbox for Default User Mailbox
            #         print "%i %s" % (i,self.inbox)            # "3" refers to the index of inbox for Another user's mailbox
            #     except:
            #         print "%i does not work"%i
            #===============================================================================
    
                    self.f.pl(time.strftime("%H:%M:%S"))
                    tot = 0                
                    messages = self.inbox.Items
                    message = messages.GetFirst()
                    while message:
                        self.f.pl (message.Subject)
                        message = messages.GetNext()
                        tot += 1
                    self.f.pl("Total Messages found: %i" % tot)
                    self.f.pl("-" * 80)
                    self.f.flush()
    
    if __name__ == "__main__":
        mail = CheckMailer()
        for i in xrange(320):  # this is 10.6 hours approximately
                mail.check()
                time.sleep(120.00)
    

    concistency를 위해 FileWriter 클래스의 코드도 포함합니다 (FileWrapper.py에 있음). 나는 이것을 필요로했다. 왜냐하면 Windows에서 UTF8을 파일로 변환하려고 시도하지 않았습니다.

    class FileWriter(object):
        '''
        convenient file wrapper for writing to files
        '''
    
    
        def __init__(self, filename):
            '''
            Constructor
            '''
            self.file = open(filename, "w")
    
        def pl(self, a_string):
            str_uni = a_string.encode('utf-8')
            self.file.write(str_uni)
            self.file.write("\n")
    
        def flush(self):
            self.file.flush()
    
  5. from https://stackoverflow.com/questions/5077625/reading-e-mails-from-outlook-with-python-through-mapi by cc-by-sa and MIT license