PowerCMS™
アルファサードのゴールデンウィーク休業について を追加しました。
[ブログ] PowerCMS 6 でのアップデートまとめ を追加しました。
[新着情報] 多要素認証設定画面の QR コードが表示されない問題への対策ファイル を追加しました。
[新着情報] PowerCMSクラウド 月額費用の価格改定に関する追加情報を公開します を追加しました。

PowerCMS ブログ

ホーム > PowerCMS ブログ > 技術情報 > SendGridのWeb APIを利用してメールを送信する

2019年03月22日

SendGridのWeb APIを利用してメールを送信する

SendGridのWeb APIを利用して簡単にメールを送信することができるPerlモジュール Mail::SendGrid::WebAPI を紹介します。

SendGridのAPIドキュメントは以下にあります。

PowerCMSのメールマガジン機能の予約送信機能は、SMTPを経由して1件ずつキューに入れて順次送信する仕様となっているため、1件目の送信と最後の送信にそれなりのタイムラグが生じますが、Web APIに send_at パラメタを付けて送信することで、スケジュール配信を SendGridに任せてしまうことが可能です(MailMagazineプラグインの次期バージョンアップで、この機能が追加される予定です)。

Mail::SendGrid::WebAPI はPowerCMSのMailMagazineプラグインのexlibに含まれていますが、以下からダウンロードしていただけます。

メールを送信する最小限のサンプルは以下のようなものです。


    my %args = (
        method => 'POST',
        api_key => 'your.sendgrid.client.secret.key',
        version => 'v3',
    );
    my $sendgrid = Mail::SendGrid::WebAPI->new( %args );
    my $path = 'mail/send';
    my $params = { 
        personalizations => [
            { to => [ { email => 'junnama@alfasado.jp' } ],
              subject => 'Hello, World!' }
        ],
        from => { email => 'contact@alfasado.jp' }
        content => [ { type => 'text/plain', value => 'Hello, World!' } ],
    };
    my $res = $sendgrid->request( $path, $params );

$params に指定する内容

  • personalizationsに送信先アドレス、件名などを指定。配列にすることで1000件までの同時送信が可能です。
  • from にFromアドレス。toとfromは{ email => 'contact@alfasado.jp' , name => 'PowerCMS問い合わせ'} のようにすることで、名前付きでの指定が可能です。
  • content にtype(text/plainまたは text/html)、value(メール本文)を指定します。
  • request メソッドでmail/send エンドポイントに対して、リクエストを送信します。$sendgrid->request( 'mail/send ', $params );

追加パラメタで予約送信/予約をキャンセル可能にする

※ キャンセル可能にするためには、APIに対して「Scheduled Sends」権限が必要です。

  • batch_id => 'mail/batch' エンドポイントを叩いて得た値を予約送信メールに付けておく
  • send_at => 送信時刻をUnixタイムスタンプで指定する

少し長くなりますが、サンプルコードです。


    my %args = (
        method => 'POST',
        api_key => $api_key,
        version => 'v3',
    );
    my $sendgrid = Mail::SendGrid::WebAPI->new( %args );
    my $path = 'mail/batch';
    my $res = $sendgrid->request( $path );
    if ( $res->is_error ) {
       # Error
    } else {
        my $json = MT::Util::from_json( $res->content );
        my $batch_id =  $json->{ batch_id }; # 後のキャンセル用にbatch_idを取得
        my $path = 'mail/send';
        my $from = 'アルファサード <contact@alfasado.jp>';
        my $to   = '野田 純生 <junnama@alfasado.jp>';
        if ( MT::Util::is_valid_email( $from ) || MT::Util::is_valid_email( $to ) ) {
            # Error
        }
        my $content_type = 'text/plain';
        my $subject = 'メールの件名';
        my $body = 'メールの本文';
        my $send_at = time() + 3600;
        if ( $from =~ m/(^.*?)<(.*?)>$/ ) {
            my $name  = $1;
            my $email = $2;
            $name =~ s/^\s*(.*?)\s*$/$1/;
            $from = { email => $email, name => $name };
        } else {
            $from = { email => $from };
        }
        if ( $to =~ m/(^.*?)<(.*?)>$/ ) {
            my $name  = $1;
            my $email = $2;
            $name =~ s/^\s*(.*?)\s*$/$1/;
            $to = { email => $email, name => $name };
        } else {
            $to = { email => $to };
        }
        my $params = { 
            personalizations => [
                { to => [ $to ],
                  subject => $subject } # 配列にすることで1000件まで送信可能
            ],
            content => [ { type => $content_type, value => $body } ],
            from => $from,
            batch_id => $batch_id,
            send_at => $send_at
        };
        my $res = $sendgrid->request( $path, $params );
        if ( $res->is_error ) {
            # Error
        } else {
            # Do Something.
        }
    }

予約した送信をキャンセルする

送信予約したメールをキャンセルするには、user/scheduled_sendsエンドポイントに batch_idを付けてキャンセルリクエストを送信します。当たり前ですが、送信時刻を過ぎてしまうとキャンセルはできません。


    my %args = (
        method => 'POST',
        api_key => $api_key,
        version => 'v3',
    );
    my $sendgrid = Mail::SendGrid::WebAPI->new( %args );
    my $path = 'user/scheduled_sends';
    my $params = { batch_id => $batch_id, status => 'cancel' };
    my $res = $sendgrid->request( $path, $params );

カテゴリー
技術情報

Recent Entries