環境 基本 実践 モデル アップロード デプロイ

HerokuのDjangoにSendGridを設定してメールを送る(2018年7月)

最終更新日 2023.02.18

このページは古く、不正確な情報が含まれている可能性があります。

SendGrid を使う前に、Python の仮想環境に

pip install sendgrid

でパッケージをインストールする。SendGrid を Python から使う人は、ここで数時間を使うことになるかもしれない。なぜか SendGrid のパッケージは 4 種類ある。私もいまだに違いがわからない。そしてほとんどはうまく動かない。

sendgrid
sendgrid-django
django-sendgrid
django-sendgrid-v5

海外で SendGrid を切り捨てている人がいることは、この辺りの事情があると思う。SendGrid は django-sendgrid-v5 をすすめているようだが、Heroku のアドオンでは sendgrid で解説している。そして sendgrid だけがうまくいった。

結論からいうと

pip install sendgrid

とやる。続いてアドオンをインストールしよう。アドオンをインストールすると、Herokuの環境変数に

SENDGRID_USERNAME
SENDGRID_PASSWORD

が設定される。Heroku が 自動的にSENDGRID_USERNAMEとSENDGRID_PASSWORD を作成してくれる。

SendGrid の管理画面から API Key をつくる

インストール後、SendGrid のSettings のAPI keys から Create API Key という青いボタンを押して API の鍵を作る。

権限はフルでいいと思うがよくわからない。私を信用しないでほしい。鍵の名前は SENDGRID_API_KEY にする。

作り終わると下の画面のようになる。

NAME に SENDGRID_API_KEY、API KEY に鍵(たぶん SG という文字から始まる 100 桁くらいの文字列)が並んでいる。

SENDGRID_API_KEY の下に API Key ID: とある(上図では白く消してある)が、これも意味はよくわからない。

Heroku の環境変数に SENDGRID_API_KEY を設定する

SendGrid で作った鍵(たぶん SG という文字から始まる 100 桁くらいの文字列)を Heroku の SENDGRID_API_KEY に設定する。

Django の settings.py に以下を書く

SENDGRID_API_KEY = '*****'
EMAIL_HOST = 'smtp.sendgrid.net'
EMAIL_HOST_USER = '*****@heroku.com'
EMAIL_HOST_PASSWORD = '*****'
EMAIL_PORT = 587
EMAIL_USE_TLS = True

SENDGRID_API_KEY にさっきの鍵を入れる。

Heroku の SENDGRID_USERNAME の値を EMAIL_HOST_USER に書く。

Heroku の SENDGRID_PASSWORD の値を EMAIL_HOST_PASSWORD に書く。

EMAIL_HOST は smtp.sendgrid.net で固定する。EMAIL_PORT は 587。EMAIL_USE_TLS は True。

view

sendgrid をインポートする。

SendGridAPIClient という関数を使う。引数の apikey に、settings.py で設定した SENDGRID_API_KEY を入れる。

import sendgrid
sg = sendgrid.SendGridAPIClient(apikey=settings.SENDGRID_API_KEY)
data = {省略}
response = sg.client.mail.send.post(request_body=data)

イライラしているあなたへ

このページを見ている人は Django でメールを使う予定の人で、きっとどのページも参考にならなくてイライラしている人だと思う。どうしてうまくいかないかは、次の点を考えるといいかもしれない。

  • sendgrid なのか、sendgrid-django なのか、django-sendgrid なのか、django-sendgrid-v5 なのか
  • EMAIL_HOST_USER などの環境変数を適切に設定しているか→ Heroku のアドオンを使うと簡単になる
  • SendGridAPIClient の apikey に SENDGRID_API_KEY を入れているか