설표의 장고




장고) 이메일 발송방법





( 수정됨)


환경

OS : Windows 10
python : 3.10.11
Django : 5.0.7

주요 파일 경로

mysite/
|- manage.py
|- config/
    |- settings/
       |- local.py
       |- email.py
       |- secret_email.txt

SMTP 정보 가져오기

링크로 대체합니다.
이 글에서는 네이버 SMTP를 기준으로 합니다.

email 인증정보 작성하기

다음과 같이 네이버 SMTP를 이용하기 위한 인증정보를 "secret_email.txt" 파일로 저장합니다.

# config/setttings/secret_email.txt

{
  "naver": {
    "user": "{네이버 로그인 아이디}",
    "password": "{네이버 로그인 비밀번호}",
    "sender": "{네이버 로그인 아이디}@naver.com"
  }
}

email.py 작성하기

email 발송을 위한 설정 파일을 작성합니다. 여기서 방금 생성한 secret_email.txt 파일을 가져옵니다.

# config/settings/email.py
# code py 하얀설표(django.seolpyo.com)

import json
from pathlib import Path

with open(Path(__file__).parent / 'secret_email.txt') as txt:
    dict_email = json.load(txt)

EMAIL_BACKEND = 'django.core.mail.backends.smtp.EmailBackend'
EMAIL_HOST = 'smtp.naver.com'
EMAIL_PORT = 587
EMAIL_HOST_USER = dict_email['naver']['user']
EMAIL_HOST_PASSWORD = dict_email['naver']['password']
EMAIL_USE_TLS = True
DEFAULT_FROM_EMAIL = dict_email['naver']['sender']

local.py 변경하기

local.py에 방금 작성한 email.py 설정파일을 추가합니다.

# config/settings/local.py

from .settings import *
from .email import * # 추가

이메일 발송해보기

"python manage.py shell"을 통해 이메일을 발송해봅시다.
python shell은 "Ctrl" + "Z"키를 입력해 종료할 수 있습니다.

from_email과 message 인수는 필수값이며, None을 전달한 경우 setting에 설정된 "DEFAULT_FROM_EMAIL" 값을 사용합니다.
네이버 SMTP의 경우 from_email이 SMTP를 이용하는 계정의 이메일 주소와 다르면 에러를 반환합니다.

이메일 발송에 성하면 int 1을 return합니다.

(django) C:\django\mysite>python manage.py shell
Python 3.10.11 (tags/v3.10.11:7d4cc5a, Apr  5 2023, 00:38:17) [MSC v.1929 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
(InteractiveConsole)
>>> from django.core.mail import send_mail

>>> send_mail('장고에서 보낸 이메일입니다.', message='이것은 django shell을 통해 발송한 이메일입니다.', recipient_list=['{email address}@naver.com'])
Traceback (most recent call last):
  File "<console>", line 1, in <module>
TypeError: send_mail() missing 1 required positional argument: 'from_email'

>>> send_mail('장고에서 보낸 이메일입니다.', from_email=None, message='이것은 django shell을 통해 발송한 이메일입니다.', recipient_list=['{email address}@naver.com'])
1

>>> send_mail('장고에서 보낸 이메일입니다.', from_email='aaa@naver.com', message='이것은 django shell을 통해 발송한 이메일입니다.', recipient_list=[{email address}@naver.com'])
Traceback (most recent call last):
  File "<console>", line 1, in <module>
  File "C:\django\lib\site-packages\django\core\mail\__init__.py", line 88, in send_mail
    return mail.send()
  File "C:\django\lib\site-packages\django\core\mail\message.py", line 301, in send
    return self.get_connection(fail_silently).send_messages([self])
  File "C:\django\lib\site-packages\django\core\mail\backends\smtp.py", line 136, in send_messages
    sent = self._send(message)
  File "C:\django\lib\site-packages\django\core\mail\backends\smtp.py", line 155, in _send
    self.connection.sendmail(
  File "C:\Program Files\Python310\lib\smtplib.py", line 887, in sendmail
    raise SMTPSenderRefused(code, resp, from_addr)
smtplib.SMTPSenderRefused: (554, b'5.7.1 The sender address is unauthorized U+TB1KBjSQKpu-LdGPIqmA - nsmtp', 'aaa@naver.com')
>>>

이메일로 html을 보내는 방법

html로 구성된 이메일을 보낼 수도 있고, 이메일을 보내는 메일 계정을 지정해서 발송하는 것도 가능합니다.

(django) C:\django\mysite>python manage.py shell
Python 3.10.11 (tags/v3.10.11:7d4cc5a, Apr  5 2023, 00:38:17) [MSC v.1929 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
(InteractiveConsole)
>>> from django.core.mail import send_mail

>>> send_mail('장고에서 보낸 이메일입니다.', message='', from_email=None, recipient_list=['{email address}@naver.com'], html_message='<p><a href="django.seolpyo.com">설표의 장고</a>는 python Django로 만들어진 웹사이트입니다.</p>')
1

>>> send_mail(
...  subject='이메일 제목',
...  from_email='{email address}@naver.com',
...  auth_user='{user id}',
...  auth_password='{user password}',
...  recipient_list=['{email address}@naver.com'],
...  html_message='send_mail에서 사용하는 <b>SMTP 정보를 수동으로 전달하는 것도 가능</b>합니다.<br>smtp서버는 변경할 수 없는 것 같습니다.',
...  message='',
... )
1
>>>

장고로 보낸 이메일(이미지)

장고로 보낸 이메일



이 글의 댓글 기능은 일부러 막아놓았습니다. 궁금한 내용이 있다면 게시판을 이용해주세요!


공감 : 0