※ 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)
'코딩 > 업무자동화' 카테고리의 다른 글
[책 소개] 사장님 몰래 하는 파이썬 업무자동화 (2) | 2021.12.20 |
---|---|
[파이썬/업무자동화] win32com.client 사용해서 엑셀 시트 다루기 (0) | 2021.12.14 |
[파이썬/업무자동화] win32com.client 사용해서 엑셀 사용하기 기초 (0) | 2021.11.23 |
[파이썬/업무자동화] openpyxl - Cell의 데이터를 지우는 3가지 방법 (0) | 2021.11.17 |
[파이썬/업무자동화] openpyxl 시트 조작 방법 4가지 (0) | 2021.11.09 |