Challenge Engineer Life !

エンジニア人生を楽しみたい!仕事や趣味で学んだ技術的なことを書いていくブログです。

Heroku Add-onsのSendGridトラブルシューティング

Twitterでよく「HerokuからSendGridが使えなくて困っている」というのを見かけるので、実際どんな感じなのか試してみました。

Herokuのコマンドと画面でそれぞれ10回ぐらいSendGrid Add-onsを試したところ、8割は成功で
・メールが送信できる
・宛先にも届く
という結果でした。

残り2割は以下の1と2でした。私は再現できませんでしたが、3に該当するケースもあるようです。

  1. SendGridにログインできない
  2. SendGridにログインできる。APIキーを作れてメールの送信はできるが宛先に届かない。一度ログアウトするとログインできなくなる
  3. SendGridにログインできる。APIキーを作成できる、メールの送信はできるが宛先に届かない。ダッシュボード上に「Your account has been suspended. Please contact Support to regain access. 」のエラーがでる。

なんでいきなり使えないの?と不満に思われる方も多いと思いますが、SendGridではスパムメール対策のためにアカウントを次の状態にすることがあります。

・Suspension...送信リクエストは受け付けるがメールは送信されない状態
・Ban...アカウントが凍結してまったく使えない状態

Heroku経由だと誰でも簡単にアカウントが作成できてしまうため、作成後に一定の確率で上記の状態にしているように見えます。(私の推測です)

今回の記事では、1〜3の問題を解決する方法と、Heroku以外のアカウントを使って回避する方法を紹介します。

SendGridにログインできない(1のケース)

確認したこと

Add-onsを追加後、通常はHerokuのOverviewまたはResourcesからSendGridにログインできます。

OverviewからSendGridのダッシュボード表示image
OverviewからSendGridのダッシュボード表示

ResourcesメニューからSendGridのダッシュボード表示

成功するとSendGridのダッシュボードが表示されます。

ログインに成功した場合:SendGridのダッシュボード
ログインに成功した場合:SendGridのダッシュボード

1のケースでログインできないときは「sendgrid.comへのアクセスが拒否されました」と表示されます。(キャプチャはGoogle Chromeです)一瞬、ネットワークが切れたのかと思いました。

sendgrid.comへのアクセスが拒否されました
ログインに失敗した場合:sendgrid.comへのアクセスが拒否されました

クリックした後の認証が何らか失敗しているだけなのかな?と思って、ユーザ名とパスワードを調べてログイン画面で試しましたがダメでした。

ちなみにユーザ名とパスワードは以下で確認できます。

コマンドの場合

heroku config:get SENDGRID_USERNAME -a herokusendgrid(アプリ名)
heroku config:get SENDGRID_PASSWORD -a herokusendgrid(アプリ名)

画面の場合

「Settings」で「Reveal Config Vars」ボタンを押すと表示されます。

SendGridのログイン情報の確認方法(画面)
SendGridのログイン情報の確認方法(画面)


解決方法

ログインできないので、どうしようもないです。一番早いのはアプリごとまるっと削除して作り直すことでした。

ちなみにアプリごと再作成するのではなくAdd-onsのみの再作成でいけないか試したのですが、ダメでした。これをやると次のエラーになります。


Item could not be created:
An error was encountered when contacting the add-on partner to create sendgrid:starter: Error Provisioning User - User status - banned

エラーメッセージを見るとアカウントがbanされた状態に当たり、Add-onsだけを再作成しても変わらないようです。

SendGridにログインできてAPIキーは作成できるがメールは送れない。一度ログアウトするとログインできなくなる。(2のケース)

一見問題がないように見えるため、個人的にはこのケースが一番厄介だと思いました。

確認したこと

1と異なりSendGridにログインができたら、以下の記事を参考にAPIリファレンスのTry it out機能を使ってメールを送信します。

SendGrid 新人成長記 第二回 Web APIを使ってメールを送ってみた | SendGridブログ

応答コードは2xxで成功しているのに、メールが届かない(迷惑メールフォルダ含め)場合はActivity画面をチェックしてください。Activity画面で以下のように何もイベントが発生していない場合は、今回のケースに該当している可能性が高いです。

f:id:kikutaro777:20200413005449p:plain

一度ログアウトして、もう一度ログインしてみてください。1のケースと同じ画面が出たらアウトです。

解決方法

1の解決方法と同じです。アプリを再作成してください。

「Your account has been suspended. Please contact Support to regain access. 」のエラーが出る(3のケース)

確認したこと

冒頭に書いた通り私は再現できませんでしたが、以下の記事など該当するケースはあるようです。

qiita.com

qiita.com

解決方法

上記の記事のとおり、米国のSendGridに英語で問い合わせると使える状態にしてくれるようです。
*後述しますが、国内代理店の構造計画研究所では対応できないのでご注意ください。

Heroku以外のアカウントを使う方法

ここまでエラーごとの解決方法について触れてきました。これらの問題について、日本でSendGridの代理店をしている構造計画研究所にサポートを求めようとする方もいらっしゃると思いますが、残念ながらHerokuやMicrosoft AzureのSendGridアカウントはサポート対象外なのでご注意ください。

Azure marketplace等のアドオンとしてSendGridを利用していますが、日本語サポートは受けられますか? – サポート

今回紹介した問題を最初から回避したい場合は、構造計画研究所経由でアカウントを作るという選択肢もあります。その場合はHerokuと異なり、アカウントの審査があるので発行されるまでのスピードはHerokuに劣ります。その代わり、発行されたアカウントでは今回の問題に当たることなく使えます。(もちろん悪い送信をして、SendGridから止められることはあります。あくまでアカウント取得した直後に使えない状態となることはない、という意味です)

JavaMailとSendGridを使ってAMP for Emailを試してみる

AMP(Accelerated Mobile Pages)はGoogleが中心に進めているモバイル端末でWebページを高速に表示するための仕組みです。これをメールに応用したAMP for Emailは、メールの世界で動的コンテンツを使えるようにし、よりインタラクティブなコミュニケーションを可能にしてくれます。

AMP Open Source Projectのサイトはこちらです。
amp.dev

動的コンテンツって具体的にどんなものなの?という疑問が浮かんだ方は「Gmail AMP for Email Playground」をみてください。下図のようにいくつかのサンプルが実際に確認できます。
f:id:kikutaro777:20190830002738g:plain

これをみているうちに、AMP for Emailってどうやって送るんだろう?と気になったので、JavaMailとSendGridのSMTPで試してみました。

8/31追記:JavaMailと書きましたが、今はJakarta Mailが正しい呼称です。

お試しレベルであれば割と簡単で、次の2つを行うだけです。

①Gmailで動的メールを有効化して、許可するFromメールアドレスを設定する
②AMP MIMEパート(text/x-amp-html)を追加する

①の設定はGmailの「設定」で行います。
f:id:kikutaro777:20190830003817p:plain

「動的メールを有効にする」にチェックを入れて「デベロッパー向けの設定」をクリックします。
f:id:kikutaro777:20190830003926p:plain

Fromメールアドレスを指定します。
f:id:kikutaro777:20190830004032p:plain

続いて②です。

JavaMailを使ったシンプルな送信プログラムは次のとおりです。
github.com

今回はこれをベースにして、SendGridのSMTPを使います。
接続先にSendGridのSMTPを設定します。

Properties prop = new Properties();
prop.put("mail.smtp.host", "smtp.sendgrid.net");
prop.put("mail.smtp.port", 587);

認証はSendGridのAPIキーを使います。

Transport.send(msg, "apikey", "SG._xxxxx");

マルチパートを設定している部分を抜粋するとこんな感じです。

MimeBodyPart text = new MimeBodyPart();
text.setText("こんにちは");
            
MimeBodyPart html = new MimeBodyPart();
html.setText("<html><body><b>こんにちは</b></body></html>", "UTF-8", "html");

MimeMultipart mp = new MimeMultipart("alternative", text, html);

ここにAMP MIMEパート(text/x-amp-html)を追加します。今回は序盤に紹介した「Gmail AMP for Email Playground」のamp-carouselを試しました。

MimeBodyPart amp = new MimeBodyPart();
amp.setText("<!doctype html>"+
            "<html ⚡4email>"+
            "<head>"+
            "  <meta charset=\"utf-8\">"+
            "  <script async src=\"https://cdn.ampproject.org/v0.js\"></script>"+
            "  <style amp4email-boilerplate>body{visibility:hidden}</style>"+
            "  <script async custom-element=\"amp-carousel\" src=\"https://cdn.ampproject.org/v0/amp-carousel-0.1.js\"></script>"+ 
            "  <style amp-custom>"+
            "    .emailbody {"+
            "      padding: 16px;"+
            "    }"+
            "    .images {"+
            "      max-width: 100%;"+
            "    }"+
            "  </style>"+
            "</head>"+
            "<body>"+
            "  <div class=\"emailbody\">"+
            "    <div class=\"images\">"+
            "      <amp-carousel width=\"800\" height=\"600\" layout=\"responsive\" type=\"slides\">"+
            "        <amp-img src=\"https://www.google.com/images/background/p1.jpg\" width=\"800\" height=\"600\""+
            "          alt=\"a sample image\"></amp-img>"+
            "        <amp-img src=\"https://www.google.com/images/background/p2.jpg\" width=\"800\" height=\"600\""+
            "          alt=\"a sample image\"></amp-img>"+
            "        <amp-img src=\"https://www.google.com/images/background/p3.jpg\""+
            "          width=\"800\" height=\"600\" alt=\"another sample image\"></amp-img>"+
            "       <amp-img src=\"https://www.google.com/images/background/p4.jpg\" width=\"800\" height=\"600\" alt=\"and another sample image\"></amp-img>"+
            "        <amp-img src=\"https://www.google.com/images/background/p5.jpg\" width=\"800\""+
            "          height=\"600\" alt=\"and another sample image\"></amp-img>"+
            "      </amp-carousel>"+
            "    </div>"+
            "  </div>"+
            "</body>"+
            "</html>","UTF-8", "x-amp-html");
MimeMultipart mp = new MimeMultipart("alternative", text, html, amp);

はやくJavaにraw stringが来てほしい…ボソリ

最後にFromを設定します。①でGmailに設定したFromを使います。

msg.setFrom("kikutaro@kikutaro.tech");

以上です。これで動的コンテンツの許可をしたメアドで受信します。メールを開くと「動的メール」を示すメッセージが表示されます。
f:id:kikutaro777:20190830005925p:plain

こんな感じです。ちゃんとカルーセルになってる!
f:id:kikutaro777:20190830010519g:plain

面白い技術である一方、デバッグとか大変そうだなぁ…なんて思ったり。メールの世界は今後どうなっていくのですかね。

ちなみに今回はSendGridのSMTPを利用しましたが、Web API v3も対応しているようなので、今度試したいと思います。
sendgrid.kke.co.jp

Stripo で作ったメールデザインをSendGridに取り込む

Stripoは、メールテンプレートをデザインするためのサービスです。

f:id:kikutaro777:20190827234509p:plain

メールをデザインする機能自体は珍しいものではなく、多くのメール配信サービスが同じ機能を持っています。もちろんSendGridにもあり、GUIベースのデザインエディタと直接HTMLを定義するコードエディタの2種類を提供しています。

Stripoはデザインに特化しているだけあって、SendGridにはない面白いモジュールが並んでいます。たとえば、動画を埋め込む「Video」、時刻を表示する「Timer」、メニューを作る「Menu」などです。
f:id:kikutaro777:20190827235551p:plain

極めつけは青い稲妻アイコンのついた「AMP-Carousel」で、インタラクティブなメールを作るためのAMP for Emailに対応したモジュールとなっています。

こうした単体のモジュール以外にも、ヘッダやカードのように複数のモジュールを組み合わせたものが充実しているため、綺麗なテンプレートを作りやすいサービスとなっています。

f:id:kikutaro777:20190828000504p:plain

f:id:kikutaro777:20190828000538p:plain

Stripo自体にはメール送信機能はないため、送信するときは他のサービスを使う必要があります。通常であれば、デザインしたHTMLをエクスポートして、送信系のサービスにインポートしますが、Stripoでは様々なメール送信サービスと連携できるようになっていて、ボタン一発でテンプレートを流し込めます。

今回はSendGridを試しました。
f:id:kikutaro777:20190828001154p:plain

SendGridを選択後、アカウント名とAPIキーを入力して「Export」を押すと、自動的にテンプレート(Transactional Templates)に流し込んでくれます。
f:id:kikutaro777:20190828002340p:plain

実際に試したところ、以下のようにテンプレートが作成されました。簡単ですね。
f:id:kikutaro777:20190828002248p:plain

SendGridのモジュールだと物足りない、という方はぜひStripoをお試しください。

getsitecontrolを使ってSendGridのメール購読フォームを5分で設置する

珍しく釣りっぽいタイトルを付けてしまったのですが、実際にできたので嘘ではありません(^^;

よくWebサイト上でフワッと表示されるウィジェット(問合せフォームやメール購読、プロモーション、チャット…etc)をみかけますが、これを簡単に設置できるgetsitecontrolというサービスがあります。

getsitecontrol.com

f:id:kikutaro777:20190822223849p:plain

発行されたJavaScriptをWebサイトに埋め込んでおくだけで、色々な種類のウィジェットを設置できます。どのページで表示するか、表示する条件となるアクセス元の端末・ブラウザ・OSなども設定できる優れものです。

f:id:kikutaro777:20190822230532p:plain

getsitecontrolのinterationにSendGridがあり、メール購読フォームの設置+マーケティングキャンペーン機能の宛先リストへの登録が簡単にできたので紹介します。

getsitecontrolにサインアップして初期設定する

「Try for free」のボタンでサインアップします。
f:id:kikutaro777:20190822230840p:plain

アカウント名とパスワードを決めて、ウィジェットを設置するWebサイトのURLを入れます。
f:id:kikutaro777:20190822230931p:plain

JavaScriptのコードが生成されるので、WebサイトのHTMLを開いてbodyタグの末端に入れます。
f:id:kikutaro777:20190822231052p:plain

私はこのはてなブログで試しました。bodyタグの末端に定義する方法がわからず、とりあえずデザインのフッタに入れました。
f:id:kikutaro777:20190822231414p:plain

問題なく設置できたのか「Check Code」ボタンで検証できます。
f:id:kikutaro777:20190822231515p:plain

コードの埋め込みに成功していると以下の画面となって準備完了となります。
f:id:kikutaro777:20190822231605p:plain

メール購読フォームを作成する

では早速メール購読フォームを作ってみます。「Create Widget」を押します。
f:id:kikutaro777:20190822231811p:plain

プルダウンメニューはこんな感じです。ここでは「Subscribe」を選択します。
f:id:kikutaro777:20190822231840p:plain

ウィジェットのデザイン画面が表示されます。かなり柔軟に変えられそうです。今回はデフォルトのまま、Webサイトの下端にフォームが表示されるもので進めました。
f:id:kikutaro777:20190822231914p:plain

ウィジェットのデザインを決めたら「Integrations」で連携先を設定します。SendGridを選びます。
f:id:kikutaro777:20190822232036p:plain

Connectionを押すと、SendGridのAPIキーを入力するダイアログが表示されるので、APIキーを入力します。
f:id:kikutaro777:20190822232154p:plain

すると、SendGridのマーケティングキャンペーン機能にある宛先リストが表示されるので、いずれか選択します。ちゃんとUIに組み込まれているのがいいですね。
f:id:kikutaro777:20190822232321p:plain

最後にウィジェットを「Activate」にして有効化します。
f:id:kikutaro777:20190822232411p:plain

動作確認

ブログを開くと、ウィジェットがヌルっと表示されました!
f:id:kikutaro777:20190822232557p:plain

メアドを入れます(このキャプチャのメアドは存在しません)
f:id:kikutaro777:20190822232814p:plain

SendGridの宛先リストを確認すると…入ってます!簡単すぎる…!
f:id:kikutaro777:20190822233816p:plain

ウィジェットのデザインはgetsitecontrol側でするだけで、Webサイト側には手を加える必要がありません。実用的ですね。

(補足)英語ですが、今回と同じような内容が以下でまとまっていました。
getsitecontrol.com

SendGridのEvent WebhookをSumo Logicで受信する

SendGridのメール送信イベントを保存したいときは、Event Webhookを使います。

保存先はHTTPのPOSTを受信できる環境であれば何でも構いません。手元の環境で確認したい場合はngrokが便利です。Web上でデバッグしたい場合は次のようなサービスが使えます。

運用レベルのものを含めてSendGridのブログでも色々紹介されているので、興味ある方はぜひ見てください。

さて、本題へ。

今回はSumo Logicというログデータの収集・管理サービスを使ってSendGridのEvent Webhookを受信してみます。設定は簡単です。

ログインしたら「Setup Wizard」を選びます。
f:id:kikutaro777:20190821232655p:plain

「Set Up Streaming Data」を選択してください。
f:id:kikutaro777:20190821232740p:plain

Data Typeは「All Other Sources」を選びます。
f:id:kikutaro777:20190821232829p:plain

SendGridのPOSTを受け取るので「HTTP Source」を選びます。
f:id:kikutaro777:20190821232946p:plain

Source Categoryを入力します。「///」とみえているので、それぞれ「環境名/サーバー種類/アプリケーション名/ログ種別」で名づけると良いようです。
f:id:kikutaro777:20190821233122p:plain

ここでは「kikutaro/sendgrid/event」としました。(1つ足りないですが…特に問題なさそう?)
f:id:kikutaro777:20190821233335p:plain

URLが発行されるので、コピーします。
f:id:kikutaro777:20190821233523p:plain

Sumo Logic側の設定は以上です。
f:id:kikutaro777:20190821233756p:plain

あとはコピーしたURLをSendGridのEvent Webhookに設定するだけです。設定したら「Test Your Integration」ボタンでダミーイベントを送信します。
f:id:kikutaro777:20190821233649p:plain

イベント情報を正常に受信すると、次のように表示されます。簡単ですね。
f:id:kikutaro777:20190821234016p:plain

この環境でどんな分析ができるのか、色々試してみたいと思います~。

Integromat + SendGridでスケジュール送信する

SendGridにはスケジュール送信機能があるのですが、すべてAPIベースに操作する必要があるため、わりと玄人向けな機能となっています。
sendgrid.kke.co.jp

スケジュール指定の上限は72時間といった制限もあるため、個人的には簡単なバッチプログラムを作って、通常のメール送信APIを呼び出すのが楽だと思っています(中の人がいうのもなんですが)。

先日から触っているIntegromatを使うと、このバッチプログラムを簡単に作ることができます。IntegromatのSendGridモジュールにある「Send an Email」と「Make an API Call」のどちらも使えるので、それぞれ紹介します。
f:id:kikutaro777:20190820223313p:plain

Send an Emailを使う

「Send an Email」はWeb API v3のsend mailを簡単に呼び出せるUIとなってます。FromやTo、SubjectやContent Type、Contentなどを指定するだけです。Transactional Templateも使えます。
f:id:kikutaro777:20190820224023p:plain

添付ファイルが使えるのもいいです。Send atパラメータも指定できるので、やろうと思えばここでスケジュール登録もできます。ただし、前述のとおり+下図の画面下メッセージにもあるように72時間という制限があるため、ここでは使いません。
f:id:kikutaro777:20190820224032p:plain

メールの設定をしたら、モジュールの時計マークをクリックします。
f:id:kikutaro777:20190820224521p:plain

するとIntegromatのスケジュール設定が表示されます。
f:id:kikutaro777:20190820224705p:plain

選べるのは以下の6つです。

  • At regular intervals…何分おきに実行するか選べます。Advanced schedulingで実行する日付の範囲指定、何月、何曜日まで設定可能です。
  • Once…1度だけ実行します。年月日時分秒を指定します。
  • Every day…毎日します。時分を指定します。
  • Day of the week…実行する曜日と時分を指定します。
  • Day of the month…実行する月と時分を指定します。
  • Specified dates…月日時分を指定します。

今回は単発のスケジュール送信をするため「Once」を選び、送信する時間を指定しました。
f:id:kikutaro777:20190820224555p:plain

設定はこれだけです。このシナリオを実行して、該当時刻になるとメールが飛びました。
f:id:kikutaro777:20190820225858p:plain

Make an API Callを使う

「Make an API Call」はSendGridのWeb APIを自由に呼び出すためのメニューです。さきほどの「Send an Email」と違って「Make an API Call」はメール送信に特化したUIではないのですが、その分、自由度が高く、エンドポイントは自由に指定できますし、リクエストのJSONもそのままぶっこめます。

メールを送信する場合はURLに「mail/send」と入力します。最初ここはハマりやすいのですが、「https://api.sendgrid.com/v3/」が前提となっているので、それ以降のURLパスを指定する必要があります。
f:id:kikutaro777:20190820225951p:plain

Bodyに送信リクエストのJSONをまるっと入れます。
f:id:kikutaro777:20190820230428p:plain

これだけです。あとは前述の「Send an Email」と同じようにスケジュール登録すれば、該当時刻にメールが飛びます。

ノンコーディングで簡単にSendGridのスケジュール送信できました。かなり実用的だと思います。

IntegromatでSendGridのRecipients追加を監視してSlackで通知する

IntegromatのSendGrid moduleに「Watch new Lists」と「Watch new Recipients」というトリガーが追加されていました。

それぞれマーケティングキャンペーン機能

  • 新しくリストが追加されたとき(Watch new Lists)
  • 宛先リストの中に新しく宛先が追加されたとき(Watch new Recipients)

を検知できます。

よくやりそうな例として、後者の宛先追加をトリガーにしてSlackに通知するScinarioを作ってみました。3分くらいでできます(^^;

SendGridの設定

Create a New Scinarioで新しいシナリオを作成して「SendGrid」を選びます。
f:id:kikutaro777:20190819221316p:plain

Watch new Recipientsを選択します。
f:id:kikutaro777:20190819221409p:plain

Connectionがない場合は「Add」で作成します。Connection nameを入れて、SendGridのAPIキーを入れるだけです。
f:id:kikutaro777:20190819230740p:plain

SendGridに宛先リストがない場合は作成します。宛先リストの作成方法はこちらを参照してください。下図はManual Addで手入力した場合です。
f:id:kikutaro777:20190819230858p:plain

ウォッチ対象の宛先リストを選択します。上記で新規作成した場合は下図の赤枠でリロードすると、追加した宛先リストが表示されます。
f:id:kikutaro777:20190819231117p:plain

f:id:kikutaro777:20190819231305p:plain

続いてウォッチを開始するタイミングを決めます。ここではすぐに開始するため「From now on」にしました。
f:id:kikutaro777:20190819231227p:plain

以上でSendGridの設定は完了です。続いてSlackの設定を行います。

Slackの設定

次の処理でSlackモジュールを選択します。
f:id:kikutaro777:20190819231408p:plain

メッセージを飛ばすので「Create a Message」を選択しました。
f:id:kikutaro777:20190819231513p:plain

Connectionがない場合は「Add」を押してConnection Nameを入力します。
f:id:kikutaro777:20190819231601p:plain

別ウィンドウでSlackの認証画面が表示されるので内容を確認して「許可する」を押します。
f:id:kikutaro777:20190819231705p:plain

Connectionが設定できたら今度はSlackのChannnelを選び、最後に通知するメッセージ内容を定義します。前段のSendGridトリガーが持っている値を使えるので、ここではEmail addressを利用します。
f:id:kikutaro777:20190819232117p:plain

Textはこんな感じにしました。
f:id:kikutaro777:20190819232243p:plain

以上でSlackの設定は終わりです。

実行

SendGridでウォッチ対象の宛先リストに宛先を登録します。
f:id:kikutaro777:20190819231904p:plain

連携がうまくいくと各モジュールで「1」が表示されます(1件処理したという意味)
f:id:kikutaro777:20190819231926p:plain

Slackを確認すると、メッセージが届いてました。うーむ簡単すぎる。
f:id:kikutaro777:20190819232028p:plain

Integromat+SendGridで作るメール購読フォームのバックエンド

最近ノンコーディングツールとSendGridを連携することにハマっています。以前、ZapierとLogic Appsを試しました。

今回はIFTTTを試そうと思って「IFTTT SendGrid」でググったところ、Integromatというサービスが出てきました。

f:id:kikutaro777:20190816222244p:plain

早速触ってみたところ、ZapierやLogic Appsよりも簡単に同じもの(メール購読フォームのバックエンド)が作れました。Webhookを受ける機能があるので、IFTTTを使わなくても同じことができます。

ということで手順をまとめます。

Webhooksの設定

「Create a new scinario」で新しくシナリオを作成します。
f:id:kikutaro777:20190816223433p:plain

サービスの一覧&検索画面で「Webhook」を検索して選びます。
f:id:kikutaro777:20190816225818p:plain

「Custom Webhook」を選択します。
f:id:kikutaro777:20190816230043p:plain

「Add」ボタンを押して「Webhook name」を入力します。ここでは「SendGridWebForm」と入れて保存しました。
f:id:kikutaro777:20190816230205p:plain

URLが発行されます。
f:id:kikutaro777:20190816230334p:plain

ここでPOSTのリクエストを送ると、それを元に変数化してくれます(後ほど出てきます)。これはZapierやLogic Appsより便利ですね。実際にリクエストを送信してみます。
f:id:kikutaro777:20190816231036p:plain

正常に受信されると成功のメッセージが表示されます。
f:id:kikutaro777:20190816231126p:plain

SendGridの設定

宛先の登録

Webhookの設定を終えたら次はSendGridです。
f:id:kikutaro777:20190816231233p:plain

Search欄で「SendGrid」と入力します。
f:id:kikutaro777:20190816231318p:plain

フィルタされた結果の「SendGrid」を選びます。
f:id:kikutaro777:20190816231350p:plain

SendGridで選べる選択肢が一覧表示されます。まずはPOSTされたメールアドレスを宛先リスト(Contacts)に登録するため「Add or Update a Recipient(Legacy)」を選びます。(Legacyとあるのはつい最近、新しいAPIセットがリリースされたためです。)
f:id:kikutaro777:20190816231424p:plain

Connectionに名前を付けます。ここでは「SendGridConnection」としました。
f:id:kikutaro777:20190817011702p:plain

API KeyはSendGridで発行したものを入力します。最初ちょっとハマったのですが、「Marketing Campaings」の権限だけではなく「API Keys」の権限も必要なのでご注意ください。
f:id:kikutaro777:20190817011835p:plain

Email AddressはWebhooksの設定で変数化された「email」が自動的に出てくるので選びます。
f:id:kikutaro777:20190817012032p:plain

上記キャプチャには「double_optin」という項目がみえていますが、これはSendGridのContactsで私が追加したカスタムフィールドです。この辺りも自動的に表示してくれるのがありがたいです。以上で、Webhookで受け取った宛先を登録する設定が完了しました。

登録した宛先を宛先リストに追加

続いて、登録された宛先を宛先リストに追加します。今回は「Add Recipients to a List(legacy)」を選びます。
f:id:kikutaro777:20190817012500p:plain

Connectionは先ほど作ったものをそのまま利用できます。List IDは宛先リストを作成したときにレスポンスで返ってくるIDです。忘れた場合は宛先リストの一覧を取得するAPIで確認できます。
f:id:kikutaro777:20190817012609p:plain

Recipientsの部分は宛先を登録した際の戻り値にあるRecipient IDを指定します。ここもIntegromatが使いやすい!と思った所なのですが、下図のように戻り値の一覧だけではなく、配列の添え字まで含めて選べるようになっています。細かい!
f:id:kikutaro777:20190817012958p:plain

以上で設定完了です。

実行

それでは早速実行します。「Run once」を押すとWebhooksが待機状態となるので、POSTのリクエストを送ります。
f:id:kikutaro777:20190817013209p:plain

実行結果をリアルタイムに画面で確認できるのがありがたい。
f:id:kikutaro777:20190817013333p:plain

SendGridを確認すると、ちゃんと宛先が宛先リストに登録されていました。
f:id:kikutaro777:20190817013456p:plain

便利!今回のブログは1つ1つ細かい手順を書いたので長く感じられるかもしれませんが、実際にやってみると迷いが少なくサクサク設定できます。

IntegromatはSendGridだけではなく、数多くのサービスと連携できます。Freeプランで十分使えるのも魅力的です。ZapierやLogic Appsより良い番いいと思ったので、実際これで運用してみようと思います。
f:id:kikutaro777:20190816222952p:plain

C#のHttpClientを使ってSendGridのWeb APIを呼び出す

昨日Hello Worldを書いたプログラムを使って、SendGridのWeb APIでメールを送信しました。

SendGridにはC#向けのライブラリがあって.NET Coreにも対応していますが、今回は標準のHttpClientを使いました。

using System;
using System.Net.Http;
using System.Text;

namespace HelloWorld
{
    class Program
    {
        static async System.Threading.Tasks.Task Main(string[] args)
        {
            var client = new HttpClient();

            //APIキーを使った認証
            client.DefaultRequestHeaders.Authorization = 
                new System.Net.Http.Headers.AuthenticationHeaderValue("Bearer","SG.xxx");

            //メール送信リクエスト
            var requestbody = @"{
                ""personalizations"": [
                    {
                    ""to"": [{""email"": ""kikuta+to@example.com""}]
                    }
                ],
                ""from"": {""email"": ""kikuta+from@example.com""},
                ""subject"": ""メールだよ"",
                ""content"": [
                    {
                    ""type"": ""text/plain"",
                    ""value"": ""メール本文だよ""
                    },
                    {
                    ""type"": ""text/html"",
                    ""value"": ""メール本文だよ""
                    }
                ]
            }";

            //SendGrid Web API v3の呼び出し
            var response = await client.PostAsync("https://api.sendgrid.com/v3/mail/send", new StringContent(requestbody, new UTF8Encoding(), "application/json"));
            Console.WriteLine("Mail sent. StatusCode = " + response.StatusCode);
        }
    }
}

AuthorizationヘッダやRaw String(duplicated double quote)の使い方を調べるのに地味に時間がかかってしまった…。

Logic Apps+SendGridで作るメール購読フォームのバックエンド(後編)

前編でLogic Appsの処理フローを紹介しました。

kikutaro777.hatenablog.com

実際に作っていきます。

メール購読フォーム

最初にメール購読フォームの画面を用意します。

f:id:kikutaro777:20190719010713p:plain

HTMLはシンプルです。actionのURLには、この後Logic Appsが発行するHTTPのエンドポイントを設定します。

<form action="https://xxxxx.example.com" method="post">
  <div>
    <label for="email">メールアドレス</label>
    <input name="email" id="email" value="">
  </div>
  <div>
    <button>登録</button>
  </div>
</form>
</body>

f:id:kikutaro777:20190719005635p:plain

Logic Appsでフローを作成する

AzureのLogic Appsを選びます。

f:id:kikutaro777:20190718211234p:plain

フォームからのデータを受け取るエンドポイントを作成していきます。

f:id:kikutaro777:20190719010621p:plain

「HTTP要求の受信時」を選択します。

f:id:kikutaro777:20190718211327p:plain

ペイロードがJSON(Content-Typeがapplication/jsonのもの)の前提になっていて、ここで少しつまづきました。

f:id:kikutaro777:20190718211447p:plain

フォームが送信するデータのContent-Typeはapplication/jsonではなくapplication/x-www-url-formencodedのためです。調べたところ、公式ドキュメントに各種Content-Typeの扱い方が書いてありました。

docs.microsoft.com

このうち「他のコンテンツタイプ」にあるtriggerFormDataValue()を使いました。これでメールアドレスを取得してSendGridに登録します。

f:id:kikutaro777:20190719010812p:plain

次はSendGridのWeb APIを呼び出すために「HTTP」のアクションを選びます。

f:id:kikutaro777:20190719011046p:plain

設定した値は次のとおりです。

方法:POST
URI:https://api.sendgrid.com/v3/contractdb/recipients
ヘッダー:Enterキー「Content-Type 」値の入力「application/json」
本文:

[
  {
    "email": triggerFormDataValue('email')
  }
]

認証:未加工
値:Bearer SG.xxxxxxxxxxxxxx(SendGridのAPIキー)

f:id:kikutaro777:20190719002337p:plain

APIを呼び出した結果の状態コードで処理を分岐します。

f:id:kikutaro777:20190719010845p:plain

ここでは状態コードが201であるかどうかを条件にしました。

f:id:kikutaro777:20190719010412p:plain

続いて宛先データが正常に登録されたか確認します。

f:id:kikutaro777:20190719011729p:plain

登録する宛先が1件の場合でも結果は配列で返ってきます。recipeint_idを取得するためにデータ操作の「JSONの解析」アクションを挟みます。

f:id:kikutaro777:20190719010515p:plain

Web APIでrecipient_idを指定して宛先を取得します。

f:id:kikutaro777:20190719011413p:plain

宛先が正常に作成されていれば、宛先リストに登録する処理は遅延しても大きな問題はないため、この後の処理は並列化しました。

f:id:kikutaro777:20190719195728p:plain

f:id:kikutaro777:20190719195738p:plain

以上です。フロントエンドのHTML以外はノンコーディングでメールアドレスの登録処理が作れました。実際の運用ではダブルオプトインが必要なので、そこはまた検討したいと思います。

にほんブログ村 IT技術ブログへ
にほんブログ村 にほんブログ村 IT技術ブログ Javaへ
にほんブログ村