본문 바로가기

코딩/업무자동화

[파이썬/업무자동화] Outlook 메일 파싱(parsing) 정리 - 2

반응형

※ 이 글을 쓰는 사람은 SW 비전공자입니다.

※ 개인 공부를 위해 정리하는 글이며, 작성한 코드들은 효율성, 깔끔함(?) 등과는 거리가 멀 수 있습니다

 

 outlook 자동화 관련편

1편 : 2021.03.01 - [코딩/Python] - [Python/파이썬] Outlook 메일 파싱(parsing) 정리 - 1

2편 : 2021.03.02 - [코딩/Python] - [Python/파이썬] Outlook 메일 파싱(parsing) 정리 - 2

3편 : 2021.03.23 - [코딩/Python] - [Python/파이썬] Outlook 여러 메일 첨부 파일 한번에 받기

4편 : 2021.04.28 - [코딩/Python] - [Python/파이썬] Outlook 메일 첨부 엑셀파일의 내용 자동 취합하기


 

  내가 해보고 싶었던 것은 업무적으로 요청이 오는 코드 등록 요청 메일(ERP)를 자동화하는 것이다.

어떤 회사든 상품, 제품, 자재와 관련 된 코드를 관리하는 회사라면 ERP를 활용할 것이다.

(최근에는 SAP을 많이 사용하는 것 같다.)

상품, 제품과 관련 된 코드를 관리하는 회사라면 이 코드를 전산 등록하고 관리하는 담당자가 존재한다.

예를 들어, 우리 회사같은 경우는 코드 등록 담당자에게 아래 사진과 같이 등록 요청 메일이 날라온다.

회사 정보를 유출할 수는 없어서  Outlook 받은편지함에 - test 폴더를 생성하고 임의의 메일을 작성하였다

 

< 등록 요청 예시 >

 

이전에 공부하였던 내용을 활용하여 메일 내부 내용을 파싱하고 코드 정보를 엑셀 파일에 옮겨담는 코드를 작성해보려고 함.

다음은 함수 1개를 정의하였다. 

 

import win32com.client

# 각 메일 object를 입력받아 메일 본문의 sring(문자열)을 return 하는 함수
def msbody(ms):
    codeinfo = ms.Body
    return codeinfo

 

 

다음은 이전 1편에서 배웠던 COM 객체 선언 부분이다.

 

 

outlook = win32com.client.Dispatch("Outlook.Application").GetNamespace("MAPI")

#6 : 받은 편지함(inbox folder)를 의미함.
inboxfolder = outlook.GetDefaultFolder(6).Folders["test"]
messages = inboxfolder.Items

#받은편지함에 있는 메일 개수를 입력받는 변수 : msg_count
msg_count = messages.Count
print("받은편지함 메시지 수 : " + str(msg_count) + "건")

 

 

이전과 달라진부분이라면 아래 구문이다.

inboxfolder = outlook.GetDefaultFolder(6).Folders["test"]

숫자 6은 받은편지함(=Inbox folder)를 의미한다. 받은 편지함 내부의 특정 메일 폴더에 접근하고 싶다면

뒤에 .Folders["메일폴더명"]을 붙여주면 된다.

위 내용까지 작성하여 출력하면 위 받은편지함의 2건 메일이 있다는 것을 확인할 수 있다.

<결과>

 

 

다음은 받은편지함-test 폴더에 있는 메일 2통에 대해 메일 내용은 실제 parsing하는 부분이다.

 

 

i=1
for ms in messages: #각 메시지에 대해 loop
   info = msbody(ms) #메일 본문을 return하는 함수. str(문자열) return값을 가짐
   print(str(i)+"번째 출력 : ", '\n')
   info = info.replace('\r','') #메일 내용에서 개행문자 중 \r을 제거
   infolist = info.split('\n') #위 info(string)에서 \n기준으로 분리하여 리스트화
   print(infolist)
   i = i + 1

 

 

메일 내용을 파싱하여 출력해보면 개행문자(\n, \r)이 포함되어 출력된다.

원하는 내용만 파싱하려면 먼저 전처리가 필요하다. 위 코드에서 replace 함수, split 함수가 그 부분이다.

replace함수는 문자열을 대상으로 특정 문자를 원하는 것으로 바꾸어준다.(return 결과 : 문자열)

split 함수의 경우 문자열을 어떤 특정 문자를 기준으로 분리하여 리스트화한다.(return 결과 : 리스트)

 

위 코드까지 작성하여 실행해보면 아래와 같이 결과를 확인할 수 있다.

<결과 : 문자열이 \n기준으로 List로 반환되어 출력됨 >

 

위 결과를 확인해보면 리스트 요소중 빈칸의 요소들이 많이 보인다.

이 빈칸을 제거하기 위해 list comprehension(리스트 내포화)를 사용하여 추가구문 작성해보았다.

 

 

i=1
for ms in messages: #각 메시지에 대해 loop
   info = msbody(ms) #메일 본문을 return하는 함수. str(문자열) return값을 가짐
   print(str(i)+"번째 출력 : ", '\n')   
   info = info.replace('\r','') #메일 내용에서 개행문자 중 \r을 제거
   infolist = info.split('\n') #위 info(string)에서 \n기준으로 분리하여 리스트화
   infolist = [v for v in infolist if v and v != " "] #list comprehension
   print(infolist)
   i = i + 1

 

 

중간에 추가 된 list 내포화 구문은 해당 리스트의 요소가 None 이거나 " "(스페이스)이면 삭제하고 나머지를 다시 리스트화한다는 구문이다.

결과는 전보다 깔끔해진 것으로 확인

< 전처리 후 결과>

이제 할 것은 위에 문자열로 이루어진 리스트를 사용하여 필요한 정보만 추출하는 것이다.

방법을 찾아봐야 해서 일단 오늘은 여기까지 작성...

728x90