Twilio SendGridを使ってPython Flaskでメールを送る方法

Twilio SendGridを使ってPython Flaskでメールを送る方法

この記事は 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を初めて使う場合には無料アカウントを作成してください。月12,000通まで無料で送信いただけます。

SendGridの設定を行う

SendGridからメール送信する前に、アカウントの認証情報として用いるAPIキーを作成します。アカウントにログインしたら、左側のメニューの“Settings”から“API Keys”を選び、“Create API Key”をクリックします。

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 にアクセスして以下のように表示されたら成功です。

Twilio SendGrid Example

宛先メールアドレスを入力して「Send a Test Email」ボタンを選択すると、メールが送信されます。ソースコードはGitHubからもダウンロードできます。

メールが届かなかったら

問題なくメール送信が成功していることを願いますが、届かないケースもあるかもしれません。SendGridはメール送信を非同期的に行っているので、ほとんどの問題は送信指示を完了した後に発生します。そのため、メール送信者のアプリケーションでは送信エラーの発生がわからないこともあります。多くの場合、届かない原因は宛先側メールサーバによる受信拒否です。

送信したメールのステータスはSendGridの画面から確認します。ダッシュボードからActivityを選択すると、発生したイベントの一覧が表示されます。Activityでは、送信を試みたメールのリストとそれらのメールが届いたかどうかを確認できます。詳しいイベントの見方はチュートリアルをご覧ください。

おわりに

このように、Twilio SendGridとFlask-Mailを使うとFlaskアプリケーションから簡単にメール送信できます。ぜひお試しください。

もっと楽しく学ぶには、Twilio QuestをダウンロードしてSendGridのミッションにチャレンジしてみてください。

メールを成功の原動力に

開発者にもマーケターにも信頼されているメールサービスを利用して、
時間の節約、スケーラビリティ、メール配信に関する専門知識を手に入れましょう。