👨🏽‍💻

ch3 - 4. 이메일 발송하기

Email 보내기

Python에서 이메일을 보내기 위해 smtplib 모듈을 사용합니다.
이메일을 보내기 위해서는 SMTP 서버를 설치한 후 메일을 보낼 수 있지만, 구글이나 마이크로소프트 같은 많은 회사들에서 SMPT서버를 사용할 수 있도록 오픈하고 있습니다.
이를 이용하면 손쉽게 이메일을 보낼 수 있습니다.
 

1. SMTP란?

간이 전자 우편 전송 프로토콜(Simple Mail Transfer Protocal, SMTP)은 인터넷에서 이메일을 보내기 위해 이용되는 프로토콜 입니다.
SMTP는 주로 메시지 생성을 위한 로컬 편집이나 단순한 전자 우편 응용에서 사용됩니다. 전자 우편 응용은 메일 서버간의 송수신, 메일 클라이언트에서 메일 서버로 메일 보내기 등을 의미합니다.
메시지가 생성되면 호출된 SMTP가 메시지를 받고, TCP를 이용하여 다른 호스트의 SMTP에게 전달하는 방식으로 이루어집니다.
 

2. SMTP 흐름 및 응답코드

 
notion imagenotion image
 
 
notion imagenotion image

3. Email 보내기

이제 python을 이용해 이메일을 보내보도록 하겠습니다.
책에서는 발송이메일은 gmail, 수신이메일은 naver로 설정했습니다.
 

3.1 설정하기

[1] Google에 접속해 로그인 후 Gmail을 클릭합니다.
notion imagenotion image
 
[2] Gmail에 접속 후 오른쪽 위의 톱니바퀴를 눌러 설정으로 들어가줍니다.
notion imagenotion image
 
[3] 상단의 카테고리 중 '전달 및 POP/IMAP' 카테고리를 선택 후 아래의 그림과 같이 설정 후 '변경사항 저장'을 눌러주세요.
notion imagenotion image
 
[4] 아래의 사이트로 들어가 보안 수준이 낮은 앱의 액세스가 '허용'으로 설정되어 있는지 확인해주세요. '엑세스 차단'으로 되어 있으면 '허용'으로 바꿔주시길 바랍니다.
notion imagenotion image
 
만약 위의 방법대로 설정했음에도 불구하고 전송하는데 문제가 있을 경우 아래의 링크를 참고하시길 바랍니다. https://support.google.com/accounts/answer/6010255
 

3.2 텍스트 전송하기

[1] 필요한 패키지들을 import 해줍니다.
  • smtplib: SMTP를 사용하기 위한 모듈
  • os: 운영체제에서 제공되는 기능을 파이썬으로 수행할 수 있게 해주는 모듈
  • encoders: 파일전송을 할 때 텍스트 이외의 파일을 문자열로 변환할 때 사용하는 패키지
  • MIMEText: 메일을 보낼 때 메시지의 제목과 본문을 설정하기 위한 모듈
  • MINEMultipart: 메시지를 보낼 때 메시지에 대한 모듈
  • MINEBase: 파일을 전송할 때 사용되는 모듈
import smtplib, os from email import encoders from email.mime.text import MIMEText from email.mime.multipart import MIMEMultipart from email.mime.base import MIMEBase
 
[2] 발송이메일 주소와 비밀번호, 수신이메일 주소 & 편지내용을 적어주세요.
"""이메일 설정""" #발송 이메일 fromaddress = 'example_jeju_gdg@gmail.com' #발송할 이메일 주소를 입력해주세요 pw = '비밀번호 입력' #fromaddress의 비밀번호를 입력해주세요. 만약 비밀번호가 123이면 pw='123' #수신 이메일 toaddress = 'example_jeju_gdg@naver.com' #수신할 이메일 주소를 입력해주세요 """선택1: 이메일 제목 없이 보내기(이메일 내용만 입력하기)""" #실행 시 (제목없음)으로 전송됩니다 text = '이 메일은 영국에서 시작되었으며....(이하생략)' #원하는 내용을 입력해주세요 euc_text = text.encode('euc-kr') #text가 한국어로 이루어져 있다면 인코딩을 해주세요 """선택2: 이메일 제목을 설정하여 보내기""" #이메일 제목 msg = MIMEMultipart() msg['Subject'] = 'Python으로 보내는 이메일 테스트' #원하는 제목을 입력해주세요 #이메일 내용 입력 text = MIMEText('이 메일은 영국에서 시작되었으며....(이하생략)') #원하는 내용을 입력해주세요 #이메일 제목과 내용 합치기 msg.attach(text) msg["To"] = toaddress #선택: 입력하지 않을 시 (받는이없음)으로 전송됩니다
 
이메일 내용에 html을 입력하고 싶으시다면 아래와 같이 코드를 작성하시면 됩니다.
text = MIMEText('<br><a href="https://example_jeju_gdg.com</a>', 'html') #원하는 html 코드를 입력해주세요
 
[3] smpt 서버에 접속하여 이메일을 전송합니다.
Google의 smpt서버 포트번호는 https://support.google.com/mail/answer/7126229?visit_id=636859633059967405-2184782878&hl=ko&rd=1 에서 확인할 수 있습니다.
s = smtplib.SMTP('smtp.gmail.com', 587) #587: google smpt서버의 포트번호 s.starttls() #tls방식으로 smpt 서버 접속 s.login(fromaddress, pw) #fromaddress에 로그인 """선택1, 2에 따른 이메일 보내기""" s.sendmail(fromaddress, toaddress, euc_text) #선택1 전송방법 s.sendmail(fromaddress, toaddress, msg.as_string()) #선택2 전송방법 s.quit() #smtp 종료
 
[4] 코드를 실행하고 toaddress로 로그인하여 이메일을 확인합니다.
  • 선택1을 했을 시
notion imagenotion image
 
  • 선택2 + msg["To"]를 입력하지 않았을 시
notion imagenotion image
 
  • 선택2 + msg["To"]를 입력했을 시
notion imagenotion image
 

3.3 파일 전송하기

이제 파일을 첨부해서 이메일을 보내보겠습니다.
python을 이용하여 파일을 첨부해서 이메일을 보낼 수 있는데, javascript 파일은 보안 상 이유로 보낼 수 없도록 설정되어 있습니다. javascript 파일 이외의 모든 형식의 파일은 보낼 수 있습니다.
책에서는 3.2의 선택2에서 msg["To"]를 사용하지 않는 방식으로 이메일을 발송하였습니다.
 
notion imagenotion image
 
 
[1] smtp 서버에 다시 접속합니다.
s = smtplib.SMTP('smtp.gmail.com', 587) s.starttls() s.login(fromaddress, pw)
 
[2] 이메일에 파일을 첨부합니다.
msg = MIMEMultipart() msg['Subject'] = 'Python 파일첨부 테스트' text = MIMEText('Python 파일첨부 테스트 본문 내용') msg.attach(text) """파일 첨부""" files = r'C:\Users\사용자이름\Desktop\문서.pdf' #절대경로로 입력해주세요 files = files.encode("utf-8") #선택: 파일경로에 한글이 있으면 인코딩을 해주세요 part = MIMEBase("application", "octet-stream") part.set_payload(open(files, 'rb').read()) encoders.encode_base64(part) #base64 encoding: 영상, 이미지 파일을 문자열 형태로 변환합니다. part.add_header('Content-Disposition', 'attachment', filename='문서1.pdf') msg.attach(part)
 
[3] smpt서버에 접속하여 email을 전송합니다.
s.sendmail(fromaddress, toaddress, msg.as_string()) s.quit()
 
[4] 코드를 실행하고 toaddress로 로그인하여 이메일을 확인합니다.
notion imagenotion image
 
[참고]
filename을 '문서1'같이 형식을 지정해주지 않으면 다운받을 시 오른쪽 그림과 같이 형식이 없는 파일로 다운로드 됩니다.
파일을 실행하는데는 문제가 없지만, 원하는 형식으로 바로 다운받기 위해서는 filename에 '문서1.pdf'같이 형식을 붙여주시기 바랍니다.
 
notion imagenotion image
 

4. 참고사이트