※ 이 글을 쓰는 사람은 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 메일 첨부 엑셀파일의 내용 자동 취합하기
Outlook 메일 파싱 편의 목적은 여러 사람들에게 오는 ERP 코드 등록 요청 data를 한 파일에 취합하는 프로그램을 제작하는 것이다.
이전 Outlook 메일 파싱에서 메일 본문 data를 파싱 하고 원하는 data만 취합을 하는 방법으로 접근했었다. 그런데 실무에서 쓰는 메일 내용도 제각각이고 규칙적이지 않은 data를 전 처리하는 것이 너무 번거로워서 방법을 바꾸기로 했다.
아래 그림은 내가 생각하는 프로그램 컨셉도이다. 요청 양식(템플릿)을 통일화해서 요청 메일을 모두 동일한 양식으로 받는다. 프로그램을 실행 시 설정한 메일 폴더의 첨부파일들을 모두 다운로드하고, 프로그램에서 내부 data를 1개 파일로 자동으로 취합한다.
함수는 2개로 나누기로 했다. 여러 메일의 첨부파일을 한 번에 다운로드하는 부분과 메일의 데이터를 한번에 취합하는 부분이다. 이번 편에서는 여러 메일의 첨부파일을 한번에 다운로드 받는 방법을 정리해보려고 한다.
먼저 테스트를 위해 아웃룩 받은 편지함 - test 폴더에 임의의 메일 3개를 생성하였다. 각 메일은 첨부파일을 가지고 있으며 양식은 위 컨셉도의 엑셀 양식이다. 각 메일의 경우 첨부파일을 1개 이상 가지고 있다.(두 번째 요청 메일에서는 첨부파일이 2개이다)
임의의 메일 3개 생성 - 받은편지함 'test' 폴더 | 두번째 메일 - 첨부파일 2개 |
1. 구현 코드
전체 코드를 먼저 첨부하고, 추가로 설명이 필요한 부분만 2번부터 정리하였다. 아래 코드는 outlook 여러 메일의 첨부파일을 한 폴더에 다운로드하는 부분만 구현한 것이다.
혹시나 코드를 사용하실 분들은 코드를 그대로 붙여 넣기 하고 코드 하단의 'fn', 'downpath' 변수 내용만 수정하면 된다.
<코드>
import win32com.client
#outlook 정해진 폴더에서 첨부파일을 다운로드 하는 함수
#flodername : outlook 폴더명, downpath : 다운받을 위치
def att_down(foldername, downpath):
outlook = win32com.client.Dispatch("Outlook.Application").GetNamespace("MAPI")
inbox = outlook.GetDefaultFolder(6).Folders[foldername]
messages = inbox.Items
no = 1 #중복 파일명이 있을 것을 대비해 추가한 파일명 인덱스
m_count = 1 #메일 카운트
#각 메일마다 첨부파일을 다운로드 하는 루프
for ms in messages:
attachments = ms.Attachments #해당 메일의 첨부파일 개수(integer)
r = attachments.count
print(str(m_count)+"번째 메일 첨부파일 개수 : ",str(r)+"개")
m_count=m_count+1
for i in range(1, r + 1):
attachment = attachments.Item(i)
attachment.SaveASFile(downpath + str(no) + "_" + str(attachment)) # 파일명을 넣어야 함.
no = no + 1
###첨부파일 다운로드 하기
fn = "test"
downpath = r"C:\Users\Desktop\VS CODE\첨부파일/"
att_down(fn, downpath)
1) fn
outlook 받은 편지함의 폴더명을 의미함. 위 outlook 이미지에서 보시다시피 폴더명을 'test'로 지정해놨기에 fn="test"로 코드에 입력해두었다. fn은 att_down(foldername, downpath)의 인수 중에 foldername에 해당한다.
inbox = outlook.box = outlook.GetDefaultFolder(6). Folders [foldername]
2) downpath
downpath는 메일의 첨부파일을 다운로드할 경로이다. 위 코드처럼 r"경로"를 입력하면 된다. r을 앞에 입력하는 이유는 파이썬에서 경로를 작성할 때, 역 슬래쉬(\)를 인식하지 못하기 때문이다.(오류 걸림) 앞에 r을 써주면 인식할 수 있다.
2. 코드 설명
import는 이전 편에서도 다루었으므로 생략하고 함수 부만 간단히 정리하였다.
1) outlook 제어를 위한 COM 객체 선언 부분
<코드>
def att_down(foldername, downpath):
outlook = win32com.client.Dispatch("Outlook.Application").GetNamespace("MAPI")
inbox = outlook.GetDefaultFolder(6).Folders[foldername]
messages = inbox.Items
다음 편에 이어서 엑셀 파일을 취합하는 함수 코드를 작성할 것이기 때문에 메일에서 첨부파일을 다운로드하는 부분은 att_down이라는 함수로 정의하였다. 인수는 foldername, downpath 2가지이며 위에서 설명한 fn과 downpath 내용과 동일하다.
outlook, inbox, messages 부분은 이전 편에서도 설명했던 부분이라 생략한다.(참고 링크 : ybworld.tistory.com/2)
inbox는 outlook 받은 편지함-특정 폴더를 지칭하는 객체이며, messages는 inbox의 메일들을 읽어온다.
2) att_down 함수에서 메일 별로 for문을 통해 첨부파일 다운을 실행하는 부분
no = 1 #중복 파일명이 있을 것을 대비해 추가한 파일명 인덱스
m_count = 1 #메일 카운트
#각 메일마다 첨부파일을 다운로드 하는 루프
for ms in messages:
attachments = ms.Attachments #해당 메일의 첨부파일 개수(integer)
r = attachments.count
print(str(m_count)+"번째 메일 첨부파일 개수 : ",str(r)+"개")
m_count=m_count+1
for i in range(1, r + 1):
attachment = attachments.Item(i)
attachment.SaveASFile(downpath + str(no) + "_" + str(attachment)) # 파일명을 넣어야 함.
no = no + 1
-. no : 첨부파일 중 중복 파일명이 있을 수 있어 구분을 위해 기재한 인덱스 변수이다.(integer)
-. m_count : 없어도 되는 변수지만 메일을 카운트하기 위해 추가하였다.
-. 첫 번째 for문 : for ms in messages
위에서 지정했던 outlook 폴더의 메일 별로 루프를 도는 구문이다.
attagements = ms.Attagachments : 해당 메일의 첨부파일 개수가 몇 개인지 변수에 저장한다.
-. 두 번째 for문 : for i in range(1, r+1)
실제 메일에서 첨부파일을 경로에 다운로드하는 코드 부분.
attachments는 해당 메일의 첨부파일 리스트를 의미하고, attachment는 그 첨부파일 1개를 받음.
~. SaveASFile("경로"+"파일명")을 하면 정해진 경로에 첨부파일을 저장한다.
3) 실제 실행 부분
#첨부파일 다운로드 하기
fn = "test"
downpath = r"C:\Users\Desktop\VS CODE\첨부파일\"
att_down(fn, downpath)
함수를 호출하여 실행시키는 부분이다. fn과 downpath는 1.구현코드 항목에서 설명했으므로 내용을 생략한다.
다음 포스팅에서는 이 엑셀 파일을 취합하는 방법을 정리할 예정이다. pandas 또는 openpyxl을 활용할 예정이다.
'코딩 > 업무자동화' 카테고리의 다른 글
[파이썬/업무자동화] Outlook 메일 첨부 엑셀 내용 자동 취합하기 (0) | 2021.04.28 |
---|---|
[파이썬/업무자동화] YES24 전용 도서 구매 자동화 프로그램 -Selenium 응용 (6) | 2021.04.04 |
[파이썬/업무자동화] Openpyxl로 엑셀 함수 사용하기, 엑셀 수식 넣기 (0) | 2021.03.19 |
[파이썬/업무자동화] 같은 양식 여러 엑셀 파일을 한번에 수정하기 - openpyxl 모듈 (8) | 2021.03.07 |
[파이썬/업무자동화] 엑셀 원하는 시트만 분리하여 저장하기 (0) | 2021.03.05 |