본문 바로가기
Backend/Django

[Django] Django 학습 정리 - Django Mail

by 요호유후 2025. 3. 31.
반응형

지금까지 Django 학습한 내용을 바탕으로 정리를 해보려 한다.

 

목차
1. Django Mail
2. 네이버 이메일 인증 기능 만들기
[작업 환경]
MacOS, PyCharm
pyenv, poetry
Python, Django

 

 

1. Django Mail

1. Django Mail 기능이란?

Django가 제공하는 이메일 발송 도구이다.
SMTP 정보를 이용하여 회원가입 인증 등 메일 발송 기능을 쉽게 구현할 수 있다.

 

    ⭐️ send_mail() 함수

기본적인 메일 발송 함수
제목, 내용, 수신자 등을 전달해서 단순한 텍스트 메일을 보낼 수 있다.

        📌 사용예시)

from django.core.mail import send_mail
from django.conf import settings

def send_email(subject, message, to_email):	# 이메일 발송 함수 정의 (제목, 본문, 수신자)
    to_email = to_email if isinstance(to_email, list) else [to_email, ]
    send_mail(subject, message, settings.EMAIL_HOST_USER, to_email)
    
    # Django send_mail 매개변수
    '''
    - subject : 메일 제목
    - message : 메일 본문
    - from_email : 발신자 (위 예시는 config/settings.EMAIL_HOST_USER 로 정의됨)
    - recipient_list : 수신자 리스트 (단일 수신자도 가능)
    '''

 

 

2. 네이버 이메일 인증 기능 만들기

1️⃣ SMTP 사용 설정

네이버 메일 → 환경설정 → POP3/MAP 설정 → POP3/SMTP 사용함 체크 후 저장,
                                                                          IMAP/SMTP 사용함 체크 후 저장 

 

2️⃣ 이메일 발송 정보 작성

환경설정 하단의 "메일 프로그램 환경 설정 안내" 정보를 코드에 작성해준다.
# config/settings.py 작성

# email
EMAIL_BACKEND = 'django.core.mail.backends.smtp.EmailBackend'
EMAIL_HOST = <SMTP 서버명>
EMAIL_USE_TLS = True
EMAIL_POST = <SMTP 포트번호>
EMAIL_HOST_USER = <이메일 사용자 정보>
EMAIL_HOST_PASSWORD = <이메일 사용자 비밀번호>

 

3️⃣ 이메일 발송 로직 구현

# utils/email.py

from django.core.mail import send_mail
from django.conf import settings

def send_email(subject, message, to_email):
    to_email = to_email if isinstance(to_email, list) else [to_email, ]
    send_mail(subject, message, settings.EMAIL_HOST_USER, to_email)
    
    
# member/views.py
from django.core import signing
from django.core.signing import TimestampSigner, SignatureExpired
from django.shortcuts import render, get_object_or_404, redirect
from django.urls import reverse_lazy, reverse

from django.conf import settings
from member.forms import SignupForm
from utils.email import send_email

class SignupView(FormView):
    template_name = 'auth/signup.html'	# 회원가입 폼 템플릿
    form_class = SignupForm		# 사용할 폼 클래스

    def form_valid(self, form):
        user = form.save()

        # 이메일 발송
        # 이메일 인증용 서명 생성
        signer = TimestampSigner()		# 시간 기반 signer 생성
        signed_user_email = signer.sign(user.email)		# 이메일 암호화
        signer_dump = signing.dumps(signed_user_email)	# 서명된 이메일 직렬화

	# 인증 URL 생성 : http://localhost:8000/verify/?code=asdasd
        url = f'{self.request.scheme}://{self.request.META['HTTP_HOST']}/verify/?code={signer_dump}'

        if settings.DEBUG: # 테스트 디버그용
            print(url)
        else:   # 서버에 실제로 이메일 발송할 수 있도록
            subject = '[Pystagram] 이메일 인증을 완료해주세요'
            message = f'다음 링크를 클릭해주세요. <br><a href="{url}">{url}</a>'
            send_email(subject, message, user.email)
        # 이메일 발송_end

        return render(
            self.request,
            template_name='auth/signup_done.html',
            context={'user':user}
        )
        
def verify_email (request):	# 이메일 인증 처리 뷰
    code = request.GET.get('code', '')	# URL 파라미터에서 인증 코드 추출
    signer = TimestampSigner()

    try:
        decoded_user_email = signing.loads(code)	# 이메일 복호화 및 유효시간 검증
        email = signer.unsign(decoded_user_email, max_age=60 * 30) # max_age : 이메일인증 제한시간
    except (TypeError, SignatureExpired):	# 코드가 변조되었거나 시간이 초과된 경우
        return render(request, 'auth/not_verified.html')

    # 메일 인증 성공 후 (유저 조회)
    user = get_object_or_404(User, email=email, is_active=False)
    user.is_active = True	# 계정 활성화 처리
    user.save()	# 유저 정보 저장

    return redirect(reverse_lazy('login'))	# 로그인 페이지로 리다이렉트

 

4️⃣ 인증 메일 발송!

인증 메일 발송

 

 

 

반응형

댓글