SendGrid 新人成長記 第四回 Pythonを使ってWeb APIを呼び出す

新人成長記

こんにちは!今回は、よく知られているプログラミング言語を用いてSendGridのWeb APIを呼び出すコードを書き、メールを送信してみたいと思います。

前回までの記事では、APIリファレンスのTry it out機能を用いて簡易的にメールの送信を行ってきました。一方、実際の運用でユーザ登録やパスワードのリセットといった外部からのアクションをトリガーにメールを送ろうとする際には、アプリケーションとSendGridを連携させることが必要になってきます。それを実現させる手段の一つとして、SendGridではメール送信のための公式ライブラリを7つのプログラミング言語で用意しています。今回はその中からPythonを用いてメール送信をしてみました(Pythonを選んだのは私が以前触ったことのある言語だからというだけで、あまり深い理由はありません)。ライブラリの公式ページに基づいて、1. APIキーを環境変数に設定し、2. コードを書いて実行する、という2ステップで進めます。

1. 環境変数の設定

認証情報をコードにベタ書きするのはセキュリティ上望ましくないので、取得したAPIキーは環境変数として設定し、コードの中ではその環境変数を参照する形にしたいと思います。OSによって方法が異なりますが、macOS 10.14 Mojaveの場合、~/.bash_profileに
export SENDGRID_API_KEY=’SG.XXX’
という文字列を追加し(SG.XXXは取得したAPIキー)、sourceコマンドで設定を反映させます。

$ echo "export SENDGRID_API_KEY=’SG.XXX’" > ~/.bash_profile
$ source ~/.bash_profile

2. 公式ライブラリを用いたコードの作成

まずはパッケージ管理ツールpipを使ってSendGridのライブラリをインストールしましょう。

$ pip3 install sendgrid

あとは下のようなコードを書いて実行すれば、メールが送信できます!

import os
from sendgrid import SendGridAPIClient
from sendgrid.helpers.mail import Mail

message = Mail(
    from_email='from_address@example.com',
    to_emails='<<YOUR_ADDRESS>>',
    subject='Hello, World!',
    plain_text_content='Hello, World!')

sg = SendGridAPIClient(os.environ.get('SENDGRID_API_KEY'))
response = sg.send(message)
print(response.status_code)

os.environ.get(‘SENDGRID_API_KEY’)で環境変数からAPIキーを取得し、ライブラリで定義されたSendGridAPIClientというインスタンスに入れます。このインスタンスのメソッドであるsendに、メールを送信するための情報をjson形式で渡しています。<<YOUR_ADDRESS>>はご自身のメールアドレスにしてください。最後のprint文でステータスコードを表示させているので、コマンドラインに202と出たら送信処理は成功です。受信箱を確認してみましょう。

【補足】 公式ライブラリを使わない場合
補足として、以下に公式ライブラリを使わない方法も紹介します。実際、上のような単純なものであれば、プログラムの中で直接Web APIを呼び出すこともできます。先ほどと同様に環境変数を設定したら、HTTPリクエストを簡単に送れるライブラリであるrequestsをsendgridライブラリの代わりにインストールします。

$ pip3 install requests

コードは以下のようになります。

import os, requests

url = 'https://api.sendgrid.com/v3/mail/send'
headers = {'Authorization': f'Bearer {os.environ.get("SENDGRID_API_KEY")}'}
message = {'personalizations': [{'to': [{'email': 'YOUR_ADDRESS'}], 'subject': 'Hello, World!'}],
            'from': {'email': 'from_address@example.com'},
            'content': [{'type': 'text/plain', 'value': 'Hello, World!'}]
         }

response = requests.post(url, headers=headers, json=message)
print(response.status_code)

SendGrid公式ライブラリを使う場合と異なるのは、URLを指定していることと、Try it outの場合と同様にヘッダーにAPIキーを指定していることです。それでも、公式ライブラリを使う場合とさほど変わらないコード量でメールが送信できました。

Try it outを使うだけでは実際にメール配信サービスがどう運用されるかイメージが湧かなかったのですが、ソースコードからメール送信してみることで、外部のシステムやサービスと連携するための第一歩が踏み出せました。

※なお、公式ライブラリに関するサポートについては、こちらをご覧ください。