인사 업무를 하다보면 다수의 대상에게 이메일로 공지 또는 안내 사항을 전달해야 할때가 많이 있습니다. 한번에 전체 대상자를 수신인으로 지정하여 하나의 메일을 보낼수도 있고, 또는 수신인 한명 한명에게 각기 다른 내용의 메일을 보내기도 합니다. 실제 업무 상황으로 예를 들어보자면 법정 필수교육을 이수하지 않은 직원들에게 리마인드 메일을 보내는 경우는 전자, 채용 지원자들에게 합/불 여부를 안내하는 메일을 보내는 경우는 후자에 해당할텐데요, 오늘 소개드릴 이메일 자동화는 후자의 경우 뿐만 아니라 전체 공지 메일을 보내는 상황에서도 인사담당자의 업무 효율을 크게 높여줄 것이라고 생각합니다. 다수를 대상으로 쓰여진 공지메일 보다는 한사람 한사람에게 보내는 개인화된 메일이 훨씬 효과적일 때가 많기 때문입니다.
본 포스트에서는 파이썬과 아웃룩을 활용하여 채용 합격 안내 메일을 자동으로 생성하고 발송하는 예시를 소개하겠습니다. 시작 전 준비물로 메일 템플릿과 발송 대상자 정보가 필요한데요, 이부분은 크게 시간쓰지 않고 ChatGPT의 도움을 받아보겠습니다. (내용이 다소 어색하지만 연습용이니 수정 없이 그대로 쓰겠습니다.)
또한 아웃룩을 통한 이메일 자동화이기 때문에 아웃룩이 설치되어있어야 합니다.
먼저 아웃룩 메시지를 생성하는 가장 기본적인 코드는 다음과 같습니다. 아래 코드를 실행하게 되면 아웃룩 보낼편지함에 메일이 생성되어 저장됩니다.
import win32com.client as client
outlook = client.Dispatch("Outlook.Application")
message = outlook.CreateItem(0)
message.To = 'test@test.com' # 수신
message.CC = 'test@test.com' # 참조
message.BCC = 'test@test.com' # 숨은참조
message.Subject = 'Title' # 메일 제목
message.body = 'Content' # 메일 본문
message.Save() # 보낼편지함(Draft)폴더에 메시지를 저장 # message.Send()로 바꾸면 메시지가 발송됨
메일 대상자 정보를 가져오기위해 ChatGPT가 만들어준 가짜 지원자 정보를 가져오겠습니다.
import pandas as pd
data = {
'지원자 성명': ['홍길동', '김영희', '이철수', '박지원', '정민지', '최성민', '이지영', '박태호', '한승민', '김지수'],
'지원한 직무명': ['마케팅 전략기획', '개발자', '영업 담당자', '인사 담당자', '디자이너', '금융 분석가', '비즈니스 컨설턴트', '프로젝트 매니저', '고객지원 담당자', '데이터 분석가'],
'입사 예정일': ['2023-06-15', '2023-06-20', '2023-06-25', '2023-07-01', '2023-07-05', '2023-07-10', '2023-07-15', '2023-07-20', '2023-07-25', '2023-07-30'],
'입사 장소': ['서울', '부산', '대구', '인천', '광주', '대전', '울산', '세종', '경기', '강원'],
'이메일 주소': ['hong@example.com', 'kim@example.com', 'lee@example.com', 'park@example.com', 'jeong@example.com', 'choi@example.com', 'leeji@example.com', 'parktae@example.com', 'han@example.com', 'kimjisu@example.com']
}
df = pd.DataFrame(data)
# 더미데이터를 직접 생성하는 것이 아니라 엑셀파일로 이미 있는 데이터를 읽어올 경우에는
# 다음 코드를 사용하시면 됩니다. df = pd.read_excel('파일경로/파일명.xlsx')
iterrows 함수를 이용해 지원자별로 이메일을 만들어 보겠습니다. iterrows함수는 DataFrame안의 모든 index와 row를 iterate하며 각 row의 특정 column값은 r['컬럼명'] 형식으로 가져올 수 있습니다.
회사명 = '가짜주식회사'
리크루터_성명 = '김둘리'
연락처 = '010-1234-1234'
이메일주소 = 'Doolie@fake.com'
for i, r in df.iterrows():
message = outlook.CreateItem(0)
message.To = r['이메일 주소']
message.Subject = '최종 면접 합격 안내 및 입사 안내'
message.body = f'''안녕하세요 {r['지원자 성명']}님,
저희 회사에서 진행한 {r['지원한 직무명']} 지원에 대한 최종 면접 결과를 안내드리고자 합니다. 기쁜 소식으로 연락드려, {회사명}에 입사하실 것을 환영합니다!
면접에서 보여주신 열정, 능력, 그리고 전문성은 저희에게 큰 영감을 주었습니다. 당신의 경험과 기술이 우리 조직에 가치를 더할 것이라 믿고 있습니다.
입사 일정은 다음과 같이 예정되어 있습니다:
입사 예정일: {r['입사 예정일']}
입사 장소: {r['입사 장소']}
입사 전에 몇 가지 준비사항을 안내드리겠습니다:
사원 계약서 및 기타 관련 문서를 제출하기 위해 필요한 신분증, 사진 등의 개인 신상정보를 준비해주시기 바랍니다.
준비하신 개인 노트북이 있다면, 입사 첫 날에 가져오시면 됩니다.
복장은 업무 협의에 따라서 캐주얼 또는 비즈니스 캐주얼로 입어주시면 됩니다.
입사와 관련된 추가 정보는 별도로 안내될 예정입니다. 만약 어떠한 질문이나 요청사항이 있다면, 언제든지 연락 주시기 바랍니다.
다시 한번 축하드리며, {회사명}의 일원이 되신 것을 진심으로 환영합니다. 향후 함께 성장하고 발전해 나갈 수 있기를 기대합니다.
감사합니다.
좋은 하루 보내세요!
{리크루터_성명}
{회사명}
{연락처}
{이메일주소}
'''
message.Save()
메일 내용은 f-string으로 정의하였습니다. string 안에 특정 변수의 값을 삽입하고싶을 경우 f-string을 사용하는데 해당 개념이 익숙치 않으신 분들은 아래 예시를 참고하시면 될 것 같습니다.
성명 = '홍길동'
인삿말 = '안녕하세요.'
print(성명 + '님 ' + 인삿말)
>> 홍길동님 안녕하세요.
성명 = '홍길동'
인삿말_fstring = f'{성명}님 안녕하세요.'
print(인삿말_fstring)
>> 홍길동님 안녕하세요.
각 대상자별 메일 생성이 완료되었습니다.
이대로 코드 마지막줄을 message.Send()로 바꾸어 발송할 수도 있겠지만 디자인에 대한 욕심이 있으신 분들을 위해 심화 버전도 소개드립니다.
심화1. HTML로 서식 정의하기
메일에 디자인을 더하기 위해서는 HTML에 대한 얕은 지식이 요구되는데요, 유튜브에 올라온 강의 등을 하나 정도만 찾아보아도 개념을 어렵지 않게 이해하실 수 있을 것 같습니다. 해당 내용을 많이 많이 단순화하고 왜곡하여 예시를 통해 설명드리자면, HTML에서는 텍스트를 구간구간 나누고 각 구간별로 폰트 등 스타일을 정의할 수 있습니다.<div> </div> 사이에 원하는 텍스트를 넣어서 구간을 만들어주고 각 구간에 대한 스타일을 정의하여 서식을 적용시킬 수 있습니다.
<html>
<div style = "font-family: 맑은 고딕;
font-size : 20pt;">
첫번째 구간입니다.
</div>
<div style = "font-family: 굴림;
font-size : 10pt;">
두번째 구간입니다.
</div>
</html>
자주 사용하는 style 변수를 소개하자면 다음과 같습니다.
- margin : 상우하좌 여백을 지정할 수 있습니다. margin-top, margin-left 등 원하는 부분만 지정할수도 있습니다.
예시. margin : 0px 10px 15px 20px = 상단여백 0픽셀, 우측여백 10픽셀, 하단여백 15픽셀, 좌측여백 20픽셀 - font-family : 폰트 종류를 의미합니다. 원하는 폰트명을 작성하면 됩니다.
- font-size : 폰트 사이즈로 다양한 단위가 있지만 익숙한 pt(포인트)를 단위로 사용하면 편합니다.
- line-height : 줄간격을 의미합니다.
- color : 폰트색상을 의미합니다. 배경색을 바꾸고싶을때는 background-color를 이용하면 됩니다.
- border : 테두리 입니다. 유형(solid, dotted, dashed 등), 두께, 색상 순으로 정의합니다.
예시. border-bottom:solid 3px #00ADB5;
디자인을 적용한 코드 예시입니다.
for i, r in df.iterrows():
message = outlook.CreateItem(0)
message.To = r['이메일 주소']
message.Subject = '최종 면접 합격 안내 및 입사 안내'
message.HTMLbody = f'''
<html>
<table>
<tr>
<td width="700"
padding:10px;">
<div style = "font-family:Noto Sans KR Medium;
font-size : 18pt;
font-weight: bold;
line-height: 90%;
color:#00ADB5;">
[{회사명}]
</div>
<div style = "font-family:Noto Sans KR Medium;
font-size : 24pt;
font-weight: bold;
line-height: 90%;
color:#00ADB5;
margin-bottom:16pt;
border-bottom:solid 3px #00ADB5;">
합격을 축하합니다.
</div>
<div style = "font-family:Noto Sans KR Light;
font-size : 12pt;
line-height: 100%;
">
안녕하세요 {r['지원자 성명']}님,<br><br>
저희 회사에서 진행한 {r['지원한 직무명']} 지원에 대한 최종 면접 결과를 안내드리고자 합니다. 기쁜 소식으로 연락드려, {회사명}에 입사하실 것을 환영합니다!<br><br>
면접에서 보여주신 열정, 능력, 그리고 전문성은 저희에게 큰 영감을 주었습니다. 당신의 경험과 기술이 우리 조직에 가치를 더할 것이라 믿고 있습니다.<br><br>
입사 일정은 다음과 같이 예정되어 있습니다:<br><br>
입사 예정일: {r['입사 예정일']}<br>
입사 장소: {r['입사 장소']}<br><br>
입사 전에 몇 가지 준비사항을 안내드리겠습니다:<br><br>
사원 계약서 및 기타 관련 문서를 제출하기 위해 필요한 신분증, 사진 등의 개인 신상정보를 준비해주시기 바랍니다.<br>
준비하신 개인 노트북이 있다면, 입사 첫 날에 가져오시면 됩니다.<br>
복장은 업무 협의에 따라서 캐주얼 또는 비즈니스 캐주얼로 입어주시면 됩니다.<br>
입사와 관련된 추가 정보는 별도로 안내될 예정입니다. 만약 어떠한 질문이나 요청사항이 있다면, 언제든지 연락 주시기 바랍니다.<br><br>
다시 한번 축하드리며, {회사명}의 일원이 되신 것을 진심으로 환영합니다. 향후 함께 성장하고 발전해 나갈 수 있기를 기대합니다.<br><br>
감사합니다.<br><br>
좋은 하루 보내세요!<br><br>
{리크루터_성명}<br>
{회사명}<br>
{연락처}<br>
{이메일주소}<br>
</div>
</td>
</tr>
</table>
</html>
'''
message.Save()
심화2. 메일 본문에 이미지 넣기
for i, r in df.head(1).iterrows():
message = outlook.CreateItem(0)
message.To = r['이메일 주소']
message.Subject = '최종 면접 합격 안내 및 입사 안내'
## 이미지 추가 ##
image = message.Attachments.Add('이미지파일경로/image.png')
image.PropertyAccessor.SetProperty("http://schemas.microsoft.com/mapi/proptag/0x3712001F", "image")
## 이미지 추가 ##
message.HTMLbody = f'''
<html>
<table>
<tr>
<td width="700"
padding:10px;">
## 이미지 추가 ##
<img src='cid:image' width="100">
## 이미지 추가 ##
<div style = "font-family:Noto Sans KR Medium;
font-size : 18pt;
font-weight: bold;
line-height: 90%;
color:#00ADB5;">
[{회사명}]
</div>
<div style = "font-family:Noto Sans KR Medium;
font-size : 24pt;
font-weight: bold;
line-height: 90%;
color:#00ADB5;
margin-bottom:16pt;
border-bottom:solid 3px #00ADB5;
display:inline">
합격을 축하합니다.
</div>
<div style = "font-family:Noto Sans KR Light;
font-size : 12pt;
line-height: 100%;
">
안녕하세요 {r['지원자 성명']}님,<br><br>
저희 회사에서 진행한 {r['지원한 직무명']} 지원에 대한 최종 면접 결과를 안내드리고자 합니다. 기쁜 소식으로 연락드려, {회사명}에 입사하실 것을 환영합니다!<br><br>
면접에서 보여주신 열정, 능력, 그리고 전문성은 저희에게 큰 영감을 주었습니다. 당신의 경험과 기술이 우리 조직에 가치를 더할 것이라 믿고 있습니다.<br><br>
입사 일정은 다음과 같이 예정되어 있습니다:<br><br>
입사 예정일: {r['입사 예정일']}<br>
입사 장소: {r['입사 장소']}<br><br>
입사 전에 몇 가지 준비사항을 안내드리겠습니다:<br><br>
사원 계약서 및 기타 관련 문서를 제출하기 위해 필요한 신분증, 사진 등의 개인 신상정보를 준비해주시기 바랍니다.<br>
준비하신 개인 노트북이 있다면, 입사 첫 날에 가져오시면 됩니다.<br>
복장은 업무 협의에 따라서 캐주얼 또는 비즈니스 캐주얼로 입어주시면 됩니다.<br>
입사와 관련된 추가 정보는 별도로 안내될 예정입니다. 만약 어떠한 질문이나 요청사항이 있다면, 언제든지 연락 주시기 바랍니다.<br><br>
다시 한번 축하드리며, {회사명}의 일원이 되신 것을 진심으로 환영합니다. 향후 함께 성장하고 발전해 나갈 수 있기를 기대합니다.<br><br>
감사합니다.<br><br>
좋은 하루 보내세요!<br><br>
{리크루터_성명}<br>
{회사명}<br>
{연락처}<br>
{이메일주소}<br>
</div>
</td>
</tr>
</table>
</html>
'''
message.Save()
3. 표 삽입하기
HTML 코드로 표를 만들수도 있습니다.
예시 코드를 소개드리니 필요에 따라 수정하여 사용하시면 될 것 같습니다.
<table style="border-collapse: collapse;
font-family:Noto Sans KR Light;
font-size:10pt;
width:600px;
text-align: center;
">
<tr>
<th style="border: 1px solid gray;
color:white;
background-color:#00ADB5;
padding:6px;
">헤더1
</th>
<th style="border: 1px solid gray;
color:white;
background-color:#00ADB5;
padding:6px;
">헤더2
</th>
<th style="border: 1px solid gray;
color:white;
background-color:#00ADB5;
padding:6px;
">헤더3
</th>
</tr>
<tr>
<td style="border: 1px solid gray;
padding:6px;">
내용1
</td>
<td style="border: 1px solid gray;
padding:6px;">
내용2
</td>
<td style="border: 1px solid gray;
padding:6px;">
내용3
</td>
</tr>
<tr>
<td style="border: 1px solid gray;
padding:6px;">
내용4
</td>
<td style="border: 1px solid gray;
padding:6px;">
내용5
</td>
<td style="border: 1px solid gray;
padding:6px;">
내용6
</td>
</tr>
<tr>
<td style="border: 1px solid gray;
padding:6px;">
내용7
</td>
<td style="border: 1px solid gray;
padding:6px;">
내용8
</td>
<td style="border: 1px solid gray;
padding:6px;">
내용9
</td>
</tr>
</table>
쭉 따라하시면서 추가로 궁금한점이 있는분들은 댓글 남겨주세요!
감사합니다~
'코딩' 카테고리의 다른 글
OPENDART API를 활용하여 파이썬으로 기업 정보 검색하기 (0) | 2023.08.19 |
---|---|
파이썬 Chat GPT로 인사 평가 의견을 자동 요약하기 (1) | 2023.06.27 |
회사는 직원들의 ChatGPT사용을 규제해야 할까요? (0) | 2023.06.05 |
파이썬으로 PPT 노가다 자동화 하기 (4) | 2023.06.02 |
파이썬으로 Chat GPT에게 외부 정보 학습시키기 (3) | 2023.05.25 |