背景
Djangoサイトでメールを送ろうとしていたのですが、Gmailではなぜかうまく動かなかったので、その代わりにSendGridでメールを送ってみようと思いました。
前提条件
- Djangoでプロジェクトを作成済み
- 使用中のDNSホストでCNAMEなどの設定の仕方が分かる
手順
SendGridアカウントの登録
-
SendGridで無料のアカウントを作成する
日本のSendGridアカウントを作成すると、審査に2日ぐらいかかる可能性あり。アメリカ版ならすぐに作成可能。ちなみに、この時に入力するメールアドレスはアカウント作成用のものなのでなんでもいい) -
認証メールを開く
-
ドメインの認証を行う。
英語版ではSendgridのサイトの左側のナビバーにある"Settings"タブを開くとある"Sender Authentication"のページからできます。私はGoogle DomainsをDNSホストとして使っていたのですが、これがプルダウンメニューにあるGoogle Cloudにあたるのか分からなかったので、"Other Hosts"を選んで"Google Domains"と入力しました。Djangoから送信する送信元アドレスに"…@sendgrid.net"でなく、独自のドメインを使いたい場合はYesにチェック。 -
次の画面では自分のドメイン("hogehoge.com")などを入力
-
最後に出てくるDNS関連情報を自分が使っているDNSホストのページにコピー&ペースト。
ここで注意するのが、"DNS NAME"をペーストするときに自分のドメイン("hogehoge.com")の部分を削除しておく必要があることです。DNSホストにCNAMEを登録したら数分待ち、Verifyボタンを押して認証しましょう。 -
5が終わったらAPI Keyを入手しましょう。
先ほどの"Settings"タブから"API Keys"を選び、"Create API Keys"でAPI Key作成します。"Restricted Access"を選んで、"Mail Send"の権限を与えます。
Django側の設定
Sendgrid側の設定が終わったら、次はDjangoの設定をします。今回はsmtpではなく、sendgridのWEB APIを通してメールを送信します。
-
virtualenvに入って、pipでdjango-sendgrid-v5をインストールします。
pip install django-sendgrid-v5
-
Environment variableにAPI keyを追加。
export SENDGRID_API_KEY="先ほど作ったAPI key"
-
settings.pyに以下を追加します。
`import os
EMAIL_BACKEND = "sendgrid_backend.SendgridBackend"
SENDGRID_API_KEY = os.environ.get("SENDGRID_API_KEY")
SENDGRID_SANDBOX_MODE_IN_DEBUG= False #DEBUG modeがTrueの場合にサンドボックスモードを起動/停止する設定。
DEFAULT_FROM_EMAIL = 'admin@hogehoge.com'
サンドボックスモードはデフォルトでTrueになっているため、明示的にこれをFalseに設定しないと実際のメールは送られません。
ではテストしてみましょう。
メールの送信
Djangoのシェルからメールを送ってみます。
`python3 manage.py shell
from django.core.mail import send_mail
send_mail('testing', 'my message', 'admin@hogehoge.com', ['宛先@example.com'], fail_silently=False)
1`
これで宛先にメールが届くはずです。
ちなみに私の場合、outlook.comのメール宛に送信したメールはブロックされていました。
さらにGmailの方はSpamフォルダに入っていました。
初めての記事なので、いたらないところもあると思いますが、自分のための備忘録として今回は書かせてもらいました。