본문 바로가기

Python

파이썬으로 메일 보내기

이메일은 SMTP(Simple Mail Transfer Protocol) 이라는 프로토콜을 사용합니다. 파이썬으로도 SMTP를 이용하여 메일을 발송할 수 있습니다. 파이썬에서는 smtplib이라는 라이브러리를 이용하여 메일을 보내게 됩니다. smtplib는 기본적으로 python에서 제공하는 라이브러리이기 때문에 별도로 설치하지 않아도 사용이 가능한 것으로 알고 있습니다. 하지만 어떤 이유에서든 제대로 import가 되지 않으신다면 아래의 pip install을 이용하여 설치하시기 바랍니다.


pip install smtplib


메일서버와 통신하기 위한 smtplib를 사용할 준비는 완료되었지만, smtplib는 통신을 위한 도구일뿐 이메일 자체를 만들어주지는 않습니다. 실제로 상대방에게 보낼 이메일은 email 라이브러리를 이용하여 만들어줄 수 있습니다. 이번에 해볼 예제는 단순한 텍스트 형식의 메일이므로 email 라이브러리 중에서도 MIMEText 를 import하여 사용하겠습니다. MIME는 Multipurpose Internet Mail Extensions의 약자입니다. from email.mime.text import MIMEText 형식으로 import가 가능합니다. 위와 마찬가지로 email 라이브러리도 기본적으로 제공되는 라이브러리이지만 import가 안되실 경우에는 위와 동일한 방법으로 설치해주시기 바랍니다.


pip install email


이제 개발을 위한 준비는 마쳤습니다. 추가로 필요한 것은 우리가 보내려는 메일을 직접 서비스해주는 서버를 준비하는 것입니다. 메일 서비스를 제공하는 메일 서버를 갖고 있으면 좋겠지만, 사용자가 메일 서버를 갖고 있는 경우는 없을 것입니다. 그렇기 때문에 메일을 발송해주는 외부 서비스를 이용하도록 합니다. 구글이나 MS에서 제공하는 SMTP 서버를 사용할 수 있는데 저는 Gmail을 사용하고 있기 때문에 구글의 SMTP 서버를 이용해서 메일을 보내보도록 하겠습니다. 


구글의 SMTP 서버 URL은 smtp.gmail.com 이며 TLS를 사용할 경우 port는 587 입니다. 메일을 발송할 때 어떤 방식으로 암호화할 것인가에 따라서 TLS와 SSL로 나누어지게 됩니다. 여기서는 자세히 설명하지는 않겠습니다.


추가적으로 구글의 SMTP 서버를 이용할 때는 외부 어플리케이션이 본인 계정으로 이메일을 발송할 수 있도록 보안 등급을 낮춰줘야만 합니다. 구글의 내 계정으로 접속하여 하단의 보안 수준이 낮은 앱 허용을 사용으로 체크해주면 됩니다. 구체적인 방법은 하단의 링크를 참고하시기 바랍니다.


https://support.google.com/accounts/answer/6010255?hl=ko


코드를 작성해보면서 설명하겠습니다.


# -*- coding:utf-8 -*-

# smtplib 과 MIMEText를 import 합니다.
import smtplib
from email.mime.text import MIMEText

# send_mail 함수에 구현하겠습니다.
def send_mail():
    # 메일 내용을 담을 문자열을 선언합니다.
    text = 'test message'

    # smtp 인스턴스를 만들어줍니다.
    # 인자값으로는 smtp 서버 url과 port가 들어갑니다.
    smtp = smtplib.SMTP('smtp.gmail.com', 587)

    # 초기에 서버와 handshaking 을 시도합니다.
    smtp.ehlo()
    # TLS를 이용해서 암호화할 것이므로 start tls 함수를 호출합니다.
    smtp.starttls()

    # smtp 서버 로그인을 위해 id 와 password를 인자로 하여 login 함수를 호출합니다.
    # id는 @가 들어간 email형식으로 입력합니다.
    smtp.login('id' 'password')

    # MIMEText 인스턴스에는 보내려는 메일 내용을 인자값으로 넣어줍니다.
    message = MIMEText(text)
    # 메일 제목은 Subject, 보내는 사람은 From, 받을 사람 정보는 To로 설정합니다.
    message['Subject'] = 'mail subject'
    message['From'] = 'from email address'
    message['To'] = 'to email address'

    # smtp sendmail 함수를 이용하여 실제로 메일을 발송해줍니다.
    smtp.sendmail('from email address', 'to email address', message.as_string())

    # smtp quit 함수로 인스턴스를 종료시킵니다.
    smtp.quit()