Twilio SendGridを使ってPython Djangoでメールを送る方法
- 2020年6月16日
- by SendGrid
- Category: 技術ネタ 機能・使い方
この記事は Using Twilio SendGrid To Send Emails from Python Django Applications の抄訳です。
Webアプリにメール送信機能をどう組み込むかは常に厄介な問題です。自分自身でメールサーバを用意し管理するのか、サードパーティのメール配信サービスを使うのか……。メール配信量や予算、Webアプリにどんなプラットフォームを用いるかなど様々な要因に左右されますが、メール配信サービスのシンプルさが好まれる場合が多いようです。
この短いチュートリアルでは、PythonのWebアプリケーションフレームワークであるDjangoを用いて、Twilio SendGridでメール送信する方法をご紹介します。
必要なツール
このチュートリアルには以下が必要です。
- Python 3: お使いのOSにあらかじめインタプリタがインストールされていない場合、python.orgからインストーラをダウンロードできます。
- Twilio SendGridのアカウント: SendGridを初めて使う場合には無料アカウントを作成してください。
SendGridの設定を行う
SendGridからメール送信する前に、アカウントの認証情報として用いるAPIキーを作成します。アカウントにログインしたら、左側のメニューの“Settings”から“API Keys”を選び、“Create API Key”をクリックします。
APIキーにはわかりやすい名前をつけましょう。このチュートリアルではDjangoという名前にします。Permissionsに“Full Access”を選ぶことで、メール送信に必要な全ての機能が使えるようになります。特定の権限だけ持つAPIキーを作成したい場合には、“Restricted Access”を選んで必要な権限を与えましょう。
“Create & View”ボタンをクリックすれば、APIキーの文字列が表示されます。この文字列は一度しか表示できないので、あとで使えるようにクリップボードにコピーしてセキュアな場所にペーストしておきましょう。キーを保存したら、“Done”ボタンを押します。
Python環境を構築する
それでは、Djangoアプリでのメール送信方法を見てみましょう。twilio-sendgrid-testsのような名前でディレクトリを作成し、その中に新しくPythonの仮想環境を構築していきます。
MacもしくはUnixユーザの場合、以下のコマンドになります。
mkdir twilio-sendgrid-tests cd twilio-sendgrid-tests python3 -m venv venv source venv/bin/activate
Windowsユーザの場合、コマンドプロンプトやPowerShellの画面で以下のコマンドを実行します。
md twilio-sendgrid-tests cd twilio-sendgrid-tests python -m venv venv venv\Scripts\activate
Pythonの仮想環境が作成・有効化されると、コマンドプロンプトの先頭に(venv)と表示されるはずです。
次に作った仮想環境上にdjangoとpython-dotenvパッケージをインストールします。
(venv) $ pip install django python-dotenv
Djangoアプリを作る
最初のDjangoアプリを今いるディレクトリに作りましょう。ここでは”emails”と名前をつけますが、好きな名前で構いません。
(venv) $ django-admin startproject emails (venv) $ cd emails
Twilio SendGridではSMTPサーバに接続してメールを送信することができますが、ありがたいことにDjangoもSMTPを用いたメール送信をサポートしています。Djangoを使ってSendGrid経由でメールを送るには、以下の変数をsettings.pyというPythonスクリプトに追加する必要があります。私の場合、このファイルはemailsディレクトリ配下に置きましたが、Djangoアプリの名前によってファイルがおかれる場所の名前は異なります。
# Twilio SendGrid EMAIL_HOST = 'smtp.sendgrid.net' EMAIL_PORT = 587 EMAIL_USE_TLS = True EMAIL_HOST_USER = 'apikey' EMAIL_HOST_PASSWORD = os.environ.get('SENDGRID_API_KEY')
上では、SendGridのSMTPを用いて送信するために必要な以下の項目を指定しています。
- メールサーバとしてsmtp.sendgrid.netを指定
- ポート番号として587を指定(25番でも可)
- TLS通信を有効化
- 認証情報として、ユーザ名にapikey(全てのSendGridアカウントで共通)を、パスワードに先ほど作成したAPIキーを指定
認証情報をソースコードに顕に書くのはセキュリティ上好ましくないため、OS上にAPIキーをSENDGRID_API_KEYという環境変数として保存し、それを呼び出す形にします。環境変数を設定する代わりに、.envファイルに保存しても良いです。Djangoの最上位ディレクトリに.envというファイル(先頭のドットを忘れずに)を作り、以下のように変数を定義します。
SENDGRID_API_KEY='<your-sendgrid-api-key>'
Djangoは.envファイルをデフォルトでは読み込んでくれないので、アプリケーションの起動時にこの環境変数を読み込むよう設定する必要があります。settings.pyファイルの先頭に、以下を追加します。
from dotenv import load_dotenv load_dotenv()
メールを送る
それでは、自分自身に向けてテストメールを送信しましょう。以下のようにしてPythonシェルを起動します。
(venv) $ python manage.py shell
manage.py shell をつけてPythonシェルを起動することで、上で追加した設定が読み込まれた状態でDjangoアプリが作成できます。
次に、Djangoの send_mail() 関数を使ってテストメールを送ります。
from django.core.mail import send_mail send_mail('Example Subject', 'Example message', 'from@example.com', ['to@example.com'])
send_mail() 関数で指定している引数はそれぞれメールの件名、本文、送信者、宛先リストです。送信者、宛先リストを自分自身のものに置き換えて試してみてください。
何事も問題なければ、数秒のうちに受信箱にメールが届くはずです。
これでシンプルなメールが送信できることが確認できたので、send_mail() 関数やEmailMessageクラスを組み込んでDjangoアプリを作る準備が整いました。Djangoフレームワークで提供されるメールの全ての機能がTwilio SendGridを通して実行できます!
メールが届かなかったら
問題なくメール送信が成功していることを願いますが、届かないケースもあるかもしれません。SendGridはメール送信を非同期的に行っているので、ほとんどの問題は送信指示を完了した後に発生します。そのため、メール送信者のアプリケーションでは送信エラーの発生がわからないこともあります。多くの場合、届かない原因は宛先側メールサーバによる受信拒否です。
送ったメールのステータスはSendGridの画面から確認することができます。ダッシュボードからActivityを選択すると、発生したイベントの一覧を見ることができます。Deliveredが発生していれば宛先サーバに受け付けられたことを意味していますが、BounceやBlockなどが発生していればメールは届いていないことになります。イベントの種類の詳細はこちらをご覧ください。
おわりに
Twilio SendGridを使えばとてもシンプルにDjangoのメール送信機能を組み込むことができます。Twilio SendGridを使ってみようというきっかけになれば幸いです!
参考資料
以下のリンクはDjangoのメール送信機能とTwilio SendGridに関する補足資料です。
- Sending Email (Djangoの公式ドキュメント): HTMLメールやファイルの添付など、Diangoで提供されるメール送信機能について調べるには公式ドキュメントが一番です。
- TwilioQuest: 与えられたミッションをクリアすることでTwilioのサービスやAPIについてゲーム感覚で学べる面白いサイトです。SendGridに関するミッションもあるので遊んで学んでみてください。