Python은 기본 내장 모듈인 smtplib을 사용해 비교적 간단하게 이메일을 전송할 수 있다.
SMTP(Simple Mail Transfer Protocol)는 메일을 보낼 때 사용하는 프로토콜이다.
참고사항
- 이 글의 코드는 수신자 한 명에게 제목과 내용으로 구성된 메일을 보내도록 작성되었다.
- 이 글의 코드는 인터넷에 돌아다니는 코드를 클래스로 래핑(?)한 것이다.
동작 프로세스 :
메일 전송에 필요한 값 초기화 -> 객체 생성 -> 메일 작성 -> 메일 전송
따라서 코드를 그대로 사용할 생각이면 main 아래의 email_sender부터 body까지의 값을 적은 뒤 실행시키면 된다. - 메일 전송에 사용할 메일 서버의 주소와 포트는 미리 알아두어야 한다.
전체 코드
import smtplib
from email.mime.text import MIMEText
from email.mime.multipart import MIMEMultipart
class MailSender:
def __init__(self, email_sender, sender_passwd, email_recipient, email_server, email_server_port):
self.msg = MIMEMultipart()
self.sender = email_sender
self.passwd = sender_passwd
self.recipient = email_recipient
self.email_server = email_server
self.email_server_port = email_server_port
self.subject = ""
self.body = ""
def context(self, subject, body):
self.subject = subject
self.body = body
def write(self):
self.msg['From'] = self.sender
self.msg['To'] = self.recipient
self.msg['Subject'] = self.subject
self.msg.attach(MIMEText(self.body, 'plain'))
def send(self):
server = smtplib.SMTP(self.email_server, self.email_server_port)
server.ehlo()
server.starttls()
server.login(self.sender, self.passwd)
server.sendmail(self.sender, self.recipient, self.msg.as_string())
server.quit()
# ----- MAIN ------
# sender/recipient info
email_sender = '보내는 사람 주소'
sender_passwd = '메일 서버 비밀번호'
email_recipient = '받는 사람 주소'
email_server = '메일 서버 주소'
email_server_port = 587 # 메일 서버 포트
# mail context
subject = "제목"
body = "내용"
# init Mail essentail info
mail = MailSender(email_sender, sender_passwd, email_recipient, email_server, email_server_port)
# writing subject/body of mail
mail.context(subject, body)
mail.write()
# sending mail
mail.send()
아래는 의도한 것을 적어두었다.
왜 이렇게 했는가
1. import 부분
import smtplib # 메일 전송에 필요한 smtp 관련 모듈
from email.mime.text import MIMEText # 메일 본문 내용 생성
from email.mime.multipart import MIMEMultipart # 메일 data 영역의 메세지 생성
2. 생성자
class MailSender:
def __init__(self, email_sender, sender_passwd, email_recipient, email_server, email_server_port):
self.msg = MIMEMultipart() # 메세지 생성
self.sender = email_sender # 보내는 사람
self.passwd = sender_passwd # 메일 서버 접속 비밀번호
self.recipient = email_recipient # 받는 사람
self.email_server = email_server # 메일 서버 주소
self.email_server_port = email_server_port # 메일 서버 포트
self.subject = "" # 메일 제목
self.body = "" # 메일 본문 내용
클래스 속성은 클래스의 모든 인스턴스가 공유하는 속성이다. 딱히 공유해야 하는 속성은 없는 것 같아 전부 인스턴스 속성으로 선언했다.
다른 속성은 전부 값이 있어야 하지만, 메일의 제목과 내용이 없어도 메일은 보낼 수 있기 때문에 공백으로 초기화했다.
3. context 함수
def context(self, subject, body):
self.subject = subject
self.body = body
공백으로 초기화되었던 메일 제목과 내용을 사용자가 설정한 값으로 갱신한다.
4. write 함수
def write(self):
self.msg['From'] = self.sender
self.msg['To'] = self.recipient
self.msg['Subject'] = self.subject
self.msg.attach(MIMEText(self.body, 'plain'))
웹 상에서 메일을 작성하듯 보내는 사람, 받는 사람, 제목과 내용을 생성자에서 생성해둔 메세지에 초기화한다.
5. send 함수
def send(self):
# SMTP 세션 생성
server = smtplib.SMTP(self.email_server, self.email_server_port)
server.ehlo() # 연결 확인 (hello message)
# TLS 인증
server.starttls() # TLS로 접속
server.login(self.sender, self.passwd) # 메일 서버에 사용자 인증
server.sendmail(self.sender, self.recipient, self.msg.as_string())
# 연결 종료
server.quit()
생성한 메세지를 전송하는 부분이다.
6. Main 부분 - 값 세팅
# ----- MAIN ------
# sender/recipient info
email_sender = '보내는 사람 주소'
sender_passwd = '메일 서버 비밀번호'
email_recipient = '받는 사람 주소'
email_server = '메일 서버 주소'
email_server_port = 587 # 메일 서버 포트
# mail context
subject = "제목"
body = "내용"
메일 전송에 사용할 값을 설정한다. 생성한 MailSender 인스턴스는 이 값들을 메일 전송하는데 사용한다.
7. Main 부분 - 객체 생성 및 함수 호출
# init Mail essentail info
mail = MailSender(email_sender, sender_passwd, email_recipient, email_server, email_server_port)
# writing subject/body of mail
mail.context(subject, body)
mail.write()
# sending mail
mail.send()
인스턴스를 생성하고, 클래스에 정의해둔 함수를 호출하여 실제로 메일 전송을 수행한다.
다음은 첨부파일을 포함한 메일도 전송하려고 한다.