장고

장고 이메일 인증 SMTP

작지 2021. 9. 15. 21:07

IMAP 사용

 

다른 이메일 플랫폼을 통해 Gmail 확인하기 - Gmail 고객센터

도움이 되었나요? 어떻게 하면 개선할 수 있을까요? 예아니요

support.google.com

 

보안수준 낮은 앱 허용

 

보안 수준이 낮은 앱 및 Google 계정 - Google 계정 고객센터

도움이 되었나요? 어떻게 하면 개선할 수 있을까요? 예아니요

support.google.com

github :https://github.com/wkdtpzld/again/tree/40101b7873d8e37916823b79ec7c159e1a464896

settings.py에 추가하세요

EMAIL_HOST = 'smtp.gmail.com'

EMAIL_PORT = '587'

EMAIL_HOST_USER = 'id@gmail.com'

EMAIL_HOST_PASSWORD = 'pw'

EMAIL_USE_TLS = True

DEFAULT_FROM_EMAIL = EMAIL_HOST_USER

 

id=자기 구글 이메일, pw 비번 입력해주시면 됩니다.

 

내가 만든 로그인은 Django의 UserCreationForm을 기초로 만든 근본도없는 모델이다.

from django.shortcuts import render , redirect
from common.forms import UserForm
from django.contrib.auth import authenticate, login


def signup(request):
    if request.method == 'POST':
        form = UserForm(request.POST)
        if form.is_valid():
            form.save()
            username = form.cleaned_data.get('username')
            raw_password = form.cleaned_data.get('password1')
            user = authenticate(username=username, password=raw_password)  # 사용자 인증
            login(request, user)  # 로그인
            return redirect('index')
    else:
        form = UserForm()
    return render(request, 'common/signup.html',{'form':form})

기존 common/views

from django.shortcuts import render , redirect
from common.forms import UserForm
from django.contrib.auth import authenticate
from django.contrib.sites.shortcuts import get_current_site
from django.utils.http import urlsafe_base64_encode, urlsafe_base64_decode
from django.utils.encoding import force_bytes , force_text
from .tokens import account_activation_token
from django.contrib import auth
from django.contrib.auth.models import User
from django.template.loader import render_to_string
from django.core.mail import EmailMessage


def signup(request):
    if request.method == 'POST':
        form = UserForm(request.POST)
        if form.is_valid():
            form.save()
            username = form.cleaned_data.get('username')
            raw_password = form.cleaned_data.get('password1')
            user = authenticate(username=username, password=raw_password)  # 사용자 인증
            user.is_active=False # 비활성화
            user.save()
            current_site = get_current_site(request)
            message = render_to_string('common/activation_email.html',{
                'user':user,
                'domain':current_site.domain,
                'uid': urlsafe_base64_encode(force_bytes(user.pk)),
                'token': account_activation_token.make_token(user),
            })
            mail_title = "계정 활성화 확인 이메일"
            mail_to = request.POST['email']
            email = EmailMessage(mail_title, message, to=[mail_to])
            email.send()
            # login(request, user)  # 로그인 (비 활성화 시켰기 때문에 주석처리함)
            return redirect('index')
    else:
        form = UserForm()
    return render(request, 'common/signup.html',{'form':form})

def activate(request, uidb64, token):
    try:
        uid = force_text(urlsafe_base64_decode(uidb64))
        user = User.objects.get(pk=uid)
    except(TypeError, ValueError, OverflowError, User.DoesNotExsit):
        user = None
    if user is not None and account_activation_token.check_token(user, token):
        user.is_active = True
        user.save()
        auth.login(request, user)
        return redirect('index')
    else:
        return render(request, 'index',{'error':'nope'}) #( 'error'는 형식상 존재 )

수정 후

activate는 수정이 필요

https://woongsin94.tistory.com/300

후에 방법을 찾으면 링크 첨부

 

tokens.py

from django.contrib.auth.tokens import PasswordResetTokenGenerator

class AccountActivationTokenGenerator(PasswordResetTokenGenerator):
    def _make_hash_value(self, user, timestamp):
        return (str(user.pk) + str(timestamp)) +  str(user.is_active)

account_activation_token = AccountActivationTokenGenerator()

 

 

login과 logout은 auth_views.LoginView.as_view(templates)사용중이다.

 

urls에 activate를 추가

urlpatterns = [
    path('login/',auth_views.LoginView.as_view(template_name='common/login.html'), name='login'),
    path('logout/',auth_views.LogoutView.as_view(),name='logout'),
    path('signup/', views.signup, name='signup'),
    path('activate/<str:uidb64>/<str:token>/', views.activate, name='activate')
]

 

또한 인증메일인 activate.html 작성

{{user.username}}님, 아래 링크를 클릭하여 계정을 활성화하세요:
http://{{domain}}{% url 'common:activate' uid token %}

진짜 간단하게 날라간다