mathpython

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でインストールするときは相当ストレスになるので、スタックオーバーフローなどのページを見るときは古いページに注意しよう。

これらのパッケージをごちゃまぜにインストールすると、依存関係か何かのせいでPythonの仮想環境が壊れて、DjangoのPipfileも壊れる。このときはPipfileとPipfile.lockから手動でsendgrid関係のパッケージを削除する。

結論からいうと

pip install sendgrid

とやる。続いてアドオンをインストールしよう。

Herokuのアドオンをインストールする

SendGridの設定画面はわかりにくいため、HerokuのアドオンからSendGridを使う。SendGridそのものを使うと貴重な時間をドブに捨てるはめになる。

日本の代理店もブログに記載しているが、このサービスは名称がわかりにくい。管理画面がとても複雑で、何がどこにあるか理解するのに時間がかかる。

Herokuの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を入れているか

大半の問題はPythonのパッケージに問題がある。Djangoに限らず、Python関係でうまくいかないときは公式ページを信用しないことも重要だ。このページも信用できないかもしれない。

広告

教育総合サイト

高校化学専門サイト

色辞典

数の辞典