[PYTHON] MAPI를 통해 Python으로 Outlook에서 전자 메일 읽기
PYTHONMAPI를 통해 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.나는 똑같은 문제를 겪었습니다. 그러나 다음 코드는 매력처럼 작동합니다.
나는 똑같은 문제를 겪었습니다. 그러나 다음 코드는 매력처럼 작동합니다.
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.나는 파이썬을 통해 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.내 하찮은 영어 실력에 죄송하다는 말씀을 드리고 싶습니다. 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.나는 같은 문제가 있었다. 인터넷 (그리고 위에서)의 다양한 접근법을 결합하면 다음과 같은 접근 방식이 생깁니다 (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()
from https://stackoverflow.com/questions/5077625/reading-e-mails-from-outlook-with-python-through-mapi by cc-by-sa and MIT license
'PYTHON' 카테고리의 다른 글
[PYTHON] Python 및 Flask로 데이터 스트리밍 (0) | 2018.10.10 |
---|---|
[PYTHON] Python으로 파일의 마지막 x 줄을 검색하는 가장 효율적인 방법 (0) | 2018.10.10 |
[PYTHON] Pythons timeit으로 성능을 테스트하기 위해 코드 세그먼트를 어떻게 시간을 잴 수 있습니까? (0) | 2018.10.10 |
[PYTHON] numpy 배열에서 특정 요소를 제거하는 방법 (0) | 2018.10.10 |
[PYTHON] Word 2007 .docx 파일에서 단어를 검색하려면 어떻게해야합니까? (0) | 2018.10.10 |