Twilio SendGridを使ってPython Flaskでメールを送る方法
- 2020年7月29日
- by SendGrid
- Category: 技術ネタ 機能・使い方
この記事は Using Twilio SendGrid To Send Emails from Python Flask Applications の抄訳です。
Webアプリにメール送信機能をどう組み込むかは常に厄介な問題です。自分自身でメールサーバを用意し管理するのか、サードパーティのメール配信サービスを使うのか……。メール配信量や予算、Webアプリにどんなプラットフォームを用いるかなど様々な要因に左右されますが、メール配信サービスのシンプルさが好まれる場合が多いようです。
このチュートリアルでは、PythonのWebアプリケーションフレームワークであるFlaskと、その拡張機能Flask-Mailを用いて、Twilio SendGridでメール送信する方法をご紹介します。
必要なツール
このチュートリアルには以下が必要です。
- Python 3.6以上: お使いのOSにあらかじめインタプリタがインストールされていない場合、python.orgからインストーラをダウンロードできます。
- Twilio SendGridのアカウント: SendGridを初めて使う場合には無料アカウントを作成してください。
SendGridの設定を行う
SendGridからメール送信する前に、アカウントの認証情報として用いるAPIキーを作成します。アカウントにログインしたら、左側のメニューの“Settings”から“API Keys”を選び、“Create API Key”をクリックします。
APIキーにはわかりやすい名前をつけましょう。このチュートリアルではFlask-Mailという名前にします。Permissionsに“Full Access”を選ぶことで、メール送信に必要な全ての機能が使えるようになります。特定の権限だけ持つAPIキーを作成したい場合には、“Restricted Access”を選んで必要な権限を与えましょう。
“Create & View”ボタンをクリックすれば、APIキーの文字列が表示されます。この文字列は一度しか表示できないので、あとで使えるようにクリップボードにコピーしてセキュアな場所にペーストしておきましょう。キーを保存したら、“Done”ボタンを押します。
Python環境を構築する
それでは、Flaskアプリでのメール送信方法を見てみましょう。twilio-sendgrid-testsのような名前でディレクトリを作成し、その中に新しくPythonの仮想環境を構築していきます。
MacまたはUnixユーザの場合、コマンドは以下のとおりです。
$ mkdir twilio-sendgrid-tests $ cd twilio-sendgrid-tests $ python3 -m venv venv $ source venv/bin/activate (venv) $ _
Windowsユーザの場合、コマンドは以下のとおりです。
$ mkdir twilio-sendgrid-tests $ cd twilio-sendgrid-tests $ python -m venv venv $ venv\Scripts\activate (venv) $ _
次に、仮想環境へFlaskとFlask-Mail、python-dotenvパッケージをインストールします。
(venv) $ pip install flask flask-mail python-dotenv
Flaskアプリを作る
app.pyというファイルを作成し、初めてのFlask・Flask-Mailのアプリケーションを実装しましょう。
import os from flask import Flask, render_template, request, redirect, url_for, flash from flask_mail import Mail, Message </li> app = Flask(__name__) app.config['SECRET_KEY'] = 'top-secret!' app.config['MAIL_SERVER'] = 'smtp.sendgrid.net' app.config['MAIL_PORT'] = 587 app.config['MAIL_USE_TLS'] = True app.config['MAIL_USERNAME'] = 'apikey' app.config['MAIL_PASSWORD'] = os.environ.get('SENDGRID_API_KEY') app.config['MAIL_DEFAULT_SENDER'] = os.environ.get('MAIL_DEFAULT_SENDER') mail = Mail(app)
こちらは、SendGridのSMTPを用いてメール送信するための設定です。
- メールサーバとしてsmtp.sendgrid.netを指定
- ポート番号として587を指定(25番でも可)
- TLS通信を有効化
- 認証情報として、ユーザ名にapikey(全てのSendGridアカウントで共通)を、パスワードに先ほど作成したAPIキーを指定
上記の項目をFlask-Mailの設定項目に追加します。認証情報をソースコードに顕に書くのはセキュリティ上好ましくないため、OS上にAPIキーをSENDGRID_API_KEYという環境変数として保存し、それを呼び出す形にします。また、差出人のメールアドレスも環境変数で設定しました。このメールアドレスは受信メールの「From」フィールドに表示されます。
.envファイルを作成し、2つの変数を記載します。
SENDGRID_API_KEY=”<your-sendgrid-api-key>” MAIL_DEFAULT_SENDER=”<your-sender-email-address>”
python-dotenvがインストールされていれば、これらの変数が自動的に読み込まれるので、Flaskアプリケーションで利用することができます。
メールを送る
それでは、Pythonシェルから自分自身に向けてテストメールを送信しましょう。
(venv) $ flask shell
flask shellコマンドを実行すると、app.pyで実装したFlaskアプリケーションを読み込み、mailインスタンスとFlask-MailのMessageクラスをimportします。
from app import mail from flask_mail import Message
次に、Messageインスタンスを生成します。
msg = Message('Twilio SendGrid Test Email', recipients=['recipient@example.com']) msg.body = 'This is a test email!' msg.html = '<p>This is a test email!</p>'
最後に、メールを送信します。
mail.send(msg)
うまくいけば、数秒のうちに受信ボックスへメールが届くはずです。
実際にFlaskアプリケーションに組み込んでみたい場合は、app.pyの末尾に以下のソースコードを追加します。
@app.route('/', methods=['GET', 'POST']) def index(): if request.method == 'POST': recipient = request.form['recipient'] msg = Message('Twilio SendGrid Test Email', recipients=[recipient]) msg.body = ('Congratulations! You have sent a test email with ' 'Twilio SendGrid!') msg.html = ('<h1>Twilio SendGrid Test Email</h1>' '<p>Congratulations! You have sent a test email with ' '<b>Twilio SendGrid</b>!</p>') mail.send(msg) flash(f'A test message was sent to {recipient}.') return redirect(url_for('index')) return render_template('index.html')
次に、テンプレートファイルindex.htmlが必要です。テンプレート用のディレクトリを作ります。
(venv) $ mkdir templates
templates/index.htmlに以下のHTMLソースを記載します。
<!doctype html> <html> <head> <title>Twilio SendGrid Example</title> </head> <body> <h1>Twilio SendGrid Example</h1> {% with messages = get_flashed_messages() %} {% for message in messages %} <p>{{ message }}</p> {% endfor %} {% endwith %} <form action="" method="post"> <p>Your email: <input type="text" name="recipient"></p> <p><input type="submit" value="Send a Test Email"></p> </form> </body> </html>
アプリケーションを起動してみましょう。
(venv) $ flask run
ブラウザで http://localhost:5000 にアクセスして以下のように表示されたら成功です。
宛先メールアドレスを入力して「Send a Test Email」ボタンを選択すると、メールが送信されます。ソースコードはGitHubからもダウンロードできます。
メールが届かなかったら
問題なくメール送信が成功していることを願いますが、届かないケースもあるかもしれません。SendGridはメール送信を非同期的に行っているので、ほとんどの問題は送信指示を完了した後に発生します。そのため、メール送信者のアプリケーションでは送信エラーの発生がわからないこともあります。多くの場合、届かない原因は宛先側メールサーバによる受信拒否です。
送信したメールのステータスはSendGridの画面から確認します。ダッシュボードからActivityを選択すると、発生したイベントの一覧が表示されます。Activityでは、送信を試みたメールのリストとそれらのメールが届いたかどうかを確認できます。詳しいイベントの見方はチュートリアルをご覧ください。
おわりに
このように、Twilio SendGridとFlask-Mailを使うとFlaskアプリケーションから簡単にメール送信できます。ぜひお試しください。
もっと楽しく学ぶには、Twilio QuestをダウンロードしてSendGridのミッションにチャレンジしてみてください。