Search

Python 20. 파이썬으로 email 보내기

Created at
2020/06/20
Updated at
2022/04/25
Tags
Keywords
업무자동화
3 more properties
업무 자동화는 많은 사람들이 파이썬을 배우는 이유이기도 하다. 특히 python으로 email을 보내는 방법을 알아두면 유용하게 사용할 수 있다. 광고 메일을 보내는 것은 물론이고, 나 자신이나 다른 사람들에게 자동화 메일을 보낼 수도 있다.
예를 들어 주기적으로 하는 특정 작업을 실행하고 결과를 이메일로 보낼 수도 있고, 머신러닝 학습이 끝나면 결과 데이터를 자동으로 파일 첨부하여 자신의 메일로 받아볼 수도 있을 것이다.
목차

1. Preparation

그럼 파이썬으로 이메일을 보내기 위한 준비를 해보자.

1.1 Importing necessary libraries

먼저 필요한 패키지들을 import해준다.
import os, pickle import smtplib # smtplib: 메일 전송을 위한 패키지 from email import encoders # 파일전송시 이미지/문서/동영상 파일을 문자열로 변환 from email.mime.text import MIMEText # 본문내용을 전송할 때 사용되는 모듈 from email.mime.multipart import MIMEMultipart # 복잡한 메시지 전송 시 사용하는 모듈 from email.mime.base import MIMEBase # 파일을 전송할 때 사용되는 모듈
Python
복사

1.2 Setting login information: email & password

password는 직접 노출하면 유출의 위험이 있으므로 아래와 같이 pickle 파일로 저장해서 이용하는 것이 좋다.
이 때, 본인의 지메일 비밀번호로는 보안상의 이유로 접근이 제한될 수 있다. 그럴 땐 앱 비밀번호를 발급(참고)해서 이용해보자.
# 비밀번호 저장하기 pw = "[your password]" pickle.dump(pw, open("./pw.pickle", 'wb'))
Python
복사
# 비밀번호 불러오기 email = "hyeshinoh@gmail.com" pw = pickle.load(open('pw.pickle', 'rb'))
Python
복사
메일을 보낼 주소들을 미리 저장해준다. 테스트를 위해 여러가지 주소로 보내고 싶은데 나는 계정을 여러 개 갖고 있지 않으므로, 내 이메일 주소인 hyeshinoh@gmail.com에서 hyeshinoh 뒤에 '+'와 아무 글자를 넣어주면 마치 여러 개의 이메일 주소인 것처럼 사용할 수 있다. 이렇게 쓰면 메일은 모두 hyeshinoh@gmail.com로 전송된다.
toAddr = ["panda706@naver.com", "hyeshinoh+11@gmail.com", "hyeshinoh+h@gmail.com"]
Python
복사

2. Send text

2.1 Access smtp server

smtp object를 생성한다.
smtp = smtplib.SMTP('smtp.gmail.com', 587) # 587: 서버의 포트번호 smtp.ehlo() smtp.starttls() # tls방식으로 접속, 그 포트번호가 587 smtp.login(email, pw) # 사용자 인증
Python
복사
(235, b'2.7.0 Accepted')

2.2 Make message

msg object를 생성하고 제목을 넣어준다.
msg = MIMEMultipart() # msg obj. msg['Subject'] = 'hyeshin의 SMTP Send Text 테스트'
Python
복사
msg object에 본문(text msg)을 추가해준다.
# text msg part = MIMEText('SMTP로 메일 보내기 본문 메시지입니다.') msg.attach(part) #msg에 part obj.를 추가해줌 msg
Python
복사
<email.mime.multipart.MIMEMultipart at 0x10d55d5f8>

2.3 email 전송하기

sendmail 메서드를 이용해 메일을 전송한다.
for addr in toAddr: msg["To"] = addr smtp.sendmail(email, addr, msg.as_string()) # object인 msg를 .as_string()으로 문자열 parsing print(addr)
Python
복사
panda706@naver.com hyeshinoh+11@gmail.com hyeshinoh+h@gmail.com
메일이 다음과 같이 잘 도착했다!
naver메일
gmail

2.4 HTML code 추가하기

part_html = MIMEText('<br><a href="https://github.com/hyeshinoh/">hyeshin github</a>', 'html') msg.attach(part_html) msg #msg 상태: 제목, 본문(text), html 코드
Python
복사
<email.mime.multipart.MIMEMultipart at 0x10d55d5f8>

2.5 email 전송하기

sendmail 메서드를 이용해 메일을 전송한다.
# email 전송 for addr in toAddr: msg["To"] = addr smtp.sendmail(email, addr, msg.as_string()) print(addr)
Python
복사
panda706@naver.com hyeshinoh+11@gmail.com hyeshinoh+h@gmail.com
smtp 연결을 끊어준다.
# smtp close smtp.quit()
Python
복사
(221, b'2.0.0 closing connection o68-v6sm26409410pfi.180 - gsmtp')

3. Send File

이제 파일을 첨부해서 이메일을 보내보자

3.1 Access smtp server

smtp object를 다시 생성해보자.
# Access smtp server smtp = smtplib.SMTP('smtp.gmail.com', 587) # 587: 서버의 포트번호 smtp.ehlo() smtp.starttls() smtp.login(email, pw)
Python
복사
(235, b'2.7.0 Accepted')

3.2 Make message

msg object를 생성하고 제목을 넣어준다.
msg = MIMEMultipart() msg['Subject'] = 'SMTP send file 테스트'
Python
복사
msg object에 본문(text msg)을 추가해준다.
part = MIMEText('SMTP로 send file 본문 메시지') msg.attach(part)
Python
복사
파일을 첨부해보자. 단, javascript file은 보안 상 이유로 보낼 수 없게 되어 있음
# Attach FILE path = 'apple.mp4' # ctype = 'application/octet-stream' # maintype, subtype = ctype.split('/', 1) with open(path, 'rb') as f: part = MIMEBase("application", "octet-stream") part.set_payload(f.read()) # payload: osi 7-layers encoders.encode_base64(part) # base64 encoding: 영상, 이미지 파일을 문자열로 변환 part.add_header('Content-Disposition', 'attachment', filename=path) msg.attach(part) msg # 제목, 본문, 파일
Python
복사
<email.mime.multipart.MIMEMultipart at 0x1159127f0>

3.3 email 전송하기

sendmail 메서드를 이용해 메일을 전송한다.
for addr in toAddr: msg["To"] = addr smtp.sendmail(email, addr, msg.as_string()) print(addr)
Python
복사
panda706@naver.com hyeshinoh+11@gmail.com hyeshinoh+h@gmail.com
메일이 다음과 같이 잘 도착했다!
naver메일
gmail
# smtp close smtp.quit()
Python
복사
(221, b'2.0.0 closing connection d22-v6sm9509327pfk.69 - gsmtp')
참고자료
패스트캠퍼스, ⟪데이터사이언스스쿨 8기⟫ 수업자료