본문 바로가기
개발일지/Django

Django - 이메일 전송 서비스 (sendgrid) 초기 설정

by 개발에정착하고싶다 2023. 1. 21.

파이썬/장고 웹서비스 개발 완벽가이드를 참조해서 만들었다.

왜냐하면 이 부분은 분명 이 강의를 듣고 계신 분들도 막힐만한 내용이였기 때문이다.

 

#1 에러 종류

 

나에게 있어서 sendgrid를 초기설정해줄때 발생되었던 에러는

modulenotfounderror: no module named 'sendgrid_backend'
raise smtpsenderrefused(code, resp, from_addr) 
smtplib.smtpsenderrefused: (550
raise smtpserverdisconnected("connection unexpectedly closed") 
smtplib.smtpserverdisconnected: connection unexpectedly closed

이렇게 3종류였다.

차근차근 해결방법을 알아보고 초기설정을 마무리하자.


#2 에러 정리

 

1. 우선 나의 첫번째 에러인 

modulenotfounderror: no module named 'sendgrid_backend'

의 경우다. 

 

#1에러 종류의 2번째 에러를 해결하려고 구글링을 하던 중, settings.py에

SENDGRID_BACKEND =

라는 식으로 무언가 값을 넣어주는 코멘트가 있었고, 그것을 따라했기에 에러가 생긴 것이였다.

물론, 나름의 쓰임이 있겠지만 sendgrid를 장고 강의에 맞춰서 진행하는 초기설정 관점하에서는 필요가 없었다.


2. 에러메세지를 읽고 명확히 이해하기 어려웠지만

code, resp, from_addr

이 부분이 문제가 있구나.

라고 접근을 했고

솔직히 명확히는 몰랐고, 어림짐작으로 맞추는 수 밖엔 없었다.


3.마지막 에러

raise smtpserverdisconnected("connection unexpectedly closed") 
smtplib.smtpserverdisconnected: connection unexpectedly closed

이 에러의 경우는 '연결이 닫혔다' 즉, 키값이 잘못되었든 내가 계정값을 잘못 입력했든 뭐가 어찌되었든 잘못 접근을 해서 막혔구나.

라고 접근을 했다.


#3 해결

 

1. settings.py 설정

 

우선 참고사이트

https://docs.sendgrid.com/for-developers/sending-email/django

 

Send SMTP Email with Django

View instructions on how to easily send email with Django using SendGrid, by setting up setting up Django's built in mail library.

docs.sendgrid.com

이다.

Django 기반의 sendgrid 초기 세팅 방법을 명시해주는 곳이다.

# settings.py
# 이름이 settings.py가 아니여도 된다. 하지만 django의 프로젝트를 생성하면
# 초기에 프로젝트단위의 폴더 안에 생성되어있는 settings.py안에 입력해야한다.

# os.getenv를 통해서()안의 인자이름으로 설정된 "환경변수"를 가져온다.
# 당연하게도 환경변수를 설정해줘야한다.
# 환경변수는 어떤 상황에선 어떤 걸 써야한다고 명확하게는 몰라서 말을 못하겠으나, 최소한
# 2가지 방법을 알고있으니 그것을 이 주석 설명 이후에 제시하도록 하겠다.
SENDGRID_API_KEY = os.getenv('SENDGRID_API_KEY')

EMAIL_HOST = 'smtp.sendgrid.net'
EMAIL_HOST_USER = 'apikey'  # this is exactly the value 'apikey'

# 결국 이 SENDGRID_API_KEY를 타고 sendgrid의 API 키가 전달 되는것
EMAIL_HOST_PASSWORD = SENDGRID_API_KEY
EMAIL_PORT = 587
EMAIL_USE_TLS = True

# 이건 sendgrid 가입시, "누가 전송했는지, 전송자의 이메일을 적는 값"이다
# 불안하니, sendgrid를 가입할때, from email주소로 설정한값과 동일하게 설정하자.
WELCOM_EMAIL_SENDER = 'daniell8282@naver.com'

2. pip 패키지 설치

pip install django-sendgrid-v5

로 추가로 django-sendgrid-v5를 설치해주자.


3. 환경변수 지정

 

환경변수 포스팅을 참조하여 진행하길 바란다.


4. models.py 설정

 

class User(AbstractUser):
    website_url = models.URLField(blank=True)
    bio = models.TextField(blank=True)

    def send_welcome_email(self):
        # 템플릿을 이용해서 문자열을 생성할때 사용하는 것 render_to_string()
        subject = '메일제목'
        content = '메일내용'
        
        # 이것도 BASE_DIR을 기준으로 askcompany.settings.common으로 가게 될줄 알았는데
        # settings를 import 해서 처리했다.
        sender_email = settings.WELCOME_EMAIL_SENDER
        
        # 현재 이 send_mail은 send_welcome_email이라는 함수 안에 들어있는 것이며
        # send_welcome_email함수는 User라는 클래스 안에 귀속이 되어있는 것이다.
        # 여기서 말하는 self.email은 해당 User에 귀속되어진 이메일이다.
        return send_mail(subject, content, sender_email, [
            self.email], fail_silently=False)

models는 def 이하의 내용은 권장되는 내용이나, User에 정의된 website_url이나 bio같은 경우는 필수가 아니고

그냥 개인 취향껏 써주는 것이니 참고하자.


#4 확인 방법

 

터미널에 가서

ls를 입력후 엔터

그러면 거기에 manage.py 가 있는 위치 즉, 내가 현재 있는 위치가 manage.py여야한다.

(이게 무슨소린지 모르겠거든 리눅스부터 공부를 하시길.. 유데미에서 강의할인할때 사면 만원대로 구매가능)

 

# 첫번째 순서

python manage.py shell

# 두번째 순서 임포트

from django.core.mail import send_mail

# 세번째 순서 확인

# 여기서 발신자메일주소, 수신자메일주소는 아직 명확히 모르겠다.
# 따라서 sendgrid가입시 기입했던 to mail을 수신자에 from 메일을 발신자메일과 동일하게 기입하자
send_mail('메일제목', '메일내용', '발신자메일주소', ['수신자메일주소'], fail_silently=False)