본문 바로가기

코딩/업무자동화

[파이썬/업무자동화] win32com.client 모듈을 활용한 Outlook 메일 자동보내기

반응형

※ Outlook 자동화 관련 포스팅

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

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

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

2021.04.28 - [코딩/업무자동화] - [파이썬/업무자동화] Outlook 메일 첨부 엑셀 내용 자동 취합하기


  이번 포스팅은 win32com.client 모듈을 통해 Outlook 메일 송신을 자동화하는 방법에 대해 포스팅.

 

 

1. 메일을 보내는 방법

 

1) import

 

엑셀 제어와 마찬가지로 win32com.client 모듈을 import 해야 한다.

 

import win32com.client

 

 

2) Outlook Application 에 대한 객체 생성

 

 

Outlook을 다루려면 Outlook appication에 대한 객체를 생성해야 한다. win32.com.client.Dispatch( ) 메서드를 사용하면 되는제 엑셀의 경우 "Excel.Application"을 입력하면 된다.

 

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

 

 

3) 메일을 보내기 위한 작성 창 열기(객체 생성)

 

 

위에서 생성한 outlook app 객체를 통해 메일 보내기 창을 생성한다. .CreateItem(0)은 메일을 보내기 창을 연다는 것을 의미하는 것 같다. 번호별로 의미는 나중에 따로 정리해보도록 하겠다.

 

send_mail = outlook.CreateItem(0)

 

 

4) Mail 보낼 때 필요한 정보 입력 : 위 send_mail 객체 활용

 

 

위에서 생성한 send_mail 객체를 통해 수신인, 참조, 메일제목, 메일 내용 등을 설정할 수 있다.

아래는 대표적인 3가지만 지정하였지만 참조의 경우 .CC="참조메일주소"를 입력하면 된다. 참고로, 메일 내용은 HTMLBody라는 속성을 통해 값을 입력하는데 html 형태로 입력할 수 있다.

 

send_mail.To = "메일주소@gmail.com" #메일 수신인
send_mail.Subject = "win32com Outlook 메일 전송 테스트 - 투손플레이스" #메일 제목
send_mail.HTMLBody = "test" #메일 내용(html)

 

 

 

5) 메일 전송

 

 

위에서 send_mail이라는 변수 객체에 대한 속성값들을 모두 지정해주면 아래 Send( ) 메서드를 통해 메일을 전송할 수 있다.

 

send_mail.Send()

 

 

6) 결과

 

 

위에서 내가 지정한 메일주소를 통해 메일을 보내면 Outlook - "보낸 편지함"에서는 메일이 전송된 것을 확인할 수 있다. 반대로 ~~@gmail.com 의 수신인 주소에서 메일이 수신된 것을 확인할 수 있다.

 

 

  -. Outlook(전송)

-. 수신

 

 

2. 응용

 

  위 메일 보내기 코드를 응용해서 실제 업무자동화 영역에 쓸 수 있는 코드를 작성해보았다. 아래와 같이 엑셀 파일에 이름 및 메일주소가 명시되어있는 파일이 있고 어떤 특정 내용을 단체로 보낸다고 생각해보자.

 

  사실 Outlook에도 찾아보면 단체 메일 보내는 기능이 찾아보면 있을 것 같긴 하다. 이번 포스팅은 파이썬 업무자동화 포스팅이므로 파이썬으로 코드를 작성해볼 것이다.

 

 

 

1) import

 

 

win32com.client 모듈과 엑셀의 데이터를 읽어오기 위한 openpyxl을 사용하였다. 사실 win32com.client를 통해 엑셀 데이터를 읽어와도 무방할 것 같다. 

 

import win32com.client
import openpyxl as op

 

 

2) 함수1 : readAddress

 

 

  readAddress 함수는 위 엑셀파일에서 이름과 메일주소를 읽어온다.

 

def readAddress(filepath):
    wb = op.load_workbook(filepath) #Workbook 객체 생성
    ws = wb.active #활성화 시트 객체 생성
    
    mail_list = [] #빈 리스트 생성
    for r in ws.rows: #엑셀파일 rows 속성 활용하여 for문
        temp_tuple = (r[0].value, r[1].value) #A열, B열 데이터 행별로 튜플로 저장
        mail_list.append(temp_tuple) #각 행별 튜플을 리스트에 추가
    del mail_list[0] #첫 제목행 제거
    return mail_list #리스트 리턴

 

-. 위에서 temp_tuple을 각각 출력해보면 아래와 같다.

 

-. 위 각 튜플을 빈리스트인 mail_list에 저장한다. 마지막에서 두번째 줄인 del mail_list[0]은 위 이미지에서 ('이름', '메일') 행을 제거하는 구문이다.

 

 

3) 함수2 : sendMail

 

 

sendMail은 함수1에서 리턴받은 mail_list를 매개변수로 입력받아 반복문을 진행한다. 각 이름,메일주소에 따라 메일을 전송한다. 자세한 내용은 주석을 통해 확인해보자.

 

def sendMail(mail_list : list):
    outlook = win32com.client.Dispatch("Outlook.Application") #Outlook App 객체 생성
 
    for send_one in mail_list: #mail_list(이름,메일주소)에 대한 리스트를 반복
        send_mail = outlook.CreateItem(0) #메일 보내기 창 객체 생성
        send_mail.To = send_one[1] #send_ond[1]은 메일주소를 의미함
        send_mail.Subject = send_one[0] + "님께 메일을 전달합니다." #send_one[0]은 이름을 의미함
        send_mail.HTMLBody = "메일테스트" #메일 내용
        send_mail.Send() #메일보내기

 

 

4) 결과

 

 

위 코드를 실행해보면 Outlook에서 각 이름,메일주소마다 메일을 모두 전송한 것을 확인할 수 있다. 제목에 이름을 활용하여 "~~님께 전달합니다."로 표시된다.

 

 

 

5) 전체 코드

 

import win32com.client
import openpyxl as op

def readAddress(filepath):
    wb = op.load_workbook(filepath)
    ws = wb.active
    
    mail_list = []    
    for r in ws.rows:
        temp_tuple = (r[0].value, r[1].value)
        mail_list.append(temp_tuple)
    del mail_list[0]
    return mail_list

def sendMail(mail_list : list):
    outlook = win32com.client.Dispatch("Outlook.Application")
    
    
    for send_one in mail_list:
        send_mail = outlook.CreateItem(0)
        send_mail.To = send_one[1]
        send_mail.Subject = send_one[0] + "님께 메일을 전달합니다."
        send_mail.HTMLBody = "메일테스트"
        send_mail.Send()


if __name__ =="__main__":
    mailpath= r"파일 전체 경로"
    mail_list = readAddress(mailpath)
    sendMail(mail_list)

 

 

 

 

 

 

 

 

728x90