반응형
전번 포스트에서는 간단하게 Python으로 메일을 보내는 예제를 진행했습니다. 이번에는 간단한 데이터를 표로 변환하여 메일을 보내봅니다.
Python 코드 작성
# -*- coding:utf-8 -*-
import pandas as pd
import pyodbc
import smtplib
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText
# Database 접속
conn = pyodbc.connect("DSN=[DSN]; uid=[데이터베이스접속계정]; pwd=[데이터베이스접속비번]")
# 데이터를 가져올 쿼리
query = "SELECT DT, CLOSE_PRC, LOW_PRC FROM " \
"( " \
" SELECT" \
" *, ROW_NUMBER() OVER (ORDER BY DT DESC) AS RN" \
" FROM test..DD_STOCK_PRC WHERE CODE = '035720'" \
") A " \
"WHERE RN = 1"
# 데이터 가져오기
df = pd.read_sql(query, conn)
R 로 작성한 주식데이터를 바탕으로 진행했습니다. 먼저 pyodbc를 이용하여 ODBC 방식으로 데이터베이스에 접속하여 쿼리를 실행합니다. 그리고 그 결과를 data frame 형태로 가져옵니다. 가져온 데이터를 이메일에 담기 위해서는 html 형태로 변환이 필요한데 python에는 매우 유용한 함수가 있습니다.
df_html = df.to_html(index=False, justify='center')
위의 to_html() 함수를 사용하면 html 형태의 테이블 소스로 변환이 가능합니다.
그런데 말 그대로 테이블 형태로 변환한 거라 약간의 강조 작업이 필요하여 아래와 같이 html 내용일부를 변환합니다.
df_html = df_html.replace('<table border="1" class="dataframe">', '<table border="0" class="dataframe" bgcolor=black cellpadding=1 cellspacing=1><tr><td><table border="0" class="dataframe" bgcolor=black>')
df_html = df_html.replace('</table>', '</table> </td></tr></table>')
df_html = df_html.replace('<td>','<td bgcolor=white>')
df_html = df_html.replace('<th>','<th bgcolor=#e5e5e5>')
이렇게 강제 변환하지 않고 css 코드를 추가하는 방법도 있습니다. 그 다음 메일 본문 메시지와 html 태그 테이블 내용을 합하여 메일을 발송합니다.
msg_header = "안녕하세요 <br>" \
"아래의 지표 정리하여 메일드립니다." \
"<br><br>"
contents = msg_header + df_html
part1 = MIMEText(contents, 'html', _charset="utf8")
fromMail = "[보내는 메일 주소]"
toMail = "[받는 메일 주소]"
loginId = "[메일 계정 ID]"
loginPw = "[메일 발송 비밀번호]"
msg = MIMEMultipart('alternative')
msg['Subject'] = 'Python 메일보내기 (test)'
msg['From'] = fromMail
msg['To'] = toMail
msg.attach(part1)
smtp = smtplib.SMTP('smtp.naver.com', 587)
smtp.ehlo() # say Hello
smtp.starttls() # TLS 사용시 필요
smtp.login(loginId, loginPw)
smtp.sendmail(fromMail, toMail, msg.as_string())
smtp.quit()
발송까지 실행한 결과 다음과 같이 메일을 받을 수 있습니다.
만약 다수의 대상에게 동일한 메일을 보내고자 한다면 다음과 같이 수정해서 수행할 수 있습니다.
toMailList = ["aaaa@mail.net","bbbb@mail.net","cccc@mail.net"]
for toMail in toMailList:
smtp.sendmail(fromMail, toMail, msg.as_string())
'Data Analysis > Python' 카테고리의 다른 글
[Python] Google Colaboratory (2) | 2021.03.11 |
---|---|
[Python] 일원배치분산분석 (1-Way ANOVA) (0) | 2020.10.13 |
[Python] 업무자동화 - 1 : Python으로 Naver 이메일 보내기 (0) | 2020.07.17 |
[Python] 정규성 검정 (2) | 2020.01.27 |
[Python] K-means Clustering (0) | 2020.01.23 |
댓글