4
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

Django お問い合わせフォーム2

Last updated at Posted at 2020-04-24

#前提
前回の続きです。

https://qiita.com/yusuke_mrmt/items/ebefdb6e8704913f6a4c
#本題

##Gmailでアプリパスワードの設定を行います。

二段階認証を設定します。

まずGmailアプリを開き左上にあるメニューバーをタップします。
下の方に設定とあるのでタップします。

Googleアカウントの管理をタップします。

セュリティの項目を選択し、
アカウントの保護や適切な設定を行った上で
二段階認証などの設定をしましょう。
※二段階認証設定後に、アプリパスワードの項目が現れます。

取得したパスワードは、アプリにだけ使うのでGoogleさんが仰ってるように
どこかに保管しておくなどの処置は取らなくてもいいと思います。
ですがDjangoの設定ファイル**settings.py**に記述するので
テキストエディタにコピーしておきましょう。

##メール送信機能を追加する
Djangoのメール送信機能を追加していきます。

まずは設定ファイルの**settings.py**に
メールサーバーを使う為の記述をします。

GitHubでコードを投稿する際は、.gitignoreファイルなどで
除外するような施しを完全に行いましょう。

project/project/settings.py
STATIC_URL = '/static/'

# メールサーバー用
EMAIL_HOST = 'smtp.gmail.com'
EMAIL_HOST_USER = 'アドレス@gmail.com'
EMAIL_HOST_PASSWORD = '取得したアプリパスワード'
EMAIL_PORT = 587
EMAIL_USE_TLS = True

次にviews.pyにて、
お問い合わせフォームに書かれたメッセージを処理し
適切な応答をするように追記していきます。

project/contact/views.py

from django.shortcuts import render, redirect
from .forms import ContactForm
from django.http import HttpResponse # 追記
from django.conf import settings # 追記
from django.core.mail import BadHeaderError, send_mail # 追記

.........

def contact_form(request):
    if request.method == 'POST':
        form = ContactForm(request.POST)
        if form.is_valid():
            # 追記
            subject = form.cleaned_data['subject']
            message = form.cleaned_data['message']
            sender = form.cleaned_data['sender']
            myself = form.cleaned_data['myself']
            recipients = [settings.EMAIL_HOST_USER]
            if myself:
                recipients.append(sender)
            try:
                send_mail(subject, message, sender, recipients)
            except BadHeaderError:
                return HttpResponse('無効なヘッダーが見つかりました。')
            return redirect('contact:complete')
    else:
        form = ContactForm()
    return render(request, 'contact/contact_form.html', {'form': form})

.........

form.is_valid()で検証されたデータを整形して返すために
cleaned_data[]を使って変数に格納します。

recipentsは設定ファイルの
settings.pyで定義した自分のアドレスを渡しています。

send_mailでは、4つの引数が必須です。
自分のアドレス宛にsubject・message・senderを送ります。
※sender(送信者のアドレス)は自分のメール受信箱に表示されないので後に変更します。

BadHeaderErrorは、ヘッダインジェクションを防ぐ為の記述です。

if_myselfは、送信者がチェックボックスにチェックを入れたとき、
送信者のアドレス(sender)がrecipientsに追加され双方にメールが送られます。

双方に送られたメールの送信者は設定した自分のアドレスからとなります。

以上で一度、送信してみましょう。
送信完了へリダイレクトされれば成功です。

4
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?