Djangoでメールを送信する方法

このチュートリアルでは、Djangoを使用してメールを送信する方法について説明します。DjangoのSMTP接続を設定する方法、メールプロバイダーのアプリパスワードを設定する方法、そしてDjangoシェルを介してメールを送信する方法について説明します。また、Djangoアプリのお問い合わせフォームを設置する方法についても見ていきます。これにより、お客様からのお問い合わせを受け付けることができます。

ほとんどのWebアプリケーションは、パスワードのリセット、アカウントのアクティベーション、顧客からのフィードバックの受信、ニュースレターやマーケティングキャンペーンの送信など、重要な操作を管理するためにメールを使用しています。これらのタスクの多くは、SendGridMailgunのような専用のサービスが必要です。しかし、サイトに大量の訪問者が来るとは予想されていない場合、個人のメールプロバイダーを通じて多くのことができます。

個人のメールでメールを送信することは、小規模またはテストプロジェクトに対して合理的なオプションですので、ここではそのアプローチを取って、シンプルに保ちます。ただし、実稼働ウェブサイトに個人のメールサービスを使用するのは良いアイデアではありません。Gmailの送信制限についてもっと学ぶことができるか、メールプロバイダーの制限に関して参照してください。

Note: このチュートリアルの完全なコードはGitHubで利用可能です。

SMTPの理解

SMTP(またはシンプルメール転送プロトコル)は、電子メールが送信者から受信者にどのように転送されるかを決定するためのルールのセットです。SMTPサーバーは、このプロトコルを使用して送信および中継する送信メールを処理します。(メールの受信方法を管理する他のプロトコルも存在します。)

SMTPサーバーは常に固有のアドレスと、メッセージ送信のための特定のポートを持ち、その多くは587です。Djangoでメールを送信する際にポートの関連性を見ていきます。

Gmailを使用するため、作業するアドレスはsmtp.gmail.comであり、ポートは587です。

次に、Djangoでメールを送信する方法を見ていきましょう。

Djangoプロジェクトの作成

各Djangoプロジェクトは仮想環境を持つべきで、プロジェクトの依存関係を混乱させたくありません。仮想環境を作成するためには、以下を実行してください:

python -m venv .venv

注意: 仮想環境について不慣れな場合は、Python仮想環境ガイドを確認してください。

上記のコマンドは.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モジュールである」とされています。

Djangoでメールを送信するために必要な設定を見てみましょう。EmailProject/settings.pyファイルを開き、ファイルの最後に以下の設定を貼り付けてください:

# EmailProject/settings.py

# ファイルの最後
EMAIL_BACKEND = 'django.core.mail.backends.smtp.EmailBackend'
EMAIL_HOST = ''
EMAIL_PORT = 587
EMAIL_USE_TLS = True
EMAIL_HOST_USER = ''
EMAIL_HOST_PASSWORD = ''

上記のコードを分解して、これらの各設定を分析してみましょう。

メールバックエンド

設定EMAIL_BACKENDは、DjangoプロジェクトがSMTPサーバーと接続するために使用するバックエンドを宣言します。

この変数は、メールを送信するために必要なすべてのパラメータを受け取るsmtp.EmailBackendクラスを指しています。私は強く、このクラスのコンストラクタを直接Djangoのソースコードで確認することをお勧めします。このコードがどれほど読みやすいかに驚かれるでしょう。

注意: このクラスはデフォルトのEMAIL_BACKENDですが、Djangoの設定で明示的に記述することが良いプラクティスとされています。

他のすべてのメール設定は、このEmailBackendクラスのコンストラクタに基づいています。

メールホスト

EMAIL_HOST設定は、使用するSMTPサーバーのドメインを指します。これは、お使いのメールプロバイダーによって異なります。以下は、3つの一般的なプロバイダーに対応する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. 二要素認証が有効になったので、アプリパスワードを取得する時間です。これを行うには、Googleアカウントのセキュリティセクションにアクセスし、Googleにサインインするセクションまでスクロールダウンし、アプリパスワードをクリックします。

アプリパスワードのページにリダイレクトされる前に、パスワード(アカウントパスワード)を再入力する必要があります。

ページに入ると、アプリの選択をクリックし、そのアプリパスワードに「Django Send Email」などのカスタム名を選択してから、生成をクリックします。

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

他のメールプロバイダを使用している場合は、以下のガイドを必ず読んでください:

Django環境を使用して機密性の高いキーを隠す

開発段階でメールを送信しているだけでも、パスワードをソースコードに直接記述するべきではありません。GitHubとともにバージョン管理システムを使用する場合、これはさらに重要になります。データへのアクセスを許可したくないですよね。

Django-environを使用してこれを防ぐ方法を見てみましょう。

以下のコマンドでEmailProjectディレクトリ内(settings.pyファイルがある場所)に.envファイルを作成します:

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

引数を指定せずに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',
]

連絡先アプリを進める前に、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のフォームモジュールは、連絡先フォームを作成するために必要なすべてのクラスとフィールドを提供しています。再びsettingsオブジェクトとsend_mail関数をインポートして、メールを送信します。

連絡先フォームには複数のフィールドが含まれ、get_info()send()という2つのカスタムメソッドを使用します。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
        """
        # クリーンデータ
        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]
        )

これは大きなクラスなので、各部分で何を行っているかを分解してみましょう。まず、メッセージを送信するために必要な4つのフィールドを定義します:

  • nameenquiryCharFieldsで、連絡メッセージの名前と理由を表します。
  • emailEmailFieldで、連絡を試みている人のメールアドレスを表します。ユーザーのメールアドレスでメールが送信されるわけではなく、Djangoプロジェクトで設定したメールアドレスからメールが送信されることに注意してください。
  • messageは別のCharFieldですが、Textareaウィジェットを使用している点が異なります。これにより、フォームを表示する際には、単純な<input>ではなく<textarea>タグがレンダリングされます。

カスタムメソッドに進むと、ユーザーから提供された情報をフォーマットし、subject(これはinquiryフィールドに過ぎません)とmessage(これはDjangoから送信される実際のメッセージです)という2つの変数を返すget_infoメソッドのみを使用しています。

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でテンプレートのみをレンダリングするビューを作成する場合です。

また、前のセクションで作成したContactFormと、reverse_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メソッドの実装は、次のような関数ベースのビューと同等です:

# 以前の関数ベースのcontact_view ...

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'

懸念がある場合は、views.pyファイルをGitHubリポジトリで確認できます。

Contact URLs

contactアプリのURLパターンを作成する時が来ました。Djangoはデフォルトでurls.pyファイルを提供しないため、次のコマンドで作成する必要があります(contactアプリのフォルダ内にいることを確認してください):

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

そのファイルを開き、app_nameおよびurlpatterns変数を設定します:

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"),
]

アプリのURL構成にルートとその対応するビューを含めるためにpathを使用します。app_name変数を'contact'に設定すると、アプリのURL 名前空間は次のようになります:

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

注: 名前空間は、Djangoテンプレートおよびビューで動的にURLを呼び出すために使用されます。

DjangoのURLディスパッチャについては、公式ドキュメントでさらに詳しく学ぶことができます。

テンプレートの記述

Djangoのテンプレートは、動的にデータを表示するための最適な方法であり、HTMLとDjangoテンプレート言語が提供する特殊なタグを使用します。

この特定のアプリでは、3つのテンプレートを使用します:

  • base.html: 他のすべてのテンプレートはこれから継承されます。すべてのテンプレートが持つべきHTMLの骨組みと、Bootstrapへのリンクを含んでいます。
  • contact.html: 連絡先フォームを表示します。
  • success.html: 成功メッセージを表示します。

まず、連絡先アプリのテンプレート構造を作成することから始めましょう(contactアプリのフォルダ内にいることを確認してください):

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

上記のコマンドは、再利用可能なDjangoアプリの典型的なテンプレート構造を作成します— appname/templates/appname — そして先ほど言及した3つのテンプレートファイルです。

これでアプリのファイル構造がどのようになっているか見てみましょう:

.
├── 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が使用するフロントエンドフレームワークを示します
CRISPY_TEMPLATE_PACK = 'bootstrap4'

Bootstrap 4のテンプレートパックを使用しています。これは、Bootstrapのフォームクラスが4番目と5番目のバージョン間で互換性があるためです(執筆時点で)。

さて、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でメールを送信する方法に関するよくある質問

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/