Twilio SendGridとPythonでメールを一斉送信する方法

Twilio SendGridとPythonでメールを一斉送信する方法

この記事は 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 API Key

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

メールを成功の原動力に

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