반응형
지금까지 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️⃣ 인증 메일 발송!
반응형
'Backend > Django' 카테고리의 다른 글
[Django] Django 학습 정리 - CBV (Class Based View) (0) | 2025.03.30 |
---|---|
[Django] Django 학습 정리 - Django Auth (0) | 2025.03.30 |
[Django] Django 학습 정리 - Django ORM (0) | 2025.03.29 |
[Django] Django 학습 정리 - Django Form (0) | 2025.03.29 |
[Django] Django 학습 정리 - FBV(Function Based View)와 URL (0) | 2025.03.29 |
댓글