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

김영빈님의 프로필 이미지

작성한 질문수

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

회원 가입 환영 이메일 보내기

메일발송이 되지 않습니다 ㅠㅠ // form.save()에 대하여 질문입니다.

작성

·

388

0

안녕하세요?
1.이전에는 됐는데, 왜 다시할때는 안되는건지 모르겠네요 ㅠㅠ 11분경에 보내시는 메일이 발송이 되지 않습니다.
 
다음과 같이 1이 출력되면 메일이 발송성공한 것으로 알고 있는데, 기다려 보아도 메일이 오지를 않네요
 
강의 후반부에 회원가입과 동시에 메일을 보내는 부분도 메일이 발송되지가 않습니다 ㅠㅠ
 
2.
14분경에 views.py에서
signup함수 내부에
form.save()를
signed_user = form.save()로 바꿔주시는데,
form.save()라는 함수가 값들을 실질적으로 db에 저장하는 것으로 알고 잇습니다.
그러면 signed_user = form.save()로 받아주는 부분은
해당 데이터를 db에 저장하는 동시에 저장된 그 유저 인스턴스(데이터 한행)를 변수에 담는 것인가요?
 
 
좋은 강의 감사합니다
 
 
 
 

답변 3

0

안녕하세요 혹시 해결하셨나요? ㅠㅠ 저도 원래 됐었는데 몇개월 후에 다시 해보니 안돼서요 .. ㅜㅜ

0

김영빈님의 프로필 이미지
김영빈
질문자

늘 빠른 답장에 감사드립니다... 진심으로 감사드립니다!

form부분은 말씀해주신 부분을 보고 잘 이해했습니다!

다만 메일의 경우 스팸메일함을 체크해보고, 다른 메일을 대상으로 메일을 보내보앗는데도 답장이 오지를 않더라구요ㅠㅠ 

env.bat파일을 다음과 같이 만들어 두었고(뒤에는 좀 가렸습니다.)

set SENDGRID_API_KEY=SG.SxTpT-0QTo20ExE9S8ffGw.pm4-3L4VFg...

runserver를 돌리기전에 먼저 env.bat를 실행시켜서 돌렸습니다

 

common.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 = "colock12@naver.com"

 

마지막으로 models.py는 다음과 같습니다

그전 강좌에서 제가 공부한다고 추가로 phone_number라는 필드를 추가하긴했는데, 영향을 끼칠 것 같지는 않아서... 해답을 잘 모르겠네요 ㅠㅠ 뭔가 네트워크의 문제인 건지 

class User(AbstractUser):
    website_url = models.URLField(blank=True, max_length=200)
    bio = models.TextField(blank=True)
    phone_number = models.CharField(blank=True,max_length=17)
    #default = True로 해두면, superusercreater를 할 때 , 값이 자동적으로 채워짐. 없으면 에러가 나더라


    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)

늘 좋은 강의와 답변 감사드립니다.

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

phone_number는 메일 발송과는 직접적으로 관련이 없습니다.

인증정보가 달라서 발송이 안 되거나, 스팸함에 들어있거나. 둘 중에 하나이지 않을까 싶구요.

인증정보로서 사용되는 key가 예상과는 다르게 엉뚱하게 지정되었을 가능성도 있습니다. 장고 쉘 (python manage.py shell)을 구동하셔서 settings.EMAIL_HOST_PASSWORD 값이 원하는 대로 정확히 들어있는 지 확인해보시구요.

print(repr(settings.EMAIL_HOST_PASSWORD)) 

settings.py 내 EMAIL_HOST_PASSWORD에 직접 하드코딩으로 키를 지정해서 테스트해보시는 것도 한 가지 방법입니다.

당연히 문제없을 거라고 생각하고 skip했던 부분에서 문제가 발생하는 경우가 많으니,  하나하나 차근차근 체크해보세요.

화이팅입니다. :-)

김영빈님의 프로필 이미지
김영빈
질문자

넵 감사합니다!

0

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

안녕하세요.

send_mail 에서 예외발생없이 정상적인 반환이 되었다는 것은 메일발송 요청까지는 정상처리되었다는 것입니다.

서버를 통해 메일이 발송은 되었는 데, 수신 측에서 스팸메일로 분류를 했을 가능성이 있습니다. 스팸메일을 분류하는 것은 메커니즘은 상당히 복잡하구요. 그 기준은 메일 서비스마다 다를 수 있습니다.

스팸 메일함을 한 번 체크해보세요.

---

장고의 ModelForm은 .save(commit=True) 인스턴스 함수를 제공해주고 있습니다.

모델인스턴스.save() 가 직접적으로 데이터베이스로의 INSERT/UPDATE 쿼리를 생성/실행해주는 주체이구요. ModelForm의 .save는 내부적으로 모델인스턴스.save() 를 호출해주고 있습니다. 내부적으로 모델인스턴스.save()를 호출하고 저장한 모델인스턴스를 반환해주고 있습니다.

ModelForm save 관련코드 ( https://github.com/django/django/blob/4.0.3/django/forms/models.py#L554 ) 를 차근차근 살펴보시면 실력향상에 큰 도움이 됩니다.

화이팅입니다. :-)