본문 바로가기
Data Analysis/Python

[Python] 업무 자동화 - 2 : Python으로 Naver 이메일 보내기

by 불탄오징어 2020. 7. 29.
반응형

 

 

 

 

전번 포스트에서는 간단하게 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())

 

댓글