인프런 커뮤니티 질문&답변

최다니엘님의 프로필 이미지
최다니엘

작성한 질문수

파이썬/장고 웹서비스 개발 완벽 가이드 with 리액트

로그인/로그아웃 구현 그리고 회원 가입과 동시에 로그인

SMTPServerDisconnected at /accounts/signup/

작성

·

470

·

수정됨

0

선생님

회원가입 환영 이메일 보내기 마지막 쯔음 파트에 관하여 질문 드리고자 합니다.

우선 세팅을 마치고

터미널로 시도할때는 메세지 1이 뜨면서

메일이 전송된 것을 확인했습니다.

 


이후로 터미널에서 시도했던 것을 accounts/models.py등으로 이전하고 시도하고나니 에러가 발생했는데요.

스크린샷 2023-01-23 오후 9.42.54(2).png이게 에러 메세지 이구요.

에러메세지에 표시된 구간을 따라가보았는데

# views.py

from django.conf import settings
# from ..askcompany.settings import common
from django.contrib.auth.models import AbstractUser
from django.core.mail import send_mail
from django.db import models
from django.template.loader import render_to_string

# Create your models here.
class User(AbstractUser):
    website_url = models.URLField(blank = True)
    bio = models.TextField(blank = True)

    def send_welcome_email(self):
        subject = render_to_string('accounts/welcome_email_subject.txt', {
            'user': self
        })
        content = render_to_string('accounts/welcome_email_content.txt',{
            'user': self
        })

        # 여기서 settings는 django.conf라는 곳에서 임포트 해오는 것이고
        # 기초 settings.py의 이름이 변하더라도 거기서 가져오는 것 같다.
        # 문제 생길 시, 추측이 아닐 수 있으니 settings를 common으로 변경해주자.
        sender_email = settings.WELCOME_EMAIL_SENDER
        # 여기서 self.email의 의미는 User마다 email로 가입이 될텐데, 그 주소가 수신주소가 되는것이다.
        send_mail(subject, content, sender_email, [self.email], fail_silently=False)

    # save할때마다 호출 -> which mean is User가 생성될때마다
    # 이런식의 로직 구현이 가능하다.
    def save(self, *args, **kwargs):
        is_created = (self.pk == None)
        super().save(*args, **kwargs)

        if is_created:
            pass

이렇게 있구요. 여기서 에러를 만드는 것으로 의심되는 요소는 sender_email이였습니다. 그도 그럴것이 common.py에는 WELCOME_EMAIL_SENDER를 정의해주었지만 그것이 from django.conf import settings

의 것을 오버라이딩 하는 것에 대해서는 확신이 들지 않아서요.

# common.py

WELCOME_EMAIL_SENDER = 'daniell8282@naver.com'

이렇게 설정해 주었구요.

echo $SENDGRID_API_KEY
도 딱히 {키값}으로 노출되는게 아니라 키값
으로 잘 확인 됩니다.

무엇이 문제여서 이게 에러가 계속 나는 걸까요?

 


추가사항으로는
저와 동일한 문제로 8시간동안 풀려고 시도했던 분이 계셨더라구요.
그분하고 저와 같은케이스 같은데요.
저두 맥이고 zsh를 쓰고 있습니다.
혹시몰라서 bash로 전환해서 export로 키값 재설정해주고
echo로 확인해주고 회원가입해보니깐
회원가입이 되긴 하는데
메일이 발송이 안되구요

zsh한정이긴 하지만 키값을 처음에 export로 잡아주고 echo로 확인할때는 {}이렇게 딕셔너리로 감싸지는 것 없이 키값이 노출이 되는데, SMTP error? 이거 발생후에 echo로 확인해보면 {}이렇게 딕셔너리 처리 됩니다; 이건 왜그런걸까요?

답변 2

0

최다니엘님의 프로필 이미지
최다니엘
질문자

음... 환경변수 관련하여는

#1 첫번째 단계

터미널로 export $SENDGRID_API_KEY=<키값>
을 입력하게되고
그 이후에 echo $SENDGRID_API_KEY
라고 입력하게 되면
<키값>이렇게 뜹니다.
(물론 <>는 생략하고 이해해주시면 감사하겠습니다.

#2 두번째 단계

회원가입 -> SMTP에러 -> 회원가입 -> SMTP에러 -> admin 페이지에서 admin계정을 제외한 모든 계정을 삭제
를 몇번이고 반복하고나면
다시 echo $SENDGRID_API_KEY
라고 입력했을때 리턴값으로
{<키값>}
이렇게 나옵니다.
(정확히 이렇게 딕셔너리 괄호로 닫혀서 나오는 원인은 모르겠습니다. 혹시라도 에러를 발견하는데에 도움이 될까봐 말씀드립니다.)
-------------------------------
두번째 단서로는 이전에 저와 같은 문제가 발생하신 분이 선생님께 질문을 하다가 종내에는 메일로 압축파일 보내드리고 해결받은 사례가 있는 것 같더라구요.
그때 선생님이 "에러 메세지 중에서 SENDGRID_API_KEY는 없었나요?"라는 식으로 말씀하시는 것을 봤습니다.

저는

SENDGRID_API_KEY: '********************'

이렇게 나옵니다.
-------------------------------
세번째.
디버그 출력으로 풀어가고 싶어서
스크린샷 2023-01-24 오후 9.21.46(2).png문제가 발생했다고 에러가 발생된 저 두 부분에 (진하게 회색처리된 부분)

print()로 감싸주었더니 그래도 동일한 에러가 나오고, print로써 뭔가의 값이 출력되질 않더라구요 ㅠㅠ
스크린샷 2023-01-24 오후 9.22.29.png에러메세지에 보면 추가로 진한 회색부분이 있어서 말씀드립니다.

결과적으로는 왜 그런지는 너무 케이스바이케이스일 것 같아서 완벽한 답변은 크게 기대하진 않습니다.
이 경우에는 답변보다는 어떻게 디버깅을 할 수 가 있는지 너무 궁금합니다! (제가 아는 경우는 print 외엔 없는데 print가 막혀서요 ㅠㅠ)

이진석님의 프로필 이미지
이진석
지식공유자

send_mail(인자 ...) 함수를 print로 감싸시면, send_mail 호출 이후에 그 반환값을 출력합니다. send_mail 호출 시에 오류가 발생하고 있으니, print는 send_mail 호출 전에 이뤄져야 할 것입니다. // 게다가 print를 할려는 이유는 send_mail 인자값을 확인할 목적이니까, print 시에는send_mail API를 호출하셔서는 안 됩니다.

send_mail API 호출 전에 각 인자값을 print(repr(인자1)) 을 통해서 먼저 확인해보세요.

그리고, 아래와 같이 두서없이 설명을 해주시니, 제가 상황을 상황을 전혀 파악을 할 수가 없네요. ㅠ_ㅠ.

회원가입 -> SMTP에러 -> 회원가입 -> SMTP에러 -> admin 페이지에서 admin계정을 제외한 모든 계정을 삭제 를 몇번이고 반복하고나면 다시 echo $SENDGRID_API_KEY 라고 입력했을때 리턴값으로

말씀하시는 반복된 과정과 환경변수 로딩과는 전혀 상관관계가 없습니다. 그 로직 내에서 환경변수를 변경하지 않으셨다면 말이죠. 그리고, echo $SENDGRID_API_KEY 는 어떤 환경에서 확인을 해보셨다는 것인지요?

글로서 설명이 어려우시다면, 영상으로 화면을 찍으시면서, 음성으로 설명을 해주세요.

재현가능한, 상황에 대한 자세한 과정 설명없이, 그냥 안된다라고만 하시면 제가 도와드릴 방법이 없습니다.

화이팅입니다 !!!

최다니엘님의 프로필 이미지
최다니엘
질문자

엄 ...회원가입(계정a)을 하고나면 연이어서 SMTP에러가 나오고,

다시 accounts/signup/에 가서 회원가입(계정b)를 하고나면 마찬가지고 바로 연달아서 SMTP에러가 나왔구요

이 두개의 생성된 계정을 다시 ADMIN페이지에 들어가서 모두 삭제한 다음에 다시 처음부터 회원가입(A계정) - SMTP에러 ... 이런과정을 반복했다고 말씀드린거였습니다! ㅠㅠ

제가 너무 제가 당면한 상황을 누구나 다 겪었을거라 생각해서 상세설명을 생략했었네요 죄송합니다 ㅠㅠ

그리고 말씀드린 이 부분이 직접적인 원인인지는 알수가 없으나, 테스트를 하다가 보면 echo $SENDGRID_API_KEY

라고 검색했을때, 어느시점까지는 그냥 키값으로 노출되지만, 어느시점부터는

echo $SENDGRID_API_KEY

를 입력해서 확인하면 {키값}

으로 출력이 됩니다.

이거는 음... 구체적인 원인을 저도 모르겠어서 좀 더 시도해보도록 하겠습니다

 

그리고PRINT하는 타이밍에 대해서 말씀해주셨으니 해당부분 참조하여 진행해보도록 하겠습니다! 감사합니다!!

0

이진석님의 프로필 이미지
이진석
지식공유자

안녕하세요.

터미널에서 시도하셨을 때에도 send_mail 을 직접 호출하셨던 것 맞죠? 그리고, User 모델 내에서 send_mail 호출 시에 말씀하신 SMTPServerDisconnected 오류가 뜨신다는 것이구요.

동일하게 send_mail API를 호출했는 데 동작이 다르다면, 호출 시에 인자를 다르게 지정하셨을 것입니다. 혹은 settings 설정을 동일하게 지정하셨다고 가정하시지만, 다르게 지정되었을 수도 있구요.

당연하다고 생각되는 것부터 차근차근 체크하는 습관이 중요합니다.

다른 설정 부분들을 체크하시기 전에, send_mail 호출 시에 지정된 인자가 서로 어떻게 다른 지를 비교해보세요.

  • 디버거를 물려서 send_mail 호출 직전에 break point를 잡아서 인자로 지정된 값을 정확하게 확인해보셔도 좋고,

  • 디버거 사용이 어려우시다면, send_mail 호출 직전에 인자로 지정된 값들을 print를 통해 출력해보세요. 이때 문자열을 단순히 출력하시면 white spaces (탭, 공백 등) 식별이 제대로 안 되니, repr(값) 을 통해서 문자열을 출력하시면, 지정된 값을 식별하시기 좋습니다.

아마도 인자가 다를 것입니다. 인자가 다르다면 왜 다른 지를 차근차근 살펴보시는 것입니다.

그리고, 쉘 관련해서 추가 질문을 주셨는데, 이때에도 코드로 설명을 주세요. 막연하게 "{}이렇게 딕셔너리 처리됩니다." 라고 질문을 주시면, 질문 자체가 이해가 안 됩니다.

질문 자체에 공을 들여주세요. 질문에 공을 들이시면, 보다 좋은 답변을 얻으실 수 있고, 질문 하시면서 답을 찾아가는 경우도 많습니다.

화이팅입니다. :-)

최다니엘님의 프로필 이미지
최다니엘

작성한 질문수

질문하기