본문 바로가기
SW 개발/Python

Python smtplib 사용한 email 발송 예제 (gmail)

by Kibua20 2020. 6. 28.

이전 Post에서는 우분투에 postfix를 설치하고 gmail을 전송을 하는 방법을 확인하였습니다. 본 글은 python 에 기본 내장되어 있는smtplib를 사용하는 방법에 대해서 정리하였습니다.  smtplib를 사용하면 간단하게 email 전송이 가능하나, python script 상에서 계정과 Password 가 노출된다는 문제점이 있습니다.   참고로, 아이디와 패스워드가 노출 없이 진행하기 위해서는 Google Gmail API를 사용할 수 있으며, 이는 access token으로 인증을 받아서  1 시간만 유효하기 때문에 보안 관점에서  유리합니다. 

 

[개발환경] - [Memo] 우분투에서 gmail활용하여 command line으로 email 전송

[모바일/REST API] - Google Gmail API 사용 방법 (1) - Sample code

[모바일/REST API] - Google Gmail API 사용 방법 (2) - Sample code

[모바일/REST API] - Google gmail API 사용 방법 (3) - Sample code

 

Gmail 서버의 SMTP 주소 및 포트 확인

Google support site에서는 SMTP 설정 방법을 확인할 수 있으며,  SMTP 서버 주소, 인증 방법 (SSL or TLS 등), 포트 번호만 있으면 적용 가능합니다. 

출처: https://support.google.com/mail/answer/7126229

 

 

* SMTP란 

두 메일시스템이 전자우편을 교환할 수 있게 하는 메세지 전송용 프로토콜임.  메일을 작성해서 보내시면 그 메일은 SMTP 서버(보내는 메일서버, Outgoing mailserver)로 일 전송되며  이SMTP 서버에서 SENDMAIL 프로그램을 구동하여 해당 메일 주소로 메일을 보내게 됩니다. 바로 이러한 역할을 하는것을 SMTP 서버, 보내는 메일서버, Outgoing mailserver 라고 합니다.


* SSL / TLS인증이란 (출처: 생활코딩)

SSL 인증서는 클라이언트와 서버간의 통신을 제3자가 보증해주는 전자화된 문서다. 클라이언트가 서버에 접속한 직후에 서버는 클라이언트에게 이 인증서 정보를 전달한다. 클라이언트는 이 인증서 정보가 신뢰할 수 있는 것인지를 검증 한 후에 다음 절차를 수행하게 된다. 네스케이프에 의해서 SSL이 발명되었고, 이것이 점차 폭넓게 사용되다가 표준화 기구인 IETF의 관리로 변경되면서 TLS라는 이름으로 바뀌었다. TLS 1.0은 SSL 3.0을 계승한다.

 

방법1: SSL 인증 방식 사용

python의 smptplib를 import 하고 아래와 같이  gmail 서버 주소(smtp.gmail.com)와 port 번호(465)를 입력으로 smptlib.SMTP_SSL() 호출하고  MIME 양식의 text를 만들어서 smtp.sendmail() 함수를 호출합니다 

# -*- coding:utf-8 -*-
import smtplib
from email.mime.text import MIMEText

def sendMail(me, you, msg):
    smtp = smtplib.SMTP_SSL('smtp.gmail.com', 465)
    smtp.login(me, 'your password')
    msg = MIMEText(msg)
    msg['Subject'] = 'TEST'
    smtp.sendmail(me, you, msg.as_string())
    smtp.quit()

if __name__ == "__main__":
    sendMail('yourid@gmail.com', 'yourid@gmail.com', '메일보내기')

 

방법 2: TLS 인증 방법 사용 

SSL 방식과 유사하고 포트 번호를 587로 설정하고 starttls() 함수를 호출한다.  출처: http://pythonstudy.xyz/

 

# -*- coding:utf-8 -*-
import smtplib
from email.mime.text import MIMEText

smtp = smtplib.SMTP('smtp.gmail.com', 587)
smtp.ehlo()     
smtp.starttls()  # TLS 사용시 필요
smtp.login('yourid@gmail.com', 'your password')

msg = MIMEText('본문 테스트 메시지')
msg['Subject'] = '테스트'
msg['To'] = 'yourid@gmail.com'

smtp.sendmail('yourid@gmail.com', 'yourid@gmail.com', msg.as_string())
smtp.quit()

 

일반 Text 파일과 HTML 파일은 은 email.mime.text.MIMEText 을 사용할 수 있고, 첨부 파일을 포함하는 경우에는 email.mime.multipart.MIMEMultipart을 사용할 수 있다.

 

기타 smtplib 예제

https://docs.python.org/ko/3/library/email.examples.html#email-examples

 

 

<관련 글>

[모바일/REST API] - Google Gmail API 사용 방법 (1) - Sample code

[모바일/REST API] - Google Gmail API 사용 방법 (2) - Sample code

[모바일/REST API] - Google gmail API 사용 방법 (3) - Sample code

[모바일/Python] - Python SyntaxError: Non-ASCII character in file on, but no encoding declared

[모바일/Python] - Python 2.7과 3.8호환성: a bytes-like object is required, not 'str'에러 수정

[모바일/Android] - repo 실행 시 DeprecationWarning: imp module 대처법

[모바일/Python] - [Tips] Python: XML Parsing 시 multiple elements on top level

[모바일/Python] - [Tips] Python 에서 XML comment 처리 - Sample code 제공

[모바일/Python] - [Tips] XML 에서 예약/특수 문자 처리

[개발환경] - [Memo] 우분투에서 gmail활용하여 command line으로 email 전송




댓글