수정필요!)instagram 만들기 (2)회원가입 환영 이메일 보내기

2022. 4. 6. 17:56
  • SENDGIRD를 활용해서 회원가입 성공시 이메일 보내기
  • 수정필요함) 실행안되는 부분이 있음

sendgrid api_key 생성 및 입력

  • 샌드그리드 홈페이지 : https://docs.sendgrid.com/
  • api_key만들기 : settings > api_key > create api_key > restricted access 나 Full Access 선택(restricted access 선택시 Mailsend의 권한을 줘야 함) > done
  • 메일을 발송할 아이디 설정 : settings > sender identity > verify a single sender
    • 추가)나중에 도메인이 생기면 이걸로도 한번 해볼 것
    • 이걸로 등록된 아이디로만 메일을 보낼 수 있다.(생각해 보면 당연함)
  • env.bat파일에 다음과 같이 API KEY 담아줌. 그러면 이제 env.bat를 실행하는 것만으로도(cmd에서 파일이름을 입력하는 것만으로도) 해당 파일이 실행됨
  • 참고(cmd에서 환경변수 설정 및 확인하는법) : https://wannabehumblebee.tistory.com/74
#env.bat
set SENDGRID_API_KEY=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
#cmd에서 환경변수 확인(환경변수가 기록이 되어 있는지 확인)
echo %변수명%
echo %SENDGRID_API_KEY%
#shell에서 확인
python manage.py shell
import os
os.environ['변수명']
os.environ['SENDGRID_API_KEY']

 

settings.py 설정

#settings.py
# SENDGRID_API_KEY = os.getenv('SENDGRID_API_KEY') #공식홈페이지
SENDGRID_API_KEY = os.environ.get('SENDGRID_API_KEY') # 선생님

EMAIL_HOST = 'smtp.sendgrid.net'
EMAIL_HOST_USER = 'apikey' # this is exactly the value 'apikey'
EMAIL_HOST_PASSWORD = SENDGRID_API_KEY
EMAIL_PORT = 587
EMAIL_USE_TLS = True

WELCOME_EMAIL_SENDER = "col*****@naver.com"

 

Models.py

  • User모델에서 메일을 보내는 send_welcome_email 함수 생성
    • user모델의 멤버함수(메소드)이므로, User모델의 인스턴스(즉 모든 유저 하나하나)는 해당 함수를 사용할 수 있다.
    • 장고에서 메일을 보내는 함수인 send_mail을 들고 있음
      • 참고 : https://docs.djangoproject.com/en/4.0/topics/email/ 
      • 이 함수는 subject, content, sender_email , 메일 받는 대상, fail_silently를 인자로 받음
      • subject와 content에 값을 주기 위해 render_to_string 사용하였음. 첫번째 인자로 경로를 받으며, 받은 경로에 있는 파일의 내용에, 두번째 인자로 받는 파일의 내용을 반영하여 str로 반환함. 즉 title과 content에 str을 반환하여 준다.
      • 메일발송자는 settings.py에서 선언한 WELCOME_EMAIL_SENDER를 사용하였음
      • '메일을 받는 대상'에 관한 인자는 반드시 리스트 형태로 값을 줘야 하며, 해당 값은 회원가입시 입력된 이메일주소를 self.email로 받는 것임
#accounts/models.py
from django.core.mail import send_mail

class User(AbstractUser):
    ...
    ...

    def send_welcome_email(self):
        #render_to_sting 두번쨰 인자의 값들을 넘겨준 값을 반영한, 첫번쨰 인자의 경로에 있는 파일의 내용을 str로 반환
        Subject = render_to_string('accounts/welcome_email_subject.txt',{
            'user' : self,
        })
        content = render_to_string('accounts/welcome_email_content.txt',{
            'user' : self,
        })
        
        sender_email = settings.WELCOME_EMAIL_SENDER
        send_mail(Subject, content, sender_email, [self.email], fail_silently=False)
#welcome_email_subject.txt
{{ user.first_name }} {{ user.last_name }}님 가입을 환영합니다.
  • render_to_string함수를 통해, welcome_email_subject.txt의 내용에, user값을 반영한 값을 리턴시킬 수 있다.

 

 

 

 

메일발송

  • 이까지만 진행한 상태에서도 장고쉘에 진입하여 메일을 발송할 수 있다.
#cmd임
python manage.py shell #장고쉘 진입
from django.contrib.auth import get_user_model
from django.core.mail import send_mail

User = get_user_model()
user = User.objects.first()
user.send_welcome_email()

 

Views.py

  • 기존에 만들었던 signup부분을 수정
  • 만약 user instance 가 유효성검사를 통과할 경우 해당 instance를 저장함. 즉 회원가입 완료
  • 저장한 후에 바로 models.py에서 만든 send_welcome_email()함수를 활용하여 해당 유저에게 메일을 보냄
    • 이때 보내는 메일 주소는 회원가입시 입력한 메일을 send_welcome_email()에서 [self.email]형태로 받음
def signup(request):
    if request.method == "POST":
        form = SignupForm(request.POST)
        if form.is_valid():

            signed_user = form.save()
            #form.save()가 아니라 form.save()를 변수에 담아주면 어떻게 되는 거임
            #저장된 객체를 받는건가?
            signed_user.send_welcome_email() # FIXME : celery >> 비동기처리(?) >> celery를 사용하면 좀 더 빨리 처리할 수 있다.
            #model에서 멤버함수를 정의했어서 사용할 수 있다.
            
            messages.success(request,"회원가입을 환영합니다!")
            next_url=request.GET.get('next','/')
            print(next_url)
            #post메소드여도, url을 통해 들어오는 get값이 있음
            return redirect(next_url)
    else:
        form = SignupForm()
    return render(request,'accounts/signup_form.html',{
        'form':form,
    })

 

BELATED ARTICLES

more