Gmail의 smtp를 이용하여 메일 보내기

2023-03-18 hit count image

django 프로젝트에서 Gmail의 smtp로 메일을 발송하는 방법과 개발하면서 겪은 문제점을 공유합니다.

개요

django로 서버사이드를 개발하면서 메일을 발송할 필요가 생겼습니다. 이번 블로그 포스트에서는 django 프로젝트에서 Gmail의 smtp로 메일을 발송하는 방법을 소개하고, 메일을 발송하면서 겪은 문제를 공유합니다.

Google Account 설정

SMTP를 사용하여 Gmail로 메일을 발송하려면 우선 Less secure apps & your Google Account을 설정해야 합니다.

우선 아래에 링크를 통해 Google Account로 이동합니다.

로그인 후, Google Account로 가면 아래와 같은 화면을 볼 수 있습니다.

Google Account 페이지

왼쪽의 Security 메뉴를 선택하고 조금 스크롤하면, 아래와 같은 화면을 확인할 수 있습니다.

Google Account Less secure app

메뉴를 선택하고 하고 들어가서, Allow less secure appsON으로 상태를 변경해줍니다.

Google Account Less secure app

메뉴 찾기가 어려우신 분들은 아래에 링크를 사용하시기 바랍니다.

참고로 2-Step Verification(2단계 인증)을 사용하고 있는 계정은 설정이 불가합니다.

django 설정

이제 django 프로젝트의 [project name]/settings.py를 열고 아래와 같이 수정합니다.

# send email
EMAIL_BACKEND = 'django.core.mail.backends.smtp.EmailBackend'
EMAIL_HOST = 'smtp.googlemail.com'
EMAIL_USE_TLS = True
EMAIL_PORT = 587
EMAIL_HOST_USER = 'Your email address'
EMAIL_HOST_PASSWORD = 'password'

여기서, EMAIL_HOST_USEREMAIL_HOST_PASSWORD에 자신의 구글 계정 정보를 입력합니다.

메일 발송

아래에 코드를 사용하여 HTML 메일을 발송할 수 있습니다.

from django.core.mail import send_mail
from django.conf import settings
...
send_mail(subject, message, email_from, recipient_list, html_message=message)
  • subject: 메일의 제목
  • message: 메일 내용
  • email_from: 메일을 발송하는 사람(저는 email_from = settings.EMAIL_HOST_USER 코드를 사용합니다.)
  • recipient_list: 받는 사람 리스트. 메일 주소의 문자열 리스트([email, ])
  • html_message: HTML 문자열

이렇게 하면 문제없이 메일이 발송되는 것을 확인할 수 있습니다.

heroku에서 SMTPAuthenticationError 에러

로컬에서 잘 테스트하다가 heroku에 프로젝트를 업로드한 후, 같은 메일 기능을 사용했을 때, 아래와 같은 에러 메세지가 나오면서 메일이 발송되지 않았습니다.

2020-03-02T04:53:02.037241+00:00 app[web.1]:     new_conn_created = self.open()
2020-03-02T04:53:02.037241+00:00 app[web.1]:   File "/app/.heroku/python/lib/python3.6/site-packages/django/core/mail/backends/smtp.py", line 69, in open
2020-03-02T04:53:02.037242+00:00 app[web.1]:     self.connection.login(self.username, self.password)
2020-03-02T04:53:02.037242+00:00 app[web.1]:   File "/app/.heroku/python/lib/python3.6/smtplib.py", line 730, in login
2020-03-02T04:53:02.037242+00:00 app[web.1]:     raise last_exception
2020-03-02T04:53:02.037243+00:00 app[web.1]:   File "/app/.heroku/python/lib/python3.6/smtplib.py", line 721, in login
2020-03-02T04:53:02.037243+00:00 app[web.1]:     initial_response_ok=initial_response_ok)
2020-03-02T04:53:02.037243+00:00 app[web.1]:   File "/app/.heroku/python/lib/python3.6/smtplib.py", line 642, in auth
2020-03-02T04:53:02.037244+00:00 app[web.1]:     raise SMTPAuthenticationError(code, resp)
2020-03-02T04:53:02.037261+00:00 app[web.1]: smtplib.SMTPAuthenticationError: (534, b'....')

Gmail과 Google Account에 들어가서 확인해 보니, Heroku 서버의 IP가 차단되어 있는 것을 확인할 수 있었습니다. 이 문제를 해결하기 위해서 우선 아래에 링크로 이동합니다.

위에 링크로 접속하면 아래와 같은 화면을 볼 수 있습니다.

Google Account Less secure app

하단에 있는 Continue 버튼을 눌러 줍니다. 그리고 다시 django를 통해 메일을 발송하면 메일이 잘 발송되는 것을 확인할 수 있습니다.

완료

이것으로 django 프로젝트에서 Gmail의 SMTP를 사용하여 메일을 발송하는 방법에 대해서 알아보았습니다. 아마 별다른 문제가 없을 거 같지만, 저처럼 구글에서 IP를 차단당하시는 분들이 있다면 위에서 설명한 내용을 시도해 보시기 바랍니다.

제 블로그가 도움이 되셨나요? 하단의 댓글을 달아주시면 저에게 큰 힘이 됩니다!

앱 홍보

책 홍보

블로그를 운영하면서 좋은 기회가 생겨 책을 출판하게 되었습니다.

아래 링크를 통해 제가 쓴 책을 구매하실 수 있습니다.
많은 분들에게 도움이 되면 좋겠네요.

스무디 한 잔 마시며 끝내는 React Native, 비제이퍼블릭
스무디 한 잔 마시며 끝내는 리액트 + TDD, 비제이퍼블릭
[심통]현장에서 바로 써먹는 리액트 with 타입스크립트 : 리액트와 스토리북으로 배우는 컴포넌트 주도 개발, 심통
Posts