Python

Python 텍스트 메일 전송

비번변경 2021. 6. 20. 00:43

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()

인스턴스를 생성하고, 클래스에 정의해둔 함수를 호출하여 실제로 메일 전송을 수행한다.


다음은 첨부파일을 포함한 메일도 전송하려고 한다.