Pythonでメール送信!
Twilio SendGridを使って簡単に実装する方法
- 2021年4月16日
- by SendGrid
- Category: 技術ネタ 機能・使い方
はじめに
今回はPythonからTwilio SendGridの公式ライブラリを使ってメールを送信する方法をサンプルコードを交えながらご紹介します。メール文面(件名、本文)への文字列埋め込み、日本語、添付ファイルなどを利用しています。
前提条件
サンプルコードを試す前に以下の環境のセットアップを完了しておいてください。
- Python 3.7
- pipenv
- git
- SendGridアカウント
本記事の内容はmacOS上に環境構築したものですが、その他のOSでも基本的に手順は同じです。Windowsの場合、cpはcopyコマンドに読み替えてください。なお、SendGrid公式ライブラリ(sendgrid-python)はバージョン6.6.0を使用しています。
準備
コードサンプルをリポジトリからクローンします。
git clone git@github.com:SendGridJP/sendgridjp-python-example.git
リポジトリ内に移動して.env.exampleをコピーします。
cd sendgridjp-python-example cp .env.example .env
.envファイルを編集(後述)します。
pipenvによる依存関係の解決を行います。
pipenv install
サンプルを実行します。
pipenv shell python sendgrid-python-example.py
.envファイルの編集
.envファイルは以下のような内容になっています。
API_KEY=api_key TOS=you@youremail.com,friend1@friendemail.com,friend2@friendemail.com FROM=you@youremail.com
https://github.com/SendGridJP/sendgridjp-python-example/blob/master/.env.example
API_KEY:SendGridのAPI Key(Mail SendへのFULL ACCESSパーミッションが必要)を指定してください。
TOS:宛先をカンマ区切りで指定してください。サンプルコードの関係上、宛先は3つ以上指定してください。
FROM:送信元アドレスを指定してください。
サンプルコード
今回使用したサンプルコードを以下に示します。
from sendgrid import SendGridAPIClient from sendgrid.helpers.mail import * import os import base64 from dotenv import load_dotenv load_dotenv() # .envから環境変数を読み込む sendgrid_api_key = os.environ.get('API_KEY') from_address = os.environ.get('FROM') to_list = os.environ.get('TOS').split(',') # メッセージの構築 message = Mail() # 各宛先と、対応するSubstitutionタグを指定 fullname_list = ['田中 太郎', '佐藤 次郎', '鈴木 三郎'] familyname_list = ['田中', '佐藤', '鈴木'] place_list = ['中野', '目黒', '中野'] for num in range(len(to_list)): message.to = To(to_list[num], fullname_list[num], p = num) message.substitution = [ Substitution('fullname', fullname_list[num], p = num), Substitution('familyname', familyname_list[num], p = num), Substitution('place', place_list[num], p = num), ] # 送信元を設定 message.from_email = From(from_address, '送信者名') # 件名を設定 message.subject = Subject('[sendgrid-python-example] フクロウのお名前はfullnameさん') # 本文(テキストパートとHTMLパート)を指定 message.content = Content(MimeType.text, 'familyname さんは何をしていますか?\r\n 彼はplaceにいます。') message.content = Content(MimeType.html, '<strong>familyname さんは何をしていますか?</strong><br />彼はplaceにいます。') # カテゴリ情報を付加 message.category = Category('Category1') # カスタムヘッダを指定 message.header = Header('X-Sent-Using', 'SendGrid-API') # 画像ファイルを添付 with open('gif.gif', 'rb') as f: data = f.read() f.close() encoded_file = base64.b64encode(data).decode() message.attachment = Attachment(FileContent(encoded_file), FileName('owl.gif'), FileType('image/gif'), Disposition('attachment')) # メール送信を行い、レスポンスを表示 sendgrid_client = SendGridAPIClient(sendgrid_api_key) response = sendgrid_client.send(message = message) print(response.status_code) print(response.body) print(response.headers)
https://github.com/SendGridJP/sendgridjp-python-example/blob/master/sendgrid-python-example.py
解説
8~11行目
環境変数からSendGridの認証情報、送信元アドレス、宛先リストを読み込んでいます。
16~28行目
宛先リストと、対応するSubstituionタグを設定しています。Substitutionタグは宛先ごとに件名、本文に文字列を埋め込むための機能です。引数pにより、各宛先とSubstitutionタグが紐付けられます。
宛先を複数指定しても配信されたメールの宛先には他の宛先が見えることはありません。受信者のアドレスのみ設定されます。
また、複数の宛先を指定した場合でも送信リクエストは1回となるため、大量の宛先に対して高速に送信処理要求を送ることが可能です。宛先リストは最大で1,000アドレスまで指定可能です。
33~38行目
メールの件名と本文(text/plainおよびtext/html)を設定しています。
「fullname」「familyname」「place」というSubstitutionタグを埋め込んでいます。
40~55行目
カテゴリ、カスタムヘッダ、添付ファイルを設定しています。カテゴリを指定しておくと、カテゴリごとにメール配信に関わる統計情報を取得することができるようになります。
57~62行目
メールを送信してレスポンスを出力しています。
実行結果
各宛先には次のようなメールが配信されます。
宛先には、自分のみが設定されていることがわかります。
Substitutionタグがそれぞれ指定した文字列に置換されていることが確認できます。
宛先1で受信したメール
宛先2で受信したメール
送信元アドレスに「sendgrid.net経由」と表示されているのはDomain Authenticationを設定していないためです。正しく設定することで、独自ドメインからメールを送信したように表示することができます。
さいごに
SendGrid公式ライブラリを利用すると、複雑なSMTPプロトコルに触れることなく簡単にメール送信を行うことができます。文字の埋め込みやカテゴリ指定なども簡単です。
また、バウンス時の処理や配信停止の管理、送信ドメイン認証の設定などもSendGridに任せることができるので、開発工数を大幅に削減することができます。
Twilio SendGridのアカウントは無料で作成でき、Freeプランでも無期限でほぼ全ての機能を利用可能です。ぜひご利用ください。
その他の言語については、メール送信チュートリアル【まとめ】 をご覧ください。
参考記事
その他の機能の使い方については、リポジトリに含まれるサンプルコードをご確認ください。