Twilio SendGridとPythonでメールを一斉送信する方法
- 2020年4月24日
- by SendGrid
- Category: 技術ネタ 機能・使い方

この記事は Sending Bulk Emails With Twilio SendGrid and Python の抄訳です。
メール配信のメリットの一つは、一度に多くの人たちへ情報を届けられることです。この記事では、SendGridでPythonを用いて一斉配信を行う方法をご紹介します。皆さんがPythonも使えるドーナツ屋の店主だったとして、メール配信を希望するお客さんにドーナツの焼き上がりを知らせてみましょう🍩
必要なツール
- Python 3(※Python 2系はEOLを迎えました)
- SendGrid無料アカウント(新規会員登録はこちらから)
- 動作確認用のメールアカウント(少なくとも2つ。異なるGmailアカウント2つでも良いです。)
最初に、Pythonの新規プロジェクトを作成しましょう。Twilioが公開している設定ガイドも参考にしてください。
次に、SendGridのダッシュボードからAPIキーを作成します。ここでは「bulk email」という名前をつけます。

「Create & View」ボタンをクリックすると、APIキーの文字列が表示されます。これをSENDGRID_API_KEYという名前で環境変数に設定しましょう。セキュリティ上の理由から、一度画面を閉じるとAPIキーを確認することができなくなるので注意してください。
SendGridのPythonライブラリをpip install sendgridでインストールします。send_mail.pyというファイルを作り、好きなエディタで開きます。
複数の宛先にメールを送る
以下のコードをsend_mail.pyにコピー&ペーストしてください。
import os
from sendgrid import SendGridAPIClient
from sendgrid.helpers.mail import Mail
# Replace these with your email addresses and names
to_emails = [
('example1@mail.com', 'Steven Universe'),
('example2@mail.com', 'Garnet')
]
message = Mail(
from_email=('sadie@thebigdonut.party', 'Sadie Miller'),
subject='🍩 Donuts, at the big donut 🍩',
html_content='<p>Fresh donuts are out of the oven. Get them while they’re <em>hot!</em></p>',
# for improved deliverability, provide plain text content in addition to html content
plain_text_content='Fresh donuts are out of the oven. Get them while they’re hot!',
to_emails=to_emails,
is_multiple=True)
try:
sendgrid_client = SendGridAPIClient(os.environ.get('SENDGRID_API_KEY'))
response = sendgrid_client.send(message)
print(response.status_code)
print(response.body)
print(response.headers)
except Exception as e:
print(e.message)
これを実行すると、以下のような表示が出ます。
202 b'' Server: nginx Date: Mon, 02 Dec 2019 23:44:46 GMT Content-Length: 0 Connection: close X-Message-Id: xxxx Access-Control-Allow-Origin: https://sendgrid.api-docs.io Access-Control-Allow-Methods: POST Access-Control-Allow-Headers: Authorization, Content-Type, On-behalf-of, x-sg-elas-acl Access-Control-Max-Age: 600 X-No-CORS-Reason: https://sendgrid.com/docs/Classroom/Basics/API/cors.html
同時に、下のようなメールが受信箱に届いているはずです。もし届いていなかったら、迷惑メールフォルダやプロモーションメールフォルダを確認してみてください。

Web APIの一回のリクエストで送ることができる宛先の上限は1000件です。もしドーナツ屋のスループット・スケーラビリティ・耐障害性がSendGridに引けをとらず、1000を超えるお客さんに一度にメールを送りたいと言うのなら、
宛先数を1000以下に分割して複数回sendメソッドを呼び出してください。
このメールを複数人に送っても、受信者は他の受信者のメールアドレスを見ることはありません。もし受信者が互いのメールアドレスを確認できるようにしたかったら、上のコードの18行目のis_multiple変数を削除してください。とは言え、よほどの理由がない限りは、他の受信者のメールアドレスを見えるようにすべきではありません。
一斉配信メールをパーソナライズする
やり手のドーナツ屋店主である皆さんは、お客さま一人ひとりへの気遣いを怠りません。その中で、スティーブンがベーコンドーナツをこよなく愛していることに気づきました。
personalizationsを使えば宛先ごとにメールのカスタマイズが可能なので、お客さんの好きなドーナツをタイトルに忍ばせて気を引くこともできます。
send_mail.pyの中身を以下に入れ替えてください。
import os
from sendgrid import SendGridAPIClient
from sendgrid.helpers.mail import Mail
from sendgrid.helpers.mail import To
# Replace these with your email addresses and names
to_emails = [
To(email='example1@mail.com',
name='Steven',
substitutions={
'-name-': 'Steven',
},
subject='Hi -name-, got BACON DONUTS? 🥓🥓🥓'),
To(email='example1@mail.com',
name='Garnet'),
]
message = Mail(
from_email=('sadie@thebigdonut.party', 'Sadie Miller'),
to_emails=to_emails,
subject='🍩 Donuts, at the big donut 🍩',
html_content='<p>Fresh donuts are out of the oven. Get them while they’re <em>hot!</em></p>',
plain_text_content='Fresh donuts are out of the oven. Get them while they’re hot!',
is_multiple=True)
try:
sendgrid_client = SendGridAPIClient(os.environ.get('SENDGRID_API_KEY'))
response = sendgrid_client.send(message)
print(response.status_code)
print(response.body)
print(response.headers)
except Exception as e:
print(e.message)
python send_mail.pyで送信テストを行いましょう。タイトルをパーソナライズしていない宛先には、デフォルトのタイトルで送信されます。一通はベーコンドーナツ、もう一通はデフォルトのタイトルのメールが届いているはずです。

personalizations APIではタイトルを変える以外にもいろいろなことができます。以下にカスタマイズ可能な属性を挙げます。
- subject – メールのタイトルを変える
- headers – メールのヘッダを変える
- substitutions – キーと値のペアを指定し、メールのタイトルやボディ内にあるキーを値に変換する
- custom_args – substitutionsの置換を受けないメールごとのカスタム値を指定する
- send_at – メールの送信時刻をUNIXタイムスタンプで指定する
まとめ
今日やったことを振り返りましょう。
- 複数の宛先にCcをせずに一斉送信する
- 複数の宛先にCcで一斉送信する
- personalizationsを用いて、複数の宛先に対してカスタマイズしたメールを送る
よくできました!自分にご褒美をあげましょう🎉 え、ドーナツが食べたくなったって?それは私のせいではありません🍩
SendGridのAPIはできないことがないほど機能が充実していて、ブログ記事ひとつに全てを詰め込むのは到底無理です。最新の情報は、公式ドキュメントをチェックしてください。GitHubで公開しているオープンソースのPythonライブラリもお見逃しなく。
最後までお読みいただきありがとうございました。Happy Emailing!📧


