HerokuのDjangoにSendGridを設定してメールを送る(2018年7月)
このページは古く、不正確な情報が含まれている可能性があります。
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 を入れているか