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 );
- カテゴリー
- 技術情報
コメントを投稿する