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!📧