Pythonでメール送信!SendGridを使って簡単に実装する方法

PythonからSendGrid公式ライブラリを使ってメールを送る方法

はじめに

今回はPythonから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で受信したメール

宛先1で受信したメール

宛先2で受信したメール

宛先2で受信したメール

送信元アドレスに「sendgrid.net経由」と表示されているのはDomain Authenticationを設定していないためです。正しく設定することで、独自ドメインからメールを送信したように表示することができます。

さいごに

SendGrid公式ライブラリを利用すると、複雑なSMTPプロトコルに触れることなく簡単にメール送信を行うことができます。文字の埋め込みやカテゴリ指定なども簡単です。
また、バウンス時の処理や配信停止の管理、送信ドメイン認証の設定などもSendGridに任せることができるので、開発工数を大幅に削減することができます。

SendGridのフリートライアル(無期限)へのお申込みはこちらから。

その他の言語については、メール送信チュートリアル【まとめ】 をご覧ください。

参考記事

その他の機能の使い方については、リポジトリに含まれるサンプルコードをご確認ください。

メールを成功の原動力に

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