카테고리 없음

[Python] 파이썬으로 이메일 발송하기

mayhun28 2025. 6. 2. 18:07

최근 FastAPI로 백엔드를 구현하면서 회원가입 인증, 비밀번호 변경 등 메일 자동화가 필요하여 파이썬으로 이메일 발송하는 방법에 대해 포스팅 하려한다.

 

이전 회사에선 gmail 워크스페이스를 사용하고 있어, 본인도 gmail로 실행하려 한다

 

SMTP란?

SMTP(Simple Mail Transfer Protocol)는 메일을 보내기 위한 표준 프로토콜이다. python에서는 기본 내장 모듈인 smtplib를 사용해 SMTP 서버와 연결하고 메일을 전송할 수 있다.

 

1. Gmail SMTP 설정

기존에는 일반 비밀번호로 SMTP 로그인도 가능했지만, 2022년 Google 보안 정책 변경으로 인해 이제는 반드시 앱 비밀번호를 사용해야만 함.
그렇지 않으면 SMTPAuthenticationError: 534 에러가 발생함.

 

계정 설정 - 앱 비밀번호(검색)

 

앱 이름 설정 후 만들기 클릭

16 자리의 비밀번호가 생성된다

 

텍스트 이메일 보내기

import smtplib
from email.mime.text import MIMEText

SMTP_SERVER = "smtp.gmail.com"
SMTP_PORT = 587
SENDER_EMAIL = "your_email@gmail.com"
SENDER_PASSWORD = "your_app_password"  # 앱 비밀번호

def send_email(to_email, subject, body, sub_type='plain'):
    msg = MIMEText(body, _charset="utf-8")
    msg["Subject"] = subject
    msg["From"] = SENDER_EMAIL
    msg["To"] = to_email

    with smtplib.SMTP(SMTP_SERVER, SMTP_PORT) as conn:
        conn.starttls()
        conn.login(SENDER_EMAIL, SENDER_PASSWORD)
        conn.sendmail(SENDER_EMAIL, to_email, msg.as_string())

send_email(
    to_email="receiver@example.com",
    subject="Python SMTP 테스트 메일입니다",
    body="안녕하세요! 이 메일은 Python으로 보낸 테스트 메일입니다."
)

 

실제 메일 주소 넣고 테스트

  • MIMText에서 subtype은 기본값은 plain이지만, html 형식으로 발송을 할수 있다.

테스트 메일이 수신 되었다.

 

HTML 형식으로 메일 발송하기

HTML 형식으로 이메일을 발송할땐 MIMEText를 생성시에 _subtype="html"로 설정해야함
그렇지 않으면 Gmail에서 HTML 태그가 해석되지 않고 텍스트 그대로 발송됨.
  • random으로 난수 생성
  • 비밀번호 변경시 인증번호 발송 메일이라는 가정으로 HTML 작성
  • send_text_email
import random

def generate_code(length=6):
    """랜덤 숫자 인증 코드 생성"""
    return ''.join(random.choices('0123456789', k=length))

code = generate_code()

html_body = f"""
    <html>
        <body>
            <h2>안녕하세요!</h2>
            <p>아래 <strong>인증번호</strong>를 입력해주세요.</p>
            <div style="
                font-size: 24px;
                font-weight: bold;
                color: #333;
                background-color: #f2f2f2;
                padding: 10px 20px;
                display: inline-block;
                border-radius: 5px;
                letter-spacing: 4px;
            ">{code}</div>
            <p>감사합니다.<br/>May World</p>
        </body>
    </html>
    """

send_email(
    to_email="receiver@example.com",
    subject="인증 번호 발송",
    body=html_body,
    sub_type='html'
)

 

HTML 형식으로 메일 발송

 

HTML 형식으로 인증번호 발송이 되었다.

차후 이 내용을 바탕으로 FastAPI CRUD 프로젝트에서 회원가입 인증 및 비밀번호 변경에 적용해보려 한다.