본문 바로가기

programming/내가 만들고 싶어서 만든 것!

Python을 활용한 메일전송 - SMTPlib의 사용

반응형

1.개요

 

 Django를 공부하면서 SMTPlib를 사용하여 메일을 보낼 수 있다는 것을 알게 되었다. 책에 있는 예제를 그대로 따라하기만 했지만 내가 직접 문서를 찾아봐서 방법들을 정리해볼 생각이다. 메일을 보내는 기본적인 기능이 되었지만 그만큼 유용하기에 확실하게 알아두어야 할 것 같아서 정리하였다.

 

2. SMTP란?

 

 Python 공식 페이지에서 제공하는 자료를 보자. SMTP에 대해 찾아보면 다음과 같이 나와있다.


smtplib 모듈은 SMTP나 ESMTP 리스너 데몬을 사용하여 모든 인터넷 기계로 메일을 보내는 데 사용할 수 있는 SMTP 클라이언트 세션 객체를 정의합니다.


 뭔가 어려워보이지만, 간단하게 정리하자면 다음과 같다. "Python을 사용하여 메일을 보낼 수 있게 해주는 라이브러리" 그럼 이 라이브러리를 사용하는 방법을 알아보자.

 

 이 라이브러리를 통해 메일을 보내는 법을 알아보기전에 알아볼 것은 어떤 메일 클라이언트를 사용할 것인지이다. 필자가 검색해본 결과로는 Live와 gmail을 통해 메일을 보낼 수 있다. 우리에게 친숙한 네이버를 사용할 수 있지만 이는 더 찾아보길바란다. Live는 마이크로소프트에서 지원하는 메일클라이언트고 gmail은 모두가 알고 있듯이 googl에서 지원하는 메일서비스이다. 이번 포스팅에서는 gmail을 사용하는 방법을 알아볼 것이다.

 

 가장 먼저 해야할 일은 SMTP라는 인스턴스를 통해 STMP를 연결해주는 것이다. (캡슐화하다 라고 해석했지만 편의를 통해 이렇게 적었다.) 다음은 예시 코드이다.

 

s = smtplib.SMTP('smtp.gmail.com', 587)

 

 위의 인수로 들어가는 'smtp.gmail.com'과 587은 고정된 값이다. 내가 찾아본 자료로는 smtp.gmail.com은 smtp에서 구글을 사용할 때 접속하는 서버명이고 587은 포트 번호이다. 필자가 읽은 책에서는 587이 아닌 포트번호 465를 사용하였기에 이 둘의 차이점을 찾아보았다.

 

 간단하게 정리하자면 587은 TLS의 방식을 사용할 때의 포트번호이고 465는 SSL 방식을 사용할 때의 포트번호이다. 자신의 원하는 보안 방식으로 사용하면 된다. 보통의 웹사이트는 이 두개를 다 지원하지만 가끔가다 하나의 하나의 방식만을 지원하는 곳이 있기 때문이다. 참고로 Gmail에서권장하는 방식은 587 포트를 사용하는 TLS 방식이다. 두개의 방법을 동시에 사용하는 방법은 다음과 같다.

 

- TLS 방식

 

server = smtplib.SMTP('smtp.gmail.com', 587)
server.starttls()

 

- SSL 방식

 

server = smtplib.SMTP_SSL('smtp.gmail.com',465)

 

 TLS방식은 starttls()라는 메소드를 호출하는데 보안상의 이유 때문에 사용한다라고 생각하고 넘어가자. 간단하게 설명하자면 SSL방식에서 보안적으로 향상된 방식이 TLS이고 그만큼 TLS는 보안상으로 안정적이다. 따라서 TLS를 사용하는 것이 더 좋다고 볼 수 있지만 SSL을 경우에 따라 사용하기도 한다고 한다. 

 

 자 이제 설정은 끝났으니 메일을 보내보자. 우리가 메일을 보낼 때 필요한 것이 무엇필요한지 먼저 생각해보자. 아마도 보내는사람의 주소, 받는 사람의 주소, 메일의 제목, 메일의 내용 일것이다. 그럼 이제 이것들을 설정해주기만 하면 된다. 먼저 MIMEMultipart() 인스턴스를 변수로 할당받아 설정을 진행해주면 된다. 예제코드는 다음과 같다.

 

msg = MIMEMultipart("alternative")

msg['From'] = "보내는 사람 메일 주소"
msg['To'] = "받는 사람 메일 주소"
msg['Subject'] = "메일 제목"
body = "메일내용"

msg.attach(MIMEText(body, '형식')) 

 

 위의 예제코드를 보면 msg라는 변수에 MIMEMultipart()라는 인스턴스를 할당 받았다. 여기서 인수로 넘겨주는 "alternative"는 같은 content를 다르게 렌더링 할 때 유용하다는 자료를 보았는데, 사실은 넘기려고 한다...... 이부분은 조금 더 찾아보고 포스팅 할 것이다.( 제대로 해석한지도 모르겠다...) 밑에 메소드를 보면 메일을 보낼 때 필요한 정보를 설정하는 방법이 나와있다. 만약 보내는 사람의 메일주소 즉 자신의 메일주소가 "sender@gmail.com"이고 받는 사람의 주소가 "example@naver.com"이라면 다음과 같이 설정하면 된다.

 

msg['From'] = "sender@gmail.com"
msg['To'] = "example@naver.com"

 

 그 밑의 방법은 보내려는 메일의 본체 즉 body 변수에 담기는 내용의 형식에 따라 설정된다. 만약 일반적인 평문을 msg에 넣어주고 이를 할당하려면 다음과 같이 하면 된다.

 

body = "Hello world"
msg.attach(MIMEText(body, 'plan'))

 

 body에 보내려는 문자열 "Hello world"를 넣어주고 이를 MIMEText() 메소드에 할당하면서 같이 "plain"을 같이 넘겨주었다. 만약 한글을 할당하려면 다른 인수를 넣어줘야한다. 이는 직접 찾아보기 바란다. 마지막 예시로 HTML형식의 문자를 보내는 방법을 알아보자. 이는 다음과 같다.

 

body = "<html><body><h1> Hello world </h1></body></html>"
msg.attach(MIMEText(body, 'html'))

 

 이렇게하면 Hello world라는 문자열만 메일로 전송된다. 팁을 주자면 한글을 보내는 것은 어렵지만 HTML파일로 한글을 보내는 것은쉽다. 따라서 한글을 메일로 보내려면 구글링을 하지 말고 다음과 같이 HTML파일을 사용하는 것을 추천한다.

 

 마지막으로 설정된 메일을 보내고 서버연결을 종료해주자. 다음과 같은 메소드를 통해 전송할 수 있다.

 

server.sendmail(msg['From'],msg['To'],msg.as_string())
server.quit()

 

 이제 sendmail() 메소드에 차례로 넣어주면서 메일을 전송해주고 quit() 메소드를 통해 이를 종료해주면 된다. 여기서 알아야할 점은 여러 사람들에게 메일을 보내고 싶을 때는 msg['To']자리에 리스트 형식으로 보낼 수 있다는 것이다. 다음은 예시이다.

 

server.sendmail(msg['From'],msg['To'].split(','),msg.as_string())
server.quit()

 

 split()을 통해 여러개로 나눈 후 인수로 전달해주면 된다. 다음은 총 정리된 코드이다.

 

import smtplib
from email.mime.text import MIMEText
from email.mime.multipart import MIMEMultipart

server = smtplib.SMTP('smtp.gmail.com', 587)
server.starttls()
server.login("아이디","비밀번호")

mail_html = "<html><body><h1> Hello world </h1></body></html>"

msg = MIMEMultipart('alternative')
msg['Subject'] = "Title"
msg['From'] = "보내는 메일 주소 (자신의 아이디)"
msg['To'] = "받는 사람의 메일 주소"
mail_html = MIMEText(mail_html,'html')
msg.attach(mail_html)


server.sendmail(msg['From'],msg['To'].split(','),msg.as_string())
server.quit()

 

- 참고

 

 gmail을 사용하려면 자신의 gmail아이들을 보안설정해야한다. 이 방법을 간략하게 설명하자면 다음과 같다. 구글 계정 설정의 보안칸에 접속하여 다음과 같은 화면을 찾아보자.



 여기서 엑세스 사용 설정을 허용해준 후 사용해야 한다.

 

- 참고자료


- www.geewww.geeksforgeeks.org/send-mail-attachment-gmail-account-using-python/ksforgeeks.org/send-mail-attachment-gmail-account-using-python/

 

- blog.npcode.com/2012/09/25/smtp-%EC%84%A4%EC%A0%95%EC%97%90%EC%84%9C-ssl%EA%B3%BC-tls%EC%9D%98-%EC%B0%A8%EC%9D%B4/

 

- stackoverflow.com/questions/33775903/how-to-send-a-email-body-part-through-mimemultipart

 

- 서적: Django 한그릇 뚝딱, 문범우 지음


 

반응형