본문 바로가기

코딩/업무자동화

[파이썬/업무자동화] Outlook 여러 메일 첨부 파일 한번에 받기

반응형

※ 이 글을 쓰는 사람은 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을 활용할 예정이다.

728x90