본문 바로가기

개발/Python & Flask

[Python] Outlook 메일 자동 읽어오기

 

 

회사에서 Outlook 을 업무용 메일로 사용하고 있다.

DevOps를 하다보니 여러 협력사에서 로그 조회와 같은 문의 메일이 온다.

 

디비 종류도 워낙 많고 문의 케이스도 워낙 다양해서

현재는 사람이 읽고 처리를 하고 있지만,

이런 업무야 말로 없애야하는 일 중의 하나임은 분명하다.

 

그래서 이 일을 없애버리기 위해 공부를 해보기로 했다.

 

 

준비물

사전에 필요한 라이브러리가 있다.

pywin32

파이썬으로 윈도우 프로그래밍을 할 때 쓰이는 라이브러리.

현재 마우스 좌표 읽어오기 등의 사소한 것부터 시작해서 특정 프로그램 실행 등의 다양한 매크로 기능을 제공한다.

 

코드

import re, io
import win32com.client as win32
from win32com.client import Dispatch
import inspect

olook = win32.gencache.EnsureDispatch('Outlook.Application')
mapi = olook.GetNamespace("MAPI")

def display_folder(parent, level=-1):
    level += 1
    if hasattr(parent, 'Name'):
        print ("\t" * (level) + parent.Name)

    if hasattr(parent, 'Items'):
        for item in parent.Items:
        	if hasattr(item, 'SentOnBehalfOfName'):
            	print ("\t" * (level+1) + u"보낸사람 : " + item.SentOnBehalfOfName)

			if hasattr(item, 'Recipients'):
            	recipients = ', '.join([recipent.Name for recipent in item.Recipients])
                print ("\t" * (level+1) + u"받는사람 : " + recipients)

			if hasattr(item, 'To'):
            	print ("\t" * (level+1) + u"To : " + item.To)

			print ("\t" * (level+1) + u"제목 : " + item.Subject + '\n')
            print ("\t" * (level+1) + u"내용 : " + item.Body + '\n')

    if hasattr(parent, 'Folders'):
        for folder in parent.Folders:
            display_folder(folder, level)

display_folder(mapi)

 

결과

table과 같은 형태는 /t (horizontal tab) 으로 바뀌어서 출력된다.

image (첨부된 것 말고 본문에 있는 이미지) 는 출력되지 않는다.

첨부파일은 Object 형태로 읽어온다.

 

 

사용법

아래는 불러온 메일 Object의 속성들이다.

 

받은 편지함-

.Folders .Items

 

메시지-

.GetFirst() .GetLast() .GetNext() .GetPrevious() .Attachments

 

메시지 -

.Subject .Body .To .Recipients .Sender .Sender.Address

 

첨부 파일-

.item() .Count

 

첨부 파일-

.filename

 

설명

olook = win32.gencache.EnsureDispatch('Outlook.Application')
mapi = olook.GetNamespace("MAPI")

 

이 2줄로 메일 오브젝트를 가져오게 된다.

GetNamespace 함수는 VBA 에서 쓰이는 함수이다. 그대로 파이썬으로 가져와서 쓰게 된다.

.Subject .Body 등등 도 다 VBA에서 쓰이는 네이밍이다.

 

* MAPI (Messaging Application Program Interface)

MAPI는 마이크로소프트사의 윈도우즈 응용프로그램 내에서 전자우편을 보내거나, 자신이 현재 작성 중인 문서를 전자우편 내용 위에 첨부할 수 있도록 해주는 마이크로소프트 윈도우 프로그램 인터페이스이다. Mail + API 이다.

 

이렇게 되면 mapi 오브젝트에 모든 메일 폴더 Object 로 배열이 만들어진다.

  ex) mapi [ MAPIFolder, MAPIFolder, ... ]

문자열로 출력하면 이렇게 나온다.

<win32com.gen_py.Microsoft Outlook 16.0 Object Library.MAPIFolder instance at 0x2111858351216>

 

각 MAPIFolder Object 는 _MailItem Object로 이루어진 배열이다.

  ex) MAPIFolder [ _MailItem, _MailItem, _MailItem... ]

문자열로 출력하면 이렇게 나온다.

<win32com.gen_py.Microsoft Outlook 16.0 Object Library._MailItem instance at 0x2101178078352>

 

_MailItem 내부에 Subject, Body 등 속성을 이용해 실제 내용에 접근하게 되는 구조이다.

 

결론

필요한 양식을 지정해서 협력사에게 전달하면,

그들이 양식을 채워 메일로 발송하면, 자동으로 그 정보를 읽어 로그를 반환해주는 프로그램을 만들면 될 것 같다.

양식에 맞지 않을 시 그에 따른 회신도 해주면 되겠다.

 

물론 웹사이트로 조회 서비스를 개발해도 되지만,

이렇게 처리하면 협력사에게 별도로 교육할 필요가 없고,

그들은 사람이 처리하는 줄 알기 때문에 더욱 신뢰가 갈 것으로 예상된다.

 

끝 !

 

 

 

 

 

♡도움이 되셨다면 공감 및 광고클릭으로 응원해주세욥 :D

반응형