Django를 사용하여 이메일 보내기 방법

이 튜토리얼에서는 Django를 사용하여 이메일을 보내는 방법에 대해 알아보겠습니다. Django SMTP 연결을 구성하는 방법, 이메일 제공자의 앱 비밀번호를 설정하는 방법, 그리고 Django 쉘을 통해 이메일을 보내는 방법에 대해 다루겠습니다. 또한 Django 앱용 연락처 양식을 설정하는 방법도 살펴보면서, 고객이 연락을 취하는 데 도움이 되는지 알아보겠습니다.

대부분의 웹 애플리케이션은 비밀번호 재설정, 계정 활성화, 고객 피드백 수신, 뉴스레터 및 마케팅 캠페인 발송과 같은 중요한 작업을 관리하기 위해 이메일을 사용합니다. 이러한 작업 대부분은 SendGridMailgun과 같은 전문 서비스가 필요합니다. 하지만 사이트에 많은 양의 방문자가 예상되지 않는다면 개인 이메일 제공자를 통해 많은 일을 할 수 있습니다.

개인 이메일로 이메일을 보내는 것은 작은 프로젝트나 테스트 프로젝트에 적합한 선택지입니다. 여기서는 이러한 방식을 사용하여 간단하게 유지하겠습니다. 그러나 프로덕션 웹 사이트에 개인 이메일 서비스를 사용하는 것은 좋은 생각이 아닙니다. Gmail 발송 제한에 대해 자세히 알아보거나 이메일 제공자의 제한 사항을 참조하십시오.

참고: 이 튜토리얼의 전체 코드는 GitHub에서 확인할 수 있습니다.

SMTP 이해하기

SMTP (또는 간편 메일 전송 프로토콜)은 이메일이 발신자로부터 수신자에게 전송되는 방식을 결정하는 규칙 집합입니다. SMTP 서버는 이 프로토콜을 사용하여 발신 이메일을 보내고 전달합니다. (다른 프로토콜이 이메일이 수신되는 방식을 관리한다는 점에 유의하세요.)

SMTP 서버는 항상 고유한 주소를 가지며, 대부분의 경우 587인 메시지 전송을 위한 특정 포트가 있습니다. Django로 이메일을 보낼 때 포트가 어떻게 관련이 있는지 알아보겠습니다.

Gmail을 사용하게 되므로 작업할 주소는 smtp.gmail.com이고, 포트는 587이 될 것입니다.

이제 Django로 이메일을 보낼 수 있는 방법을 살펴보겠습니다.

Django 프로젝트 생성

모든 Django 프로젝트는 프로젝트 의존성을 엉망으로 만들고 싶지 않기 때문에 가상 환경을 가져야 합니다. 가상 환경을 만들려면 다음을 실행하세요:

python -m venv .venv

참고: 가상 환경에 익숙하지 않다면 파이썬 가상 환경 가이드를 확인하세요.

위의 명령어는 .venv라는 이름의 가상 환경을 생성합니다. 이 가상 환경을 활성화하려면 다음을 사용할 수 있습니다.

source .venv/bin/activate

Django는 타사 패키지이므로 pip로 설치해야 합니다.

pip install django

이렇게 하면 최신 버전의 Django가 설치되며, pip freeze로 확인할 수 있습니다.

Django 프로젝트를 생성하려면 django-admin 명령줄 유틸리티를 호출합니다:

django-admin startproject EmailProject

위의 명령어로 EmailProject라는 이름의 Django 프로젝트를 생성하고 있지만, 원하는 모든 이름으로 프로젝트를 생성할 수 있습니다.

이제 프로젝트 디렉토리로 들어가서 서버를 실행하세요:

cd EmailProject
python manage.py runserver

Django 서버를 실행한 후 http://localhost:8000에 브라우저로 방문하세요. 최신 Django 릴리스 노트가 포함된 자동 생성된 페이지가 나타납니다.

설정 수정

이메일을 보내기 전에 설정 파일을 수정해야 하므로 tree 명령어로 해당 파일을 찾아보겠습니다:

참고: 간단하게 하기 위해 UNIX (macOS 또는 Linux) 시스템 명령만 사용하겠습니다.

tree

tree 명령은 디렉토리의 파일 구조를 출력합니다. 이 경우 특정 디렉토리 경로를 제공하지 않았으므로 프로젝트의 루트 폴더에 있는 경우 다음과 유사한 내용을 얻게 됩니다:

├── EmailProject
│   ├── asgi.py
│   ├── __init__.py
│   ├── settings.py
│   ├── urls.py
│   └── wsgi.py
└── manage.py

1 directory, 6 files

이 튜토리얼을 진행하면서 끊임없이 수정할 파일은 EmailProject 폴더 내의 settings.py입니다.

settings.py는 필요한 모든 프로젝트 구성을 보유하고 있으며 사용자 정의 변수를 설정할 수 있습니다. Django 문서에서 말하길, “설정 파일은 모듈 수준 변수를 가진 단순한 Python 모듈입니다”라고 합니다.

다음은 장고를 사용하여 이메일을 보내기 위해 필요한 설정을 살펴보겠습니다. EmailProject/settings.py 파일을 열고 다음 설정을 파일 맨 아래에 붙여넣으십시오:

# EmailProject/settings.py

# Bottom of the file
EMAIL_BACKEND = 'django.core.mail.backends.smtp.EmailBackend'
EMAIL_HOST = ''
EMAIL_PORT = 587
EMAIL_USE_TLS = True
EMAIL_HOST_USER = ''
EMAIL_HOST_PASSWORD = ''

위의 코드를 각 설정별로 분석하여 설명해 드리겠습니다.

이메일 백엔드

장고 프로젝트가 SMTP 서버와 연결하는 데 사용할 백엔드를 선언하는 EMAIL_BACKEND 설정입니다.

이 변수는 이메일을 보내는 데 필요한 모든 매개 변수를 받는 smtp.EmailBackend 클래스를 가리킵니다. 저는 여러분이 Django 소스 코드에서 바로 이 클래스의 생성자를 살펴보길 강력히 추천합니다. 이 코드가 얼마나 읽기 쉬운지 놀라실 것입니다.

참고: 이 클래스는 기본 EMAIL_BACKEND이지만, 장고 설정에서 명시적이라고 간주되는 것이 좋습니다.

다른 모든 이메일 설정은 이 EmailBackend 클래스의 생성자를 기반으로 할 것입니다.

이메일 호스트

EMAIL_HOST 설정은 사용할 SMTP 서버 도메인을 나타냅니다. 이는 이메일 서비스 제공자에 따라 다릅니다. 아래는 세 가지 일반적인 서비스 제공자에 해당하는 SMTP 서버 호스트 테이블입니다:

Email provider SMTP server host
Gmail smtp.gmail.com
Outlook/Hotmail smtp-mail.outlook.com
Yahoo smtp.mail.yahoo.com

현재는 이 설정을 비워두겠습니다. 나중에 .env 파일을 사용하여 민감한 키나 사이트별 구성을 하드코딩하지 않기 위해서입니다. 자격 증명을 코드에 직접 설정하지 마십시오.

Django Environ을 사용하여 이 문제를 해결하겠습니다.

이메일 포트

EMAIL_PORT 설정은 대부분의 SMTP 서버의 기본 포트인 587로 설정되어야 합니다. 개인 이메일 서비스 제공자에게도 이것은 동일합니다.

이 포트는 TLS 암호화와 함께 사용되어 이메일 발송의 보안을 보장합니다.

이메일 사용 TLS

전송 계층 보안 (TLS)은 웹에서 웹 애플리케이션(Django)과 서버(SMTP 서버) 간의 통신을 암호화하는 데 사용되는 보안 프로토콜입니다.

원래 EMAIL_USE_TLS 변수는 True로 설정되어 있었습니다. 이는 Django이 SMTP 서버에 연결하고 이메일을 보내기 위해 전송 계층 보안을 사용함을 의미합니다. (개인 이메일 서비스 제공자에게는 필수적임.)

이메일 호스트 사용자

EMAIL_HOST_USER 설정은 개인 이메일 주소입니다. 현재는 비워두고 django-environ을 사용하여 이러한 모든 자격 증명을 설정할 것입니다.

이메일 호스트 비밀번호

EMAIL_HOST_PASSWORD 설정은 이메일 계정에서 얻을 앱 비밀번호입니다. 이 섹션 바로 다음에 진행할 과정입니다.

똑같은 이야기: 이 설정을 비워두세요. 나중에 환경 변수를 사용할 것입니다.

Gmail에서 앱 비밀번호 설정하기

EMAIL_HOST_PASSWORD 설정을 사용하려면 덜 안전한 앱 접근을 활성화하고 개인 이메일 주소에서 앱 비밀번호를 발급받아야 합니다.

덜 안전한 앱 접근을 활성화하지 않으면 SMTPAuthenticationError가 발생할 가능성이 높습니다. Django가 Google 보안 프로토콜에 따르지 못하기 때문입니다.

일반 비밀번호를 사용할 수도 있지만, 앱 비밀번호를 사용하는 것보다 더 위험합니다. 제 조언은 새 Gmail 계정을 만들거나 “테스팅” 이메일 주소를 사용하는 것입니다.

이를 고려하여, 아래 단계에 따라 Gmail 앱 비밀번호를 발급받으실 수 있습니다. 기존 계정을 사용 중이고 2단계 인증을 활성화한 경우 2단계와 3단계는 건너뛰셔도 됩니다.

  1. Gmail 계정 생성 또는 로그인
  2. myaccount.google.com/lesssecureapps로 이동하여 덜 안전한 앱 옵션을 활성화하세요.
  3. 이중 인증을 활성화하세요. 앱 비밀번호를 받기 위해 필요합니다.
  4. 이제 이중 인증이 활성화되었으니, 앱 비밀번호를 받을 시간입니다. 이를 위해 보안 섹션으로 이동하여 구글 계정에서 ‘구글에 로그인’ 섹션을 아래로 스크롤한 후 앱 비밀번호를 클릭하세요.

앱 비밀번호 페이지로 리디렉션되기 전에 비밀번호(계정 비밀번호)를 다시 입력해야 합니다.

이 페이지에 들어가면 앱 선택을 클릭하여 해당 앱 비밀번호에 대한 사용자 지정 이름을 선택하고 — 예를 들어 “Django Send Email” — 그 다음 GENERATE를 클릭하세요.

A new window will show up with a sixteen-character password. Copy it, because we’ll need it to configure our Django project.

다른 이메일 서비스 제공자를 사용 중인 경우, 다음 가이드를 확인하세요:

Django Environ을 사용하여 민감한 키 숨기기

개발 중에 이메일을 보내는 것에 불과하더라도 비밀번호를 소스 코드에 직접 기입하지 말아야 합니다. 이는 버전 관리 시스템과 함께 GitHub에서 프로젝트를 호스팅할 때 더욱 중요해집니다. 다른 사람들이 데이터에 접근하는 것을 원하지 않습니다.

Django-environ을 사용하여 이를 방지하는 방법을 살펴보겠습니다.

EmailProject 디렉토리 내에 .env 파일을 생성하세요(여기에 settings.py 파일이 위치함):

cd EmailProject/
ls

settings.py # 설정 파일은 여기에 있어야 합니다

touch .env

이제 해당 .env 파일을 열고 다음과 같은 키-값 쌍을 입력하세요:

EMAIL_HOST=smtp.gmail.com
EMAIL_HOST_USER=YourEmail@address
EMAIL_HOST_PASSWORD=YourAppPassword
RECIPIENT_ADDRESS=TheRecieverOfTheMails

이 파일의 내용을 분석해보면:

  • EMAIL_HOST: 이메일 서비스 제공자의 SMTP 서버 주소입니다. 위의 이메일 호스트 표를 참조하십시오. 이 경우, smtp.gmail.com, Gmail SMTP 주소를 사용하고 있습니다.
  • EMAIL_HOST_USER: 이메일 주소입니다.
  • EMAIL_HOST_PASSWORD: 방금 생성한 앱 비밀번호입니다. 공백이 포함되지 않았음에 유의하세요.
  • RECIPIENT_ADDRESS: 메시지를 받을 이메일 주소입니다. 이는 나중에 모든 이메일을 동일한 수신자에게 보내기 위해 생성할 사용자 지정 설정입니다.

이러한 환경 변수를 활용하려면 Django-environ를 설치해야 합니다:

pip install django-environ

참고: 가상 환경이 활성화되어 있는지 확인하세요.

이제 EmailProject 디렉토리에 있는 settings.py를 열고 아래 코드를 사용하세요:

# EmailProject/settings.py
# 파일 시작 부분에 있어야 합니다
import environ

env = environ.Env()
environ.Env.read_env()

# 이전 설정...
EMAIL_BACKEND = 'django.core.mail.backends.smtp.EmailBackend'
EMAIL_HOST = env('EMAIL_HOST')
EMAIL_PORT = 587
EMAIL_USE_TLS = True
EMAIL_HOST_USER = env('EMAIL_HOST_USER')
EMAIL_HOST_PASSWORD = env('EMAIL_HOST_PASSWORD')

# 사용자 지정 설정. 이메일로
RECIPIENT_ADDRESS = env('RECIPIENT_ADDRESS')

먼저, 설정 파일 상단에 environ 패키지를 가져옵니다. 모든 가져오기가 시작 부분에 있어야 합니다.

그런 다음 .env에 사용 가능한 모든 키-값 쌍을 포함하는 env 변수를 생성합니다.

env('KEY') 문은 해당 키의 값을 조회한다는 의미입니다. 계속하기 전에 .env 파일을 설정했는지 확인하세요. 어떤 환경 변수가 설정되지 않았다면 Django ImproperlyConfigured 오류가 발생합니다.

RECIPIENT_ADDRESS는 이메일을 접근 가능한 주소로 보내기 위해 사용할 사용자 지정 설정입니다.

잊지 마세요 Git 및 GitHub를 사용 중이고 .gitignore.env 파일을 포함시키고 싶다면, 파일을 열어 다음 줄을 추가하면 됩니다:

.env

1. Django Shell을 통한 이메일 발송

이제 이 글의 맛있는 부분에 도달했습니다! Django에 첫 이메일을 보낼 시간입니다.

터미널을 열고, 가상환경을 활성화한 후 실행하세요:

python manage.py shell

이렇게 하면 Django 설정이 미리 구성된 쉘을 생성합니다. 그 새로운 쉘 안에서 다음 코드를 붙여넣으세요:

>>> from django.core.mail import send_mail
>>> from django.conf import settings
>>> send_mail(
...     subject='A cool subject',
...     message='A stunning message',
...     from_email=settings.EMAIL_HOST_USER,
...     recipient_list=[settings.RECIPIENT_ADDRESS])
1

인수를 명시하지 않고 한 줄로 만들 수도 있습니다:

>>> send_mail('A cool subject', 'A stunning message', settings.EMAIL_HOST_USER, [settings.RECIPIENT_ADDRESS])
1

위의 코드를 분석해보겠습니다:

  • Django의 send_mail 함수를 임포트합니다.
  • 그런 다음 settings 객체를 임포트하는데, 이 객체는 모든 글로벌 설정settings.py 파일 내의 사이트별 설정을 포함합니다.
  • 마지막으로 send_mail 함수에 필요한 모든 인수를 전달합니다. 이 함수는 이메일 발송 수를 반환하며, 이 경우 1입니다.

settings 객체를 사용하여 from_email (이메일을 보내는 계정)과 recipient_list (우리가 .env에서 정의한 RECIPIENT_ADDRESS 사용자 설정)를 얻는 방법에 유의하세요.

이제 RECIPIENT_ADDRESS 환경 변수를 내 이메일 주소로 설정한 상태에서 메일함을 확인하면, Django에 의해 보내진 메시지를 받게 됩니다.

2. Django로 자동화된 연락처 폼 구축

이 섹션에서는 Django 폼과 내장된 send_mail 함수를 사용하여 자동화된 연락처 폼을 구축할 것입니다. 또한, 연락처 폼 내부에 send()라는 사용자 정의 함수를 생성하여 뷰에서 구현하기 쉽게 만들 것입니다.

연락처 앱을 생성하기 시작합니다. manage.py가 위치한 프로젝트 루트 디렉토리에 들어가서 다음을 실행하세요:

python manage.py startapp contact

그 다음, EmailProject/settings.py 파일 내의 INSTALLED_APPS 변수에 설치하세요:

# EmailProject/settings.py

INSTALLED_APPS = [
    'django.contrib.admin',
    ...

    # Custom
    'contact',
]

contact 앱으로 더 나아가기 전에 EmailProject/urls.py 파일 내의 urlpatterns를 구성합시다. 이렇게 하려면 django.urls.include 함수를 가져와 전체 프로젝트에 연락처 URL을 포함시키세요. 걱정하지 마세요; 나중에 연락처 URL을 구성할 것입니다:

# EmailProject/urls.py

from django.contrib import admin
from django.urls import path, include # New import

urlpatterns = [
    path('admin/', admin.site.urls),
    path('', include('contact.urls')) # Include Contact URLs
]

연락처 폼

contact 앱 폴더에 들어가 forms.py 파일을 생성하세요. 모든 폼을 forms.py 파일 내에 정의하는 것은 좋은 관행이지만 필수적인 것은 아닙니다. 이것이 Django가 기본적으로 이 파일을 포함하지 않는 이유입니다.

다음 명령으로 폼 파일을 생성할 수 있습니다:

cd ../contact/
# EmailProject 폴더 안에 있었습니다
touch forms.py

파일을 열고 다음 임포트를 수행하세요:

# contact/forms.py
from django import forms
from django.conf import settings
from django.core.mail import send_mail

Django의 form 모듈은 우리에게 연락처 양식을 만들기 위해 필요한 모든 클래스와 필드를 제공합니다. 다시 한번 settings 객체와 send_mail 함수를 임포트하여 이메일을 보냅니다.

연락처 양식은 여러 필드를 포함하며 get_info()send() 두 가지 사용자 정의 메서드를 사용합니다. get_info()는 사용자가 제공한 정보를 형식화하고, send()는 메시지를 보냅니다.

이를 코드로 구현해 보겠습니다:

# contact/forms.py
class ContactForm(forms.Form):

    name = forms.CharField(max_length=120)
    email = forms.EmailField()
    inquiry = forms.CharField(max_length=70)
    message = forms.CharField(widget=forms.Textarea)

    def get_info(self):
        """
        Method that returns formatted information
        :return: subject, msg
        """
        # Cleaned data
        cl_data = super().clean()

        name = cl_data.get('name').strip()
        from_email = cl_data.get('email')
        subject = cl_data.get('inquiry')

        msg = f'{name} with email {from_email} said:'
        msg += f'\n"{subject}"\n\n'
        msg += cl_data.get('message')

        return subject, msg

    def send(self):

        subject, msg = self.get_info()

        send_mail(
            subject=subject,
            message=msg,
            from_email=settings.EMAIL_HOST_USER,
            recipient_list=[settings.RECIPIENT_ADDRESS]
        )

이 클래스는 매우 크기 때문에 각 부분에서 무엇을 하고 있는지 설명하겠습니다. 먼저, 메시지를 보내기 위해 필수적인 네 가지 필드를 정의합니다:

  • nameenquiryCharFields로 연락처 메시지의 이름과 사유를 나타냅니다.
  • emailEmailField로 연락하려는 사람의 이메일을 나타냅니다. 사용자의 이메일 주소로 이메일이 발송되지 않고, Django 프로젝트에서 이메일 발송을 설정한 주소로 이메일이 발송된다는 점에 유의하세요.
  • message는 다른 CharField로, 단지 Textarea 위젯을 사용한다는 점을 제외하면 동일합니다. 이는 폼을 표시할 때 단순한 <input> 대신 <textarea> 태그를 렌더링한다는 것을 의미합니다.

사용자가 제공한 정보를 형식화하고 두 변수를 반환하는 get_info 메서드를 사용하는 사용자 정의 메서드로 넘어가면, subjectinquiry 필드일 뿐이며, message는 Django에 의해 보내진 실제 메시지입니다.

반면에 send() 메서드는 get_info에서 형식화된 정보를 가져와 send_mail 함수로 메시지를 보냅니다.

이 섹션은 꽤 크지만, ContactForm 자체에 보내기 로직을 구현하여 연락처 뷰를 어떻게 단순화했는지 볼 수 있습니다.

연락처 뷰

contact/views.py 파일을 열고 다음 가져오기를 추가하세요:

# contact/views.py
from django.views.generic import FormView, TemplateView
from .forms import ContactForm
from django.urls import reverse_lazy

보시다시피, Django 일반 뷰를 사용하면 간단한 작업을 수행할 때 많은 시간을 절약할 수 있습니다. 예를 들어, FormView로 폼을 설정하거나 TemplateView로 템플릿만 렌더링하는 뷰를 생성할 때입니다.

또한, 이전 섹션에서 만든 ContactFormreverse_lazy 함수를 가져오고 있으며, 이는 클래스 기반 뷰에서 작업할 때 사용됩니다.

뷰를 계속 작성해 나가면서 ContactView를 작성해보겠습니다:

# contact/views.py

class ContactView(FormView):
    template_name = 'contact/contact.html'
    form_class = ContactForm
    success_url = reverse_lazy('contact:success')

    def form_valid(self, form):
        # 사용자 정의 send 메서드 호출
        form.send()
        return super().form_valid(form)

보시다시피, 우리는 만들어 놓은 ContactForm을 사용하여 간단한 FormView를 구축하고 있습니다. 또한 template_namesuccess_url을 설정하고 있으며, HTML 템플릿을 작성하고 URL을 설정하겠습니다.

form valid 메서드를 사용하면 폼의 모든 필드가 유효한 경우에만 ContactForm.send() 메서드를 사용하여 이메일을 보낼 수 있습니다. 이는 사용자가 올바르지 않은 입력(예: 형식이 잘못된 이메일 주소)을 입력하는 경우 메시지가 전송되지 않음을 의미합니다.

위의 form_valid 메서드 구현은 다음과 같은 함수 기반 뷰에서의 동작과 동일합니다:

# 이전 함수 기반 연락처 뷰 ...

if request.method == 'POST':
    form = ContactForm(request.POST)
    if form.is_valid():
        form.send()
        return redirect('contact:success')
else:
    form = ContactForm())

이 섹션을 마무리하며, 사용자에게 성공 메시지를 표시하는 ContactSuccessView를 작성할 것입니다. TemplateView 클래스를 이미 임포트했으므로, 이를 상속받고 template_name 속성을 정의해야 할 뿐입니다:

# contact/views.py
class ContactSuccessView(TemplateView):
    template_name = 'contact/success.html'

걱정이 있으시다면 GitHub 저장소에서 views.py 파일을 확인하실 수 있습니다.

연락처 URL

contact 앱의 URL 패턴을 생성할 시간입니다. Django는 기본적으로 urls.py 파일을 제공하지 않으므로, 다음 명령어로 생성해야 합니다(반드시 contact 앱 폴더 내에서 진행하세요):

pwd
# /path/to/project/EmailProject/contact
touch urls.py

해당 파일을 열고 app_nameurlpatterns 변수를 설정하세요:

from django.urls import path
from .views import ContactView, ContactSuccessView

app_name = 'contact'

urlpatterns = [
    path('', ContactView.as_view(), name="contact"),
    path('success/', ContactSuccessView.as_view(), name="success"),
]

app_name 변수를 'contact'로 설정함으로써 앱의 URL 구성에 경로와 해당 뷰를 path로 포함시킵니다. 이는 앱의 URL 네임스페이싱이 다음과 같아짐을 의미합니다:

contact:name_of_path
# For ContactView
contact:contact
# For ContactSuccessView
contact:success

참고: 네임스페이스는 Django 템플릿과 뷰에서 URL을 동적으로 호출하는 용도로 사용됩니다.

더자세히알아보려면 공식문서에서 Django URL디스패처에대해배울수있습니다.

템플릿작성

Django템플릿은동적으로데이터를표시하는데선호되는방법으로, HTML과 Django템플릿언어가제공하는특수태그를사용합니다.

이특정앱에서는세가지템플릿을사용할것입니다:

  • base.html:다른모든템플릿이상속받을파일로,모든템플릿이가져야할 HTML골격과부트스트랩에대한링크를포함합니다.
  • contact.html:연락처양식을표시합니다.
  • success.html:성공메시지를표시합니다.

연락처앱템플릿구조를생성하기시작합시다 (contact앱폴더내부에있는지확인하세요):

mkdir -p templates/contact/
cd templates/contact
touch base.html contact.html success.html

위의명령어들은재사용가능한 Django앱의전형적인템플릿구조를생성합니다— appname/templates/appname—그리고앞서언급한트리템플릿파일들을만듭니다.

이제앱파일구조가어떻게보이는지살펴보겠습니다:

.
├── admin.py
├── apps.py
├── forms.py
├── __init__.py
├── migrations
│   └── __init__.py
├── models.py
├── templates
│   └── contact
│       ├── base.html
│       ├── contact.html
│       └── success.html
├── tests.py
├── urls.py
└── views.py

이제 base.html템플릿의내용으로넘어가보겠습니다:

<!-- contact/templates/contact/base.html -->

<!DOCTYPE html>
<html lang="en">

  <head>
    <meta charset="UTF-8" />
    <meta http-equiv="X-UA-Compatible" content="IE=edge" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>Django Email Send</title>
    <link href="https://cdn.jsdelivr.net/npm/[email protected]/dist/css/bootstrap.min.css" rel="stylesheet"
      integrity="sha384-wEmeIV1mKuiNpC+IOBjI7aAzPcEZeedi5yW5f2yOq55WWLwNGmvvx4Um1vskeMj0" crossorigin="anonymous" />
  </head>

  <body>
    {% block body %}

    {% endblock %}
    <script src="https://cdn.jsdelivr.net/npm/[email protected]/dist/js/bootstrap.bundle.min.js"
      integrity="sha384-p34f1UUtsS3wqzfto5wAAmdvj+osOnFyQFpp4Ua3gs/ZVWx6oOypYoCJhGGScy+8" crossorigin="anonymous">
    </script>
  </body>

</html>

아시다시피, 이것은 Bootstrap 5에 연결된 HTML 파일의 간단한 골격입니다. 이를 통해 CSS 파일을 사용하지 않고 연락처 앱을 스타일링할 수 있습니다.

{% block name-of-block %} 태그를 사용하면 “자식 템플릿”이 활용할 수 있는 자리 표시자를 설정할 수 있습니다. 이 태그를 사용하면 템플릿 상속을 쉽게 수행할 수 있습니다.

폼에 들어가기 전에 Django crispy forms 패키지를 설치해야 합니다. 이 패키지를 통해 폼을 쉽게 스타일링할 수 있습니다:

pip install django-crispy-forms

다시 한 번, crispy_forms는 Django 앱이며 INSTALLED_APPS 목록에 포함해야 합니다:

# config/settings.py

INSTALLED_APPS = [
    ...

    # 3rd party apps
    'crispy_forms',

    # Custom apps
    'contact',
]

# django crispy forms가 사용하는 frontend 프레임워크를 나타냅니다
CRISPY_TEMPLATE_PACK = 'bootstrap4'

우리는 작성 시점에서 4번째와 5번째 버전 사이에 호환되는 Bootstrap 폼 클래스를 사용하기 때문에 Bootstrap 4의 템플릿 팩을 사용합니다.

이제 contact.html 템플릿에 작업을 시작해 보겠습니다:

<!-- contact/templates/contact/contact.html -->

{% extends 'contact/base.html' %}
{% load crispy_forms_tags %}

{% block body %}
<div class="mx-auto my-4 text-center">
    <h1>Contact Us</h1>
</div>
<div class="container">
    <form action="" method="post">
        {% csrf_token %}
        {{ form | crispy }}
    <button class="btn btn-success my-3" type="submit">Send message</button>
    </form>
</div>
{% endblock %}

기본 템플릿을 확장하고 블록 자리 표시자를 활용하는 방법을 살펴보세요. 이것이 Django 템플릿 언어가 매우 효율적인 이유입니다. 많은 HTML 복사 및 붙여넣기를 절약할 수 있습니다.

폼에 대해 이야기해보자면, "post" 메서드를 사용하고 있으므로 ContactView는 사용자로부터 제공받은 데이터를 처리하고 폼이 유효한 경우 이메일을 보냅니다.

{% csrf_token %}은 보안 이유로 모든 폼에서 필수입니다. Django 문서에는 CSRF 토큰에 대한 특별한 페이지가 있으며, 폼과 함께 작업할 때 사용해야 하는 이유에 대해 설명합니다.

폼을 crispy 템플릿 태그로 렌더링할 것이므로 {% load crispy_forms_tags %}로 크리스피 태그를 로드했습니다.

마지막으로 success.html 템플릿을 작성해 보겠습니다.

{% extends 'contact/base.html' %}

{% block body %}
<div class="mx-auto my-4 text-center">
    <h1 class="fw-bolder text-success">We sent your message</h1>
    <p class="my-5">You can send another in the <a href="{% url 'contact:contact' %}">contact page</a></p>
</div>
{% endblock %}

보시다시피, 이는 사용자가 다른 메시지를 보내고 싶을 경우 연락처 폼으로 돌아갈 수 있는 링크가 포함된 간단한 성공 알림입니다.

서버를 다시 실행하고 http://localhost:8000을 방문해보세요(반드시 .venv를 활성화하고 프로젝트 루트 폴더 내에 있어야 함).

python manage.py runserver

아래 이미지는 최종 연락처 폼의 모습을 보여줍니다.

그리고 이것은 성공 메시지의 이미지입니다.

그리고 이것은 이메일 받은 편지함의 이미지입니다.

마무리

축하드립니다! Django를 사용하여 이메일을 보내는 방법과 Django 연락처 양식을 만드는 방법도 배웠습니다.

Django로 이메일을 보내는 방법은 다양합니다. 이 튜토리얼에서는 개인 이메일 주소로 이메일을 보냈지만, 다른 도구를 탐색하여 프로젝트에 통합하는 것을 추천합니다.

이 튜토리얼에서 다룬 내용은 다음과 같습니다:

  • 이메일 서비스를 위한 Django 설정 설정 방법
  • 작은 프로젝트에서 개인 이메일 계정을 사용하여 이메일 보내기
  • Django 프로젝트에서 민감한 데이터를 사용하기 위해 .env 파일 사용 방법
  • 자동화된 연락처 양식 구축 방법

Django에 대해 더 알고 싶다면 “Django로 사진 공유 앱 만들기”를 확인하세요.

Django로 이메일 보내기에 대한 FAQs

Django에서 이메일을 보낼 수 있나요?

네, Django 애플리케이션에서 이메일을 보낼 수 있습니다. Django는 이메일을 보내기 위한 내장된 이메일 전송 프레임워크를 제공하여 이메일을 보내는 것을 비교적 쉽게 만들어 줍니다.

Django에서 이메일을 보내는 방법은?

위의 기사에 제시된 바와 같이, Django 프로젝트의 settings.py 파일에서 이메일 설정을 구성하는 것부터 시작하세요. SMTP 서버 세부 정보와 인증 자격 증명을 지정해야 합니다. 이메일 설정을 구성한 후에는 Django 뷰 또는 함수에서 이메일을 생성하고 보낼 수 있습니다. django.core.mail에서 send_mail 함수를 사용할 수 있습니다.

HTML 콘텐츠가 포함된 복잡한 이메일의 경우 Django의 템플릿 시스템을 사용하여 이메일 템플릿을 생성할 수 있습니다. 이를 통해 다양한 형식의 이메일을 생성할 수 있습니다. EmailMessage 클래스를 사용하여 이메일에 HTML 콘텐츠를 포함시킬 수 있습니다. 이메일 발송에 필요한 데이터베이스 테이블을 만들기 위해 python manage.py migrate를 실행하지 않았다면 실행하십시오.

Django에서 Outlook 메일을 보내는 방법은 무엇인가요?

Django에서 Outlook 메일을 보내려면 Outlook의 SMTP 설정으로 Django의 이메일 발송 기능을 사용할 수 있습니다. Django 프로젝트의 settings.py 파일에서 Outlook용 SMTP 설정을 구성하세요. 이러한 설정으로 Django가 Outlook SMTP 서버에 연결하여 이메일을 보낼 수 있습니다.

Django에서 이메일을 수신하는 방법은 무엇인가요?

당신의 Django 프로젝트의 settings.py에서, 들어오는 이메일 서버 설정을 구성하세요. 일반적으로 이메일 서비스 제공자의 IMAP(Internet Message Access Protocol) 서버 세부 정보와 인증 자격 증명이 필요합니다. 다음으로, imaplib 라이브러리를 사용하여 이메일 서버에 연결하고 이메일을 검색할 수 있습니다. 이 작업은 Django 뷰나 사용자 지정 관리 명령에서 수행할 수 있습니다. 이메일을 가져온 후, 이를 처리하고 정보를 추출하며, Django 애플리케이션 내에서 필요한 모든 작업을 수행할 수 있습니다. 이는 이메일 콘텐츠를 구문 분석하거나, 데이터베이스에 관련 데이터를 저장하거나, 이메일의 콘텐츠나 발신자를 기반으로 특정 작업을 트리거하는 것을 포함할 수 있습니다.

Source:
https://www.sitepoint.com/django-send-email/