안녕하세요. 이번 글에서는 Python에서 이메일을 SMTP로 보내는 예제를 다루어보겠습니다.
가장 흔히 쓰는 메일 사이트 중 하나인 지메일을 예시로 들 것이며,
기본 텍스트 이메일부터 첨부 파일 및 본문 이미지가 포함된 심화 예시까지
전부 다루어보며 전반적인 과정에 대하여 이해를 해보도록 하겠습니다.
필요조건: 구글 보안 및 Gmail 설정
구글 이메일에서 smtp 프로토콜로 이메일 보내기 기능을 활용하려면,
구글 보안 및 Gmail에서 일부 설정 과정이 필요합니다. 이는 다음과 같습니다.
1. 구글 계정 페이지에서 앱 비밀번호를 검색합니다.
(단, 메일을 보내려는 해당 계정에 2단계 인증이 활성화되어 있어야 합니다.)
2. 원하는 앱 비밀번호의 이름을 적고, 만들기를 진행합니다.
3. Gmail 페이지의 설정 메뉴 > 모든 설정 보기 탭을 클릭합니다.
4. 전달 및 POP/IMAP 탭에서 IMAP 사용으로 체크 후, 변경사항 저장을 클릭합니다.
이때, 본인 인증 과정이 추가로 필요할 수 있습니다.
필요 파이썬 모듈 import
import smtplib
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText
from email.mime.base import MIMEBase
from email.mime.image import MIMEImage
from email import encoders
smtp 메일 송신 과정에서 필요한 라이브러리들을 임포트해줍니다.
모두 Python 표준 라이브러리이기에 별도 설치가 필요하지는 않습니다.
1. 지메일 보내기 기본 예제(only 텍스트)
먼저, 본문이 텍스트로만 구성된 Gmail을 자동으로 보내는 예시 코드를 보겠습니다.
비밀 번호는 위에서 생성한 앱 비밀번호를 입력해주시면 되며,
제목, 본문 및 받는 사람의 이메일을 input으로 받는 함수 코드 스니펫은 다음과 같습니다.
def send_email(subject, body, to_email):
# Gmail 계정 설정
gmail_user = 'your_email@gmail.com' # 보내는 사람 구글 이메일
gmail_password = 'your_password' # 앱 비밀번호
# 이메일 구성
msg = MIMEMultipart()
msg['From'] = gmail_user
msg['To'] = to_email
msg['Subject'] = subject
# 이메일 본문 추가
msg.attach(MIMEText(body, 'plain'))
# 이메일 서버를 통해 이메일 전송
server = smtplib.SMTP('smtp.gmail.com', 587)
server.starttls()
server.login(gmail_user, gmail_password)
text = msg.as_string()
server.sendmail(gmail_user, to_email, text)
server.quit()
실제 제목과 본문 내용을 지정하여 이메일을 보내도록 해보겠습니다.
subject = "이메일 제목 123"
body = "이메일 본문 내용 12345"
to_email = "받는 사람 이메일"
send_email(subject, body, to_email)
위 코드로 이메일을 보낸 결과는 위와 같이 나타납니다.
2. 지메일 보내기 심화 예제 1(첨부 파일 추가)
이번에는 첨부 파일이 포함된 경우에 대하여 Gmail 전송을 파이썬으로 해보겠습니다.
위 함수를 아래와 같이 바꿔주시면 되며,
첨부할 파일의 로컬에서의 디렉토리까지 input으로 받는 예시입니다.
def send_email_with_file(subject, body, to_email, attachment_path):
# Gmail 계정 설정
gmail_user = 'your_email@gmail.com' # 보내는 사람 구글 이메일
gmail_password = 'your_password' # 앱 비밀번호
# 이메일 구성
msg = MIMEMultipart()
msg['From'] = gmail_user
msg['To'] = to_email
msg['Subject'] = subject
# 이메일 본문 추가
msg.attach(MIMEText(body, 'plain'))
# 첨부파일 추가
with open(attachment_path, "rb") as attachment:
part = MIMEBase('application', 'octet-stream')
part.set_payload(attachment.read())
encoders.encode_base64(part)
part.add_header(
"Content-Disposition",
f"attachment; filename= {attachment_path}",
)
msg.attach(part)
# 이메일 서버를 통해 이메일 전송
server = smtplib.SMTP('smtp.gmail.com', 587)
server.starttls()
server.login(gmail_user, gmail_password)
text = msg.as_string()
server.sendmail(gmail_user, to_email, text)
server.quit()
첨부할 파일의 경로도 같이 지정하여
이메일을 마찬가지로 보내보도록 하겠습니다.
subject = "이메일 제목 456"
body = "이메일 본문 내용 678910"
to_email = "받는 사람 이메일"
attachment_path = "첨부할 파일이 저장된 파일 경로"
send_email_with_file(subject, body, to_email, attachment_path)
결과는 다음과 같습니다.
3. 지메일 보내기 심화 예제 2(본문 이미지 추가)
때로는 첨부 파일의 형태가 아니라 본문에 이미지를 삽입하여
이메일을 보내는 경우가 있습니다.
이 경우에는 아래와 같이 함수를 바꿔주시면 됩니다.
첨부 파일 경로와 마찬가지로 첨부할 이미지의 디렉토리가 추가 input으로 들어갑니다.
def send_email_with_image(subject, body, to_email, image_path):
# Gmail 계정 설정
gmail_user = 'your_email@gmail.com' # 보내는 사람 구글 이메일
gmail_password = 'your_password' # 앱 비밀번호
# 이메일 구성
msg = MIMEMultipart('related')
msg['From'] = gmail_user
msg['To'] = to_email
msg['Subject'] = subject
# HTML 본문 추가 (이미지를 <img> 태그로 참조)
msg_html = MIMEText(f'<html><body>{body}<br><img src="cid:image1"></body></html>', 'html')
msg.attach(msg_html)
# 이미지 파일 읽기 및 추가
with open(image_path, 'rb') as img:
msg_image = MIMEImage(img.read(), name=image_path)
msg_image.add_header('Content-ID', '<image1>')
msg.attach(msg_image)
# 이메일 서버를 통해 이메일 전송
server = smtplib.SMTP('smtp.gmail.com', 587)
server.starttls()
server.login(gmail_user, gmail_password)
server.sendmail(gmail_user, to_email, msg.as_string())
server.quit()
마찬가지로 이 함수도 다음 코드처럼 실행해보도록 하겠습니다.
여기서는 이 포스팅에서 첫 번째로 사용했던 이미지를 첨부해 보겠습니다.
subject = "이미지가 포함된 이메일"
body = "이것은 본문 내에 이미지가 포함된 이메일입니다."
to_email = "받는 사람 이메일"
image_path = "첨부할 이미지가 저장된 파일 경로"
send_email_with_image(subject, body, to_email, image_path)
이메일에 해당 이미지가 본문 내에 같이 포함되어 잘 송신된 것을 볼 수 있습니다.
참고로, 이 기능은 보안에 다소 취약할 수 있으므로
사용 시 앱 비밀번호가 유출되지 않도록 반드시 유의하시길 바랍니다.
'Python > Utils' 카테고리의 다른 글
파이썬 코드 포맷터 black 사용하는 이유 / 사용 방법 (0) | 2024.03.13 |
---|---|
파이썬 class __init__에서 async로 변수 초기화 하는 방법 (0) | 2024.02.20 |
파이썬으로 동영상에 음악 넣기 방법(moviepy 활용) (0) | 2024.01.22 |