일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
- wetube
- git
- docker
- 튜플
- socket io
- S3
- SSA
- lambda
- RDS
- MongoDB
- node
- SAA
- Vue
- 파이썬
- EC2
- Props
- react
- dict
- TypeScript
- 중급파이썬
- merge
- crud
- 카톡
- 채팅
- pandas
- NeXT
- async
- Class
- flask
- AWS
- Today
- Total
초보 개발자
send email django 본문
Mailgun
이메일을 발송하기 위해서 먼저 mailgun에 가입해주자.
장고 공식 문서를 보면 EMAIL_HOST, EMAIL_PORT, EMAIL_HOST_USER, EMAIL_HOST_PASSWORD, EMAIL_USE_TLS, EMAIL_USE_SSL 을 적어야 한다고 한다.
Mailgun에 가입후 sending -> domain settings -> SMTPcredential 에 가면 이 정보들이 들어있다.
아래와 같이 settings.py에 맨 아래에 적어주자. PASSWORD같은 경우는 RESET PASSWORD 누르면 보여준다.
근데 이렇게 무턱대로 비밀번호를 settings에 적어주면 git에 올릴 경우 문제가 될 수 있기에 이걸 숨겨주어야한다.
django-env를 사용하면 손 쉽게 이 문제를 해결할 수 있다.
먼저 .env라는 파일을 최상단에 만들고 거기에 여러 변수를 추가해두자. 그리고 우리가 사용할 아이디와 비밀먼호를 거기에 저장해두자
.ENV
pip install django-dotenv
django-dotenv를 설치한 뒤 이거를 우리 장고에서 읽을 수 있도록 사전 등록을 해두어야 한다.
manage.py에 들어가서 맨 위에 import dotenv를 해오고 main()함수가 실행이 되기전에 그 환경변수들을 읽어와주면 된다.
이렇게 해주면
os.environ.get('MAILGUN_USERNAME')을 하면 .env에 있는 변수를 사용할 수 있게 된다.
그리고 이 .env를 .gitignore에 추가해주면 된다.
이메일을 회원가입 시 인증번호를 입력 받아서 가입시키는 방법이 있지만, 이 방법을 사용하지 않을 것이다.
왜냐하면 만약 회원이 이메일을 다른 이메일로 변경하는 경우에 또 한번 인증을 해줘야 하기 때문이다.
따라서 먼저 User를 save()시킨다음에 인증 메일을 보내어 인증을 받도록 해주었다. 이렇게 해주면 하나의 함수로 해결이 가능하다.
user model에서 두개의 필드 email_verified, email_secret을 추가해준 뒤 인증 메일을 보내는 함수를 사용해보자.
모듈을 임포트 해주자
회원가입이 완료되고 로그인 시키고 그 다음에 models에서 정의해둔 verify_email을 호출한다.
유저가 하나 생기면 email_verifed는 기본값인 false일 것이다. 따라서 if문에 들어오게 되고 여기서 랜덤 수를 생성해주고 이 랜덤수를 email_secret에 넣어준다. 왜냐하면 이 숫자와 일치하는 유저를 찾아서 false -> true로 바꿔줘야 하기 때문이다.
여기서 랜덤한 수를 생성하는 데 uuid라는 것을 사용했는데 uuid를 사용하면 아래와 같이 나오고 이를 hex를 사용하여 16진법으로 바꿔준뒤 너무 기니까 20자까지만 사용하는 것이다.
그리고 send_mail의 형식에 맞춰서 처음에 제목, 두번째에 메시지, 세번째에 내가 보낼 아이디, 네번째에 상대방 이메일, 5번째에 옵션들인데 여기서 html_message를 주었다.
html_message는 우리가 html형식으로 message를 보낼 수 있도록 하는 것이다. 따라서 templates/emails/verify_email.html라는 걸 만들고
render_to_stirng이라는 걸 사용하면 template를 load해서 render해준다. 첫번째 인자로 템플릿을 보내고 두번째 인자로 context를 보낸다.
메시지 자리에 "gdgd"이라고 대충 자리만 채워두었는데 사실 html_message가 있으니까 저게 무시가 되는 것 같다.
강의에서는 strip_tag를 사용하여 tag가 없는 순수한 text만 보내는 것이던데 왜 2개를 굳이 보내나 싶다.
이 부분은 html_message를 차단한 사람이 있을 수 있다고 하는 것 같다. 이를 토대로 생각해보면
html_message가 우선시되고 만약 상대방이 이를 차단한 상태라면 message를 보내주는 것 같다. 일단 이 부분은 생략하고 추후에 다시 고치도록 하겠다.
회원가입을 진행 시키면 우리가 만든 html이 잘 메일에 render되어 보내진 것을 확인할 수가 있다.
다만 스팸메일에 등록이 된다.
이제 저 url을 누르면 인증이 완료도 되도록 해주면 된다.
url을 만들어주자.
우리가 인증메일로 보낸 secret을 받아와서 일치하는 유저가 있다면 email_verified를 True로 바꿔주고 secret을 공백처리 해준다. 그리고 저장해주고 redirect시켜버린다.
만약 다르다면 오류 메시지를 출력하도록 해야하는데 이 메시지에 관해선 나중에 하려고 한다. 따라서 to do로 놔두자
'Python > airbnb 클론' 카테고리의 다른 글
django login, signup page (0) | 2022.03.13 |
---|---|
django password_validator (0) | 2022.02.21 |
django sign-up form with model form (0) | 2022.02.16 |
django sign-up form (0) | 2022.02.16 |
django login form 2 with FormView (0) | 2022.02.15 |