Challenge Engineer Life !

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

Google Cloud Platform(GCP)のチュートリアルに沿ってPostfixからSendGrid経由でメール送信する

久しぶりにSendGridネタです。そして初GCP。

teratailに以下の質問があがってたので、実際に自分でも試してみました。

teratail.com

Google Cloud Platform(GCP)にあるSendGridチュートリアルに関する質問です。チュートリアルはこちらです。

teratailにも書いたのですが、自分の場合はうまくいきました。試したとき、サインアップからスクリーンショット撮っていたので手順をまとめておこうと思います。ただし、チュートリアルの「インスタンス上で Postfix を使用してメールを送信する」部分のみです。このあとにはJavaやNode.jsを利用したメール送信のチュートリアルもあるので、アプリでメール送信する方などは最初からそちらをやるほうが良いかと思います。

チュートリアルだと冒頭は次のようにボタンで遷移できます。
f:id:kikutaro777:20170421163324p:plain
が、このエントリではメニューから選択する流れとしています。(ボタンで一気に遷移してくれるのはありがたいですが、意外とどのメニューを辿っていくのかわからなかったりするため)

ではアカウント作成から淡々と書いていきます。

無料トライアル

https://cloud.google.com/ にアクセスして「無料トライアル」ボタンを押します。
f:id:kikutaro777:20170421113133p:plain

(Googleアカウントでログインしていない状態だと、ここで一回ログイン画面を挟みます)

必要情報を入力します。
f:id:kikutaro777:20170421133341p:plain

f:id:kikutaro777:20170421133405p:plain

クレジットカード情報は必須のようです。
f:id:kikutaro777:20170421155255p:plain

入力に問題がなければ「ようこそ」画面となります。
f:id:kikutaro777:20170421150957p:plain

プロジェクト作成

「プロジェクトを作成」を押します。
f:id:kikutaro777:20170421155523p:plain

プロジェクト名を入力します。私は「SendGridTrial」と付けました。
f:id:kikutaro777:20170421155608p:plain

次のような画面となりました。
f:id:kikutaro777:20170421155654p:plain

Compute Engine

コンピューティングの「Compute Engine」から「VMインスタンス」を選択します。
f:id:kikutaro777:20170421155816p:plain

はじめてだと少し準備に時間かかるようです。
f:id:kikutaro777:20170421162456p:plain

しばらく待つと、「作成」ボタンが有効になりました。
f:id:kikutaro777:20170421163448p:plain

インスタンスの名前を「sendgrid-tutorial」として、ブートディスクの変更をクリックします。
f:id:kikutaro777:20170421214802p:plain

デフォルトがDebianなので、チュートリアル的にはこのままでもよいのですが、CentOS7にしてみました。
f:id:kikutaro777:20170421164803p:plain

作成が完了すると一覧に表示されます。
f:id:kikutaro777:20170421164856p:plain

Cloud Launcher

Cloud Launcherを選択して、検索欄に「SendGrid」を入力します。
f:id:kikutaro777:20170421170019p:plain

「SendGrid Marketing Campaigns」と「SendGrid Email API」が出てきます。SendGrid Email APIを選択します。
f:id:kikutaro777:20170421170116p:plain

Marketing Campaignsというのは機能名称の1つで、SendGridのUI上でメールデザインなどしてキャンペーンメールが送れるものです。先日、自分がハンズオンとかやってましたw
sendgrid.kke.co.jp

ここで「SendGrid Marketing Campaigns」と「SendGrid Email API」の2つの選択肢が分かれているのが少し気になったので、どちらも選んでみたのですが、最終的には同じアカウントでした(^^;GCPではMarketing Campaigns使えるのですねー、ほー。

「無料プランで開始」を押します。
f:id:kikutaro777:20170421173632p:plain

1.Subscribeのプラン「Free($0.00/月)」であることを確認して「登録」を押します。
f:id:kikutaro777:20170421173800p:plain

2.Activateの「SendGridに登録」を押します。
f:id:kikutaro777:20170421174009p:plain

SendGridで作成するアカウント情報入力欄が表示されます。
f:id:kikutaro777:20170421174154p:plain

ユーザ名やパスワード、メールアドレスを入力して「Continue」を押します。
f:id:kikutaro777:20170421174216p:plain

権限に関するリクエストで「許可」します。
f:id:kikutaro777:20170421174232p:plain

これで完了です。
f:id:kikutaro777:20170421174427p:plain

SendGrid

Cloud Launcherに戻ると「Manage API keys on SendGrid website」という表示がありますので、こちらをクリックします。
f:id:kikutaro777:20170421182142p:plain

API Keyというのは、SendGridを利用してメール送信するときの認証情報です。認証ではログイン同様にID/Passwordを指定することもできるのですが、設定ファイルやコードに埋め込むのはセキュリティ上好ましくないです。なので、こちらのAPI Key利用を推奨します。ちなみにチュートリアルのPostfixではAPI keyを使わずID/Passwordを使っているので、ここの手順は飛ばしても大丈夫です。が、SMTPの認証でもAPI Keyは利用できるので(後ほど記述)、このまま進めるほうがよいです。

SendGridの管理コンソール画面が立ち上がり、下のように「Hi xxxx」というダイアログが出ます。
メアドを確認して「Send Confirmation Email」を送ってください。
f:id:kikutaro777:20170421182406p:plain

「Please confirm your email address」というタイトルの確認メールが飛ぶので、以下ボタンを押します。
(メールが来ない場合は、迷惑メールフォルダをチェック)
f:id:kikutaro777:20170421182502p:plain

「Create API Key」を押します。
f:id:kikutaro777:20170421182739p:plain

API Key nameを入れてパーミッションの種類を選びます。今回はとりあえずFullにしてます。
f:id:kikutaro777:20170421203755p:plain

API Keyが表示されます。ここは1回だけの表示で、もう2度と確認できないので、必ずコピーしてください!
f:id:kikutaro777:20170421203925p:plain

これでAPI Keyの作成は終わりです。

Postfixの設定

さきほど作成したVMインスタンスにsshで接続します。
f:id:kikutaro777:20170421210003p:plain

普通のクラウド系だと自分のマシンからssh叩きますが、GCP、ブラウザからいけるんですね。なにこれすごい。
f:id:kikutaro777:20170421212335p:plain

f:id:kikutaro777:20170421212344p:plain

ここからはチュートリアル通りです。

sudo su -
umask 077

で、CentOSなので

yum install postfix cyrus-sasl-plain cyrus-sasl-md5 -y

f:id:kikutaro777:20170421212354p:plain
と淡々とチュートリアル通りに進めます。

気を付けるところ、というか、自分の知識が足りなくてちょっとハマったところはSASLパスワードマップ生成の部分で

echo [smtp.sendgrid.net]:2525 [YOUR_SMTP_LOGIN]:[YOUR_SMTP_PASSWORD] >> /etc/postfix/sasl_passwd

最初認証情報は

[kikuta]:[123456789]

みたいに書くのかと勘違いしてずっと認証がとおらなかったですw

この場合だと

echo [smtp.sendgrid.net]:2525 kikuta:123456789 >> /etc/postfix/sasl_passwd

と書けばよいだけでした。

ちなみにAPI Keyを利用する場合は

echo [smtp.sendgrid.net]:2525 apikey:SGxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx >> /etc/postfix/sasl_passwd

とすればいけます。

あと、認証間違えてて、次にまたechoコマンドを連続して打ってたのですが、そうするとsasl_passswdのファイル内が

[smtp.sendgrid.net]:2525 [kikuta]:[123456789]
[smtp.sendgrid.net]:2525 kikuta:123456789

みたいになっていて、結局1行目が評価されてダメってなってました。直接いじって

[smtp.sendgrid.net]:2525 kikuta:123456789

とかにして進めば問題なしです。

ちょっと脱線しましたが、再びチュートリアル通りに進めて最後に

echo 'Test passed.' | mail -s Test-Email EMAIL@EXAMPLE.COM

で(最後はもちろん実際の送信先を指定)メール送信。

うまくいけば

tail -n 5 /var/log/maillog

のログは
f:id:kikutaro777:20170421214053p:plain
みたいな感じになります。

メールの受信を確認。
f:id:kikutaro777:20170421213929p:plain

メールをちゃんと届けるためには、Domain Whitelabelの設定などを行ったほうがよいです。

独自ドメイン利用(Whitelabel)および設定時のDNSレコードについて、詳しく教えてください

Postfixは知っておきたいと思ってたので、もうちょっと調べてみないと。

デンバーでSendGrid本社、サンフランシスコでサイボウズさん、Herokuさんに行ってきた!

3/2からSendGridの本社があるデンバーへ(SendGridエバンジェリストの id:nakansuke さんとお仕事で)行ってきました!!

人生初のデンバー。例年は時期的にとても寒いとのことですが、滞在してる間は幸いにも日本とあまり変わらない気温でした。

Denver International Airport
f:id:kikutaro777:20120101000000j:plain

飛行機を降りて空港ロビーまでの間にネイティブアメリカンの写真などが並んでるのが印象的でした。帰りがけは車で空港まで移動だったのですが、運転手の方がネイティブアメリカンの方だったし、コロラド州はそういう方々が多い地なのかな。この辺は歴史をちゃんと調べてみたい。ちなみにその運転手の方「サムライは強い精神(spirit)を持ってて好きだ。」とか「アニメ好き。いつか日本行ってみたい。」とか話してました(^^)

空港からUnion Stationまで電車で移動。
f:id:kikutaro777:20170311010739j:plain

電車快適!

Union Station
f:id:kikutaro777:20170310075054j:plain

市内はFreeに乗れるバス(RTD)もあって便利だし、とにかく雰囲気が良いところでした。治安が全体的に良さそうで、変な話、ホームレスっぽい方々が全然いなかった。ここなら住みたいかも!って思いました。サンフランシスコやニューヨークは良い所だけど住みたいとはあまり思わなかったし、何度かミネアポリスも行って、とても良い所だったけどデンバーの方がいいなーと。実際住むと色々違うのかもしれませんが(^^;

f:id:kikutaro777:20170311085434j:plain

Colorado Convention Center
f:id:kikutaro777:20170311083059j:plain

ここはテック系イベントとかでも使われるらしいですー。くまさーん。

f:id:kikutaro777:20170310213326j:plain

この旗はコロラドの州旗らしいのですが「ポケモンボールにしかみえないんですよね」と言われて、それ以降、自分もポケモンボールにしかみえなくなってしまいました…orz

f:id:kikutaro777:20170311090218j:plain

ホテルはSendGridオフィスがあるビルのすぐ隣、Denver Marriott City Centerホテルでした。超快適。

SendGrid

SendGridのオフィスへ着いたときにツアーしてもらったのですが、とにかくカッコいい!そして、人と席が現在進行形で増えてて、すごい成長してる感じでした。

エレベーターを降りたらいきなりロゴを意識した壁!オシャレ。ここで興奮しすぎてエントランスを撮り忘れてしまいました…(*´Д`)
f:id:kikutaro777:20170310220844j:plain

至る所にロゴを意識したデザインがあって面白かったです。時計~
f:id:kikutaro777:20170311092317j:plain

卓球のラバーまでw
f:id:kikutaro777:20170310220839j:plain

ミーティングルームがメッチャありました。個人の部屋も多かった。各部屋には「Sleepy Cat」とか色んな名前が付いていました。任天堂とかのゲームキャラ名が多かったな(笑
f:id:kikutaro777:20170310220843j:plain

フロアの中にぶち抜きの階段があって移動できます。
f:id:kikutaro777:20170310220845j:plain

The Grid!!
f:id:kikutaro777:20170310220841j:plain

f:id:kikutaro777:20170310220842j:plain

なにこれカッコイイ!
f:id:kikutaro777:20170309233326j:plain

キッチン全体の写真を撮り忘れてしまったのですが、すげー広くて机とイスがメッチャ並びつつ、フリーに食べ物が並んでました。この日はちょうどワッフル焼いてて朝食いただきました。むちゃ美味しかった(^^)
f:id:kikutaro777:20170303092011j:plain

ナッツとかお菓子も充実。ビールやワインもありました(^^)
f:id:kikutaro777:20170310220840j:plain

この日は終日SendGridとの打ち合わせでした。英語はめちゃ速い(^^;;;文脈逃すと全然わからなかったり、マーケティング系の用語やサービスの名称はそもそも日本語で聞いても…みたいなものも多く、日頃の視野の狭さを感じました。絵英語含め、色々勉強しないとなぁ…。

打合せ内容はさすがに書けないですが、日本からissueや要望を色々伝えました。日本のマーケットをしっかりフォーカスしてて、パートナーとして強く意識してくれてるのがありがたかった。自分はここ半年の新参者ですが、id:nakansuke さん、ここまでパイプつないだのすごいなぁと。

あ、そうそう、USのメンバが3月末にSlush Tokyoに参加するため来日します。我々日本スタッフもSlushサポートするので、興味ある方は是非ご参加を!

3/29-30
Slush Tokyo 2017 - Slush Tokyo

前日の夜にはSendGrid Night #7を開催し、ここでもUSメンバに登壇してもらいます(^^)国内のユーザ様事例などの話もあるので、こちらも是非!
sendgrid.doorkeeper.jp

そういえば、打合せの部屋からSendGridバスが偶然みれました!前までBoulderにもオフィスがあって、バスを出してたようです。今はDenverオフィスに集約されたのですが、Boulderに住んでる方も多くバスは継続してるみたいです。
f:id:kikutaro777:20170303161155j:plain

Brandonさんの家

夜はSendGridでDeveloper EvangelistやDirector of Developer Relationsとして活躍されてたBrandonさん(今は他の企業へ)のお家へ招いていただきました(^^)家に招いてもらうとか初めて(^^; id:nakansuke さんと親交が深いのだなぁと。

ちなみにBrandonさんは7月に東京であるDEVRELCONでSpeakerとして来日されます!super early birdは3月末まで超お得です。私は早速申し込みました(^^)

tokyo-2017.devrel.net

ディナーの肉!!!USのお店でもみないサイズにびっくりです!butcher(肉屋)でおろしてもらったらしいw

f:id:kikutaro777:20170311104426j:plain

f:id:kikutaro777:20170311103552j:plain

Cookも本格的で低温調理してから焼くというこだわり!待ってる間、近くのBarに連れて行ってもらいました。
f:id:kikutaro777:20170311104248j:plain:w300

屋上からの景色が最高すぎた(*´Д`)
f:id:kikutaro777:20170311104711j:plain

f:id:kikutaro777:20170311104852j:plain

ステーキは死ぬほど美味しくて、めっちゃ食べたw お店で食べるのよりめちゃくちゃ美味しいぞこれ、って感じで貴重な体験でした!食事は奥様と妹さんも一緒で、楽しい時間でした(^^)Thank you very much!!!
f:id:kikutaro777:20170311105227j:plain

めちゃくちゃお腹いっぱいだったけど、デザートでアイスクリーム食べに連れていってもらいました(笑)寒いのにめちゃくちゃ並んでて、何事!?と思ったら、こちらではすべての味をお試しできるらしく、皆すげー時間かけて試食してるっていうwww

はー楽しかった。

翌日はデンバーに駐在してる会社の先輩にRed RocksやBoulderに連れていっていただき、BREWERYで飲んだりと休日を堪能しました。こっちにいたら長生きしそう(^^;

f:id:kikutaro777:20170311105815j:plain

f:id:kikutaro777:20170311110142j:plain

で、3/5の朝にサンフランシスコへ移動しました。

サイボウズさん at サンフランシスコ

本当はOrange CountyのSendGridオフィスへ行く予定だったのですが、ちょうどGoogle Nextがあるタイミングで、SendGridメンバがサンフランシスコに行くとのこと。最終的にディナーが目的となりました。

で、ディナーまでの時間、いくつかオフィス見学させていただきました。最初はサイボウズさん。USだとkintoneの名前なのですね。

kintone Corporation
www.kintone.com

場所はモスコーニからちょっといった辺りで、すごいオフィス街なところでした。なぜかビルの写真すら撮り忘れてしまってた…(*´Д`)

ぶらり訪問と聞いてたのでPCすらホテルに置いてしまってたのですが、着いたら打合せっぽい感じになって汗汗(^^;;;お話の中でUSにおけるkintoneの事例とかも聞けて「うぉー、熱い!!」って感じでした。すごい勢いでそうだなーと。

私は元々、製造業のお客様へコンフィグレータ(日本では馴染みが薄いですが、海外ではCPQ(Configure-Pricing-Quote)と呼ばれて核となってる仕様選定エンジン)を中心にした販売管理システムの開発をやってました。ほとんどが業務改革プロジェクトなのですが、まぁこういうシステムというのはSI系な方々は経験あると思いますが苦労に耐えないですよね(^^;案件によっては仕様確定が延々と進まなかったり…。

CPQのパートナーだったFPXという会社では、クラウドサービス化してSalesforceなどのCRMとつなぐビジネスをメインとしています。で、日本でもそういう方向に舵を取ろう、ってなって、日本だとSalesforce以外にもkintoneとかいいよね、という話があって、そのとき私も少し触ってました。ああいう実際に触れる環境があって、色々試しながらスモールに導入して業務改善していくのがいいなぁと。

今は部を移ってSendGridなので、kintone x SendGridの方向です。kintone最近は全然触ってなかったので色々やってみよう~!

Herokuさん at サンフランシスコ

サイボウズさんの次にHerokuさんへ!

f:id:kikutaro777:20170310231241j:plain

現地で働かれてる日本人エンジニアの方に社内ツアーしていただきました(^^)

f:id:kikutaro777:20170311121624j:plain

f:id:kikutaro777:20170311121817j:plain

Herokuは趣味開発でもよく使わせていただいているので、生でUSオフィスみれて興奮しました(^^)!お話もサポートあるあるみたいな所から現地のエンジニアや開発に関してなど、色々楽しかったし、刺激になりました。


と、そんなこんなで盛りだくさんな米国出張でした。

ちなみにオフィス訪問の前日はスタンフォード大学にいる弊社社員の方にワイナリーやゴールデンゲートブリッジに連れていっていただき、最後はJavaOne蟹を一緒にいただいてました(^^;

f:id:kikutaro777:20170311120105j:plain

帰ってきてからまだ時差ボケが抜けきっていない感じですが、気持ち新たに色々頑張りたいと思いますー!

SalesforceからSendGridを利用してメール送信する!

この記事は「SendGrid Advent Calendar 2016」の13日目の記事です。
昨日は @azumakuniyuki さんの「SendGridへリレーする方法、MTA3種盛り。」でした。
明日は @nakansukeさん の「Amazon SESとの比較」です。

Salesforce World Tour Tokyo 2016

本日からSalesforce World Tour Tokyo 2016が開催されますね。SendGridチームは明日12/14(水)、開発者向けの「Developer Forest*1に出展します!私もスタッフとして立っていると思うので、もしご興味ある方は是非ご参加ください!

ということで、今日はSalesforceにおけるメール送信について書いてみたいと思います。

なお、私自身、Salesforceを触ったり、連携するシステム開発の経験はありますが、Salesforce系の資格とか、ゴリゴリApex書いたとか、の経験はありません(>_<;今回のエントリは、自分で調べた範囲の知識にて、もし間違いがあった場合などはご指摘いただけると嬉しいです(^^;

Salesforceにおけるメール送信

Salesforceでは、リードや取引先責任者へメールを送ったり、ワークフローの承認でメールを送ったり、様々な用途、タイミングでメールが利用されます。メール送信に関しては、ざっと調べた範囲でも以下の選択肢があると思います。

機能カテゴリ 機能
Salesforce標準*のメール送信機能 リードへの一括メール送信
取引先責任者への一括メール送信
ワークフロー・承認申請のメールアラート
メール to ケース
メール to Salesforce
Apex(メールサービス) Apexプログラムによるメール送信
メールリレー 既存SMTPサーバをリレーサーバとして利用
AppExchange Sendmail(Salesforce Labs)
Autobahn for AppExchange
Synergy!LEAD
外部サービス(Lightning限定) Gmail
Office 365

他にもあるかもしれません。

せっかくなので、表の中のいくつか試してみます。

取引先責任者への一括メール送信

取引先責任者のツールメニューに「取引先責任者の一括メール送信」があります。

f:id:kikutaro777:20161212162253p:plain

宛先にする責任者をビューから選択します。

f:id:kikutaro777:20161212162307p:plain

メールテンプレートはSalesforceで標準にあったものから適当に選びました。

f:id:kikutaro777:20161212162323p:plain

一括メール送信名を入れて、「送信」ボタンを押すだけです。

f:id:kikutaro777:20161212162334p:plain

ちなみにこの一括メール送信名によって、管理メニューの「監視」->「一括メール送信」の一覧を識別できるようです。

f:id:kikutaro777:20161212183308p:plain

f:id:kikutaro777:20161212183336p:plain

送信完了を確認したら

f:id:kikutaro777:20161212162352p:plain

メールが届いているか確認します。おー、来てますね。

f:id:kikutaro777:20161212162454p:plain

さすが標準機能、手軽です。

外部サービス(Gmail)

表の一番下に入れた「外部サービス」はLightningだけで使える機能なんですね。せっかくなので、これもちょっと試してみました。管理メニューの「メール管理」から「外部サービス」メニューを選択します。

f:id:kikutaro777:20161212161442p:plain:w100

GmailとOffice 365が選べるのですが、今回はGmailを選択しました。右のボタンを「ON」に切り替えます。

f:id:kikutaro777:20161212160921p:plain

あとは「Lightning Experienceに切り替え」ます。

f:id:kikutaro777:20161212161206j:plain

ちなみにLightningへの切替は事前に環境を確認して行ってくださいm(_ _)mまぁSalesforce側で設定変更前に色々確認メニューでるので、ここではこの程度にしておきます。

切り替えた後、取引先責任者一覧へ。

f:id:kikutaro777:20161212165442p:plain

Lightningめっちゃ綺麗(/・ω・)/

メールの部分をみると、Gmailの選択肢がでます!

f:id:kikutaro777:20161212165730p:plain

メールエディタが組み込まれます。
f:id:kikutaro777:20161212170204p:plain

試しに送信すると、ちゃんと届きます。
f:id:kikutaro777:20161212170416p:plain

すごい。便利w

これらの機能はSalesforceで標準的に用意されており、統合された機能として使いやすいです。一方で、一部ガバナ制限を受けるケースがあったり、テンプレートを作成する際に、Web上でのエディタのようなものがなく少し手間だったり、という点もあるかと思います。ここはここでAppExchangeでカバーされる製品もあるとは思います。

なお、どういう制限があるのか、などQA的なものは以下が良さそうでした。

Salesforceのメール送信 ポイント集
help.salesforce.com

では次に、ここに挙げた選択肢以外でどのようなものがあるのか?というところで、SendGridを利用した方法を試したいと思います。

SalesforceでSendGridを利用したメール送信

SalesforceでSendGridを利用する方法としては、以下の選択肢があると思っています。

方式 方法 利用可能有無 補足
メールリレー × 一番シンプルな方法と思いますが、こちらにあるようにSalesforce側がID/Passの認証対応が現状できないようです。このスレ、相当みなさん文句言っていて面白い…
Apex sendgrid-apex 実はSendGridからApex用のラッパーライブラリがGitHubで公開されてます。詳細は後程。
SendGrid APIを直接叩く 今回時間がなくて試せなかったのですが、Apexでhttpコールができるのであれば、普通にSendGridのAPIをコールすることも
API連携 一番堅実で、SalesforceのSOAPかRESTのAPIで取引先責任者とかメアド取ってきて、SendGridのAPIで送信という形です。

Salesforceのメールリレーの設定は以下のようになっていています。

f:id:kikutaro777:20161212172412j:plain

SendGridでは、SMTPサーバにログインして直接使うこともできるのですが、当然ながらSMTPサーバのユーザIDとパスワードが必要です。しかし、Salesforceの設定ページでは特にそういう設定部がなく…現状、以下ページに書かれているように対応されていないようです。

success.salesforce.com

3つ目のApexでREST APIをコールする部分は今回調べきれなかったです。JavaでいうHttpClientとかJersey Clientみたいなライブラリがつかえると楽なのでしょうが…この辺Apexはどうなっているんでしょうか。。。

また、4つ目のAPI連携は下図のようなイメージです。

f:id:kikutaro777:20161213151606p:plain

今回のAdventでは細かく触れませんが、SalesforceのAPIをJavaで触ったとき(SOAP APIですが)のエントリは前に書いたので、興味ある方はどうぞm(_ _)m

kikutaro777.hatenablog.com

この方法が一番堅実だと個人的には思います。

Apex with SendGrid

さきほど、Apexで利用可能なライブラリがGitHubにあると書きましたが、以下となります。ただ、最終コミットの日付をみていただくとわかるのですが、数年前で止まったままとなっております。

github.com

以降で書くのは、あくまでも私がサンプル的に試したものであり、公式に利用可能であるということは保証できないのでよろしくお願い致します。実際、SendGridでは既にv3というAPIに移行していますが、このApexラッパーのコードを確認すると、v2のラッパーとなっていたりします。

色々ガードはってしまいましたが、早速、試してみましょう。

Salesforceにログインした状態で、GitHubのInstallationの下に表示されているURLをクリックします。
f:id:kikutaro777:20161212171942j:plain

今回は管理者のみでインストールしました。
f:id:kikutaro777:20161212173316j:plain

アクセスの承認をします。ここの2個目はちょっとよくわからず、とりあえず1個目だけチェックしています。
f:id:kikutaro777:20161212173329j:plain

「インストール完了!」と出ればOKです。
f:id:kikutaro777:20161212173340j:plain

開発者は通常EclipseとかでApex触るのだと思いますが、今回は簡単なサンプルなので「開発者コンソール」で進めます。
f:id:kikutaro777:20161212173504j:plain

Apexクラスを作成します。「SendGridController」クラスにしました。
f:id:kikutaro777:20161212173534j:plain

中身は以下のような感じ。お試しされる方は、ID/パスワード/メアドは本物に置き換えてください。
f:id:kikutaro777:20161212173544j:plain

public class SendGridController {

    public void sendMail() {
        SendGrid sendgrid 
            = new SendGrid('sendgridのログインID', 'sendgridのログインパスワード');
        
        SendGrid.Email email = new SendGrid.Email();
        email.addTo('テストで送る宛先メールアドレス');
        email.setFrom('送信元fromのメールアドレス');
        email.setSubject('SalesforceのApexからテスト送信');
        email.setText('Salesforceからこんにちは');
        
        sendgrid.send(email);
    }

}

続いてページを作成します。「Visualforce Page」を選択します。
f:id:kikutaro777:20161212173655j:plain

「SendGridPage」という名前にしました。
f:id:kikutaro777:20161212173703j:plain

中身は以下のように定義。Java EEなどでJSFに慣れていると楽ですね(^^;

<apex:page controller="SendGridController">
    <apex:form>
        <apex:commandButton id="btnSendMail" 
            action="{!sendMail}" value="SendGridでメール送信" />
    </apex:form>
</apex:page>

ページを開いてみます。URLで「https://x.xx2.visual.force.com/apex/SendGridPage」のようにページ名を直接打ってもいいです(xxの辺りはSandboxごとに異なる)し、設定メニューの「ビルド」->「開発」->「Visualforceページ」を選択して
f:id:kikutaro777:20161213141717p:plain:w100

矢印マークからページを起動することもできます。
f:id:kikutaro777:20161213141728p:plain

こんな感じ。
f:id:kikutaro777:20161212174109p:plain

ボタンを押すと、宛先で指定したメールアドレスに送信されます。簡単ですね。

ただ、実際の業務系では、メアドを直接Apexに埋め込むようなコードは書かないですし、こんな画面のユースケースはないと思います。

そこで、取引先責任者のテーブルを作り、メール送信用ボタンをカラムに配置してみたいと思います。その前に、素のままだと見た目があまりにもダサすぎるので、今回VisualStrapを使いました。BootstrapをVisualforceで簡単に使えるようにしてくれるものです。以下ブログが詳しかったです。

tyoshikawa1106.hatenablog.com

先ほどと同じようにApexのクラス(コントローラ)とVisualforceページを以下のように作成しました。今度は先にビューの定義から

<apex:page controller="SendGridTableController">
    <vs:importvisualstrap />
    <vs:visualstrapblock >
        <vs:pageheader title="SendGridによるメール送信" subtitle="デモ" />
        <apex:form >
            <vs:panel >
                <apex:dataTable value="{!contacts}" var="contact" styleClass="table table-striped table-bordered">
                    <apex:column >
                        <apex:facet name="header">取引先担当責任者名</apex:facet>
                        <apex:outputText >{!contact.name}</apex:outputText>
                    </apex:column>
                    <apex:column >
                        <apex:facet name="header">メールアドレス</apex:facet>
                        <apex:outputText >{!contact.email}</apex:outputText>
                    </apex:column>
                    <apex:column >
                        <apex:commandLink styleClass="btn-sm btn-primary" id="btnSendMail" action="{!sendMail}" value="SendGridでメール送信">
                            <apex:param name="email" value="{!contact.email}"/>
                            <apex:param name="name" value="{!contact.name}"/>
                        </apex:commandLink>
                    </apex:column>
                </apex:dataTable>
            </vs:panel>
        </apex:form>
    </vs:visualstrapblock>
</apex:page>
public class SendGridTableController {
    public List<Contact> listContacts;
    
    public void sendMail() {
        String mailTo = System.currentPageReference().getParameters().get('email');
        String name = System.currentPageReference().getParameters().get('name');
        
        //ホントはここで毎回newしないようにするべき
        SendGrid sendgrid
            = new SendGrid('sendgridのログインID', 'sendgridのログインパスワード');
        
        SendGrid.Email email = new SendGrid.Email();
        email.addTo(mailTo);
        
        email.setFrom('送信元fromのメールアドレス');
        email.setSubject('SalesforceのApexからテスト送信');
        
        List<String> subs = new List<String> {name};
        email.addSubstitution('name', subs);
        
        email.addCategory('Salesforce');
        
        email.setHtml('メールコンテンツ');
        sendgrid.send(email);
    }
    
    public List<Contact> getContacts() {
        if(listContacts == null) {
            listContacts = [SELECT Name, Email FROM Contact];
        }
        return listContacts;
    }
}

上記コードにありますが、差し込み(Substitution)カテゴリなどもちゃんと使えます。

で、画面を開くと以下のように取引先責任者一覧が表示されて、各行にメール送信のボタンが付きます。これで送りたい相手のボタンを押せば送れます。ホントはチェックボックス付けたり、がいいのでしょうけど…。
f:id:kikutaro777:20161212182129p:plain

よく考えたらVisualStrapじゃなくて、Lightningで作ってみればよかったな(^^;このVisualforceページをLightningでみたらどうなるんだろう‥と思って切り替えてみたのですがLightning内から開くとVisualforceページが別ウィンドウで呼ばれるんですね(^^;なるほど。

ちなみに、メールの中身ですが、このApexを利用して、以下のようなレスポンシブメールも送信できました!(上記コード内の「email.setHtml('メールコンテンツ');」の部分を変えて)

PC
f:id:kikutaro777:20161213154615j:plain

モバイル

f:id:kikutaro777:20161213142401p:plain:w250

ホントはこの部分もどのようにやったか書こうと思ったのですが、この辺はまたどこかで別途紹介したいと思います。

ちなみに上のサンプルメールはSendGridのマーケティングキャンペーンに関するものをサンプルとしたのですが、最近リリースされた機能なので是非お試しください。以下関連ブログですー。

sendgrid.kke.co.jp

sendgrid.kke.co.jp

*1:SendGridブースへお越しいただく方は、虎ノ門ヒルズフォーラム5Fなので、プリンスパークタワーへ行かないようご注意ください…

Spring BootのAutoConfigureには実はSendGridが含まれている!

この記事は「SendGrid Advent Calendar 2016」の5日目の記事です。
昨日は @ayakomuro さんの「First time using SendGrid」でした。
明日は公式ブログさんですw

Spring Bootの勢い

私は仕事で長らくJava EEを使ってきたのですが、もちろん、常にSpring Frameworkの存在は気になっていました。特にSpring Bootが出て以降、周囲で良い評判を耳にする機会がさらに増え、浮気心が沸いてます。そういった中、先月「Spring Day 2016」に参加したのですが、人の多さやイベントの盛り上がり方、多くの有名企業が発表するセッションなどを目の当たりにして「うぉー」ってなりました(^^;

そんなわけで、最近、改めてコツコツとSpring Bootを触り始めています。ちなみに私みたいなSpring Boot初心者は、最初に以下の本を読むのが良いです。色々と手を動かしながら学べます。薄いけど内容濃くて、持ち運び便利なのも好きな所です。

ちなみに自分はこちらも買ってコツコツ読んでいる所です(^^;

Spring徹底入門 Spring FrameworkによるJavaアプリケーション開発
株式会社NTTデータ
翔泳社
売り上げランキング: 12,616

Spring Boot with NetBeans

自分はJava EEやってたこともあって、IDEはNetBeans派なのですが、以下のプラグイン

plugins.netbeans.org

を使うと

f:id:kikutaro777:20161204231555j:plain

f:id:kikutaro777:20161204231649j:plain

こんな感じでNetBeansからもSpring Initializrでプロジェクトの雛形作成することができて便利です。普段Java EEでNetBeans触ってる方は是非一度お試しを(^^;

SendGridのAutoConfigure

では本題へ。

Spring BootにはAutoConfigureというものがあってSpringが提供してる機能やその他ライブラリなどを簡単に使えるようになっているとのことです。AutoConfigureについては以下の情報がかなり詳しく、実際アノテーションを追っていきながら読んでみると非常に面白かったです。

qiita.com

上記解説の中にAutoConfigureの一覧がありますが、よくみると…

……

おぉ、今日のAdvent CalendarのテーマであるSendGridが!(わざとらしい

f:id:kikutaro777:20161205173837j:plain

GutHubだとここで確認できます。

f:id:kikutaro777:20161205180733j:plain

それにしても、眺めてみると有名なものがたくさん並んでいますね(^^;

f:id:kikutaro777:20161204224834j:plain

couchbase,flyway,mongoなどのDB関連や、freemarker,mustache,thymeleafなどのテンプレートエンジン、hazelcastやkafka,solrなどなど…これらと一緒に並んでいるのをみて、個人的には胸熱です。

Mandrill(MailChimp)などはないですしw

ということで、Spring Bootから簡単にSendGridを利用したメール送信をすることができます。@Beanなどが不要で、application.propertiesかapplication.ymlにAPI Keyを記述するだけで@AutoWiredにてDIされます。

application.properties

spring.sendgrid.apiKey = #SendGridで取得したAPI Keyを指定

または

application.yml

spring:
    sendgrid:
        apiKey : #SendGridで取得したAPI Keyを指定

依存性にSendGridから提供されているJavaライブラリを追加します。

<dependency>
    <groupId>com.sendgrid</groupId>
    <artifactId>sendgrid-java</artifactId>
    <version>3.1.0</version>
</dependency>

あとは、サンプルと合わせて以下のような感じに。今回はRest APIで「/send」を指定したらメールが飛ぶようなサンプルです。

package com.example;

import com.sendgrid.Content;
import com.sendgrid.Email;
import com.sendgrid.Mail;
import com.sendgrid.Method;
import com.sendgrid.Request;
import com.sendgrid.Response;
import com.sendgrid.SendGrid;
import java.io.IOException;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class SendGridController {
    
    @Autowired
    private SendGrid sendGrid;
    
    @GetMapping("send")
    public Response send() {
        Email from = new Email("test@example.com");
        String subject = "Hello World from the SendGrid Java Library!";
        Email to = new Email("test@example.com");
        Content content = new Content("text/plain", "Hello, Email!");
        Mail mail = new Mail(from, subject, to, content);

        Request request = new Request();
        Response ret = null;
        try {
            request.method = Method.POST;
            request.endpoint = "mail/send";
            request.body = mail.build();
            ret = sendGrid.api(request);
        } catch (IOException ex) {
            //TODO:例外処理
        }
        return ret;
    }
}

mainはテンプレのまま。

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class SpringBootSendGridApplication {

	public static void main(String[] args) {
		SpringApplication.run(SpringBootSendGridApplication.class, args);
	}
}

SendGridのアカウントを取得して、API Keyを発行していることを前提に書きましたが、Keyの発行自体は非常に簡単です。

APIキーの管理 - ドキュメント | SendGrid
APIキー認証でセキュリティを強化しよう | SendGridブログ

Spring Bootを使ったサービス開発で「メールサーバ構築めんどくさいなぁ」とか「気軽にメール送れるサービスないかなぁ」と考えている方は是非一度お試し頂きたいなーと思います(^^)

サービスを動かす環境としてCloud Foundryも手軽です!

SendGrid x Spring BootをPivotal Web Services(Cloud Foundry)で試す - BLOG.IK.AM
Pivotal Web ServicesからのSendGrid利用 | SendGridブログ

Happy Sending!

SendGridからTシャツ贈ってもらった話

わーい、アメリカから贈られてきた(*´▽`*)

f:id:kikutaro777:20160719193455j:plain

SendGrid Web API v3

クラウドメール配信サービスのSendGridから先月、Web API v3がリリースされました。
以下のドキュメントページにもあるように、RESTfulな形で操作できるので、curlなどからでもメール送信できます。データもJSONベース。

API v3 Overview - SendGrid Documentation | SendGrid

これに伴って、言語ごとに開発されていたライブラリもバージョンアップしています。
が、残念ながらbreaking changeとのこと。

また、以下ページにもあるように、現在、日本語というかマルチバイト文字が化けてしまったりするバグがあり、当面v2対応のライブラリが推奨のようです。
support.sendgrid.kke.co.jp

v3がリリースされた後、ライブラリを利用せずにWeb APIをFiddlerとかで叩いていたのですが、自分が送ってた範囲では日本語は文字化けしていませんでした。

ので、ライブラリ側に問題があるのかな?と興味本位にJavaコードをみていきました。

sendgrid-java/java-http-client

SendGridのJavaライブラリは主に以下2つ

ベースにはApache HttpComponents(HttpCore,HttpClientの4系)が使われています。

Apache HttpComponents - Apache HttpComponents

余談ですが、JavaのHttpClient調べてるとめっちゃかずひらさんのページでてくるw

JavaでのHttpClientサンプル - CLOVER
JavaでのHttpClientサンプル その2 - CLOVER

で、SendGridのコードを色々追ってると、文字コードはUTF-8にしてるのですが、POSTするデータには適用してるけど、レスポンスでは適用していない形になってたりと中途半端な感じでした(^^;
これレスポンスもちゃんとUTF-8にすれば文字化けなくなるんじゃ、、と試したら、文字化けがなくなりました。で、せっかくなのでissueを切って、プルリクしてみました。

SendGridへのコントリビュート

SendGridにプルリクするにはCLA/CCLA*1なるものにサインする必要があります。GitHubみてると、プルリク先に送って「マージするからCLA送ってー」みたいなやりとりも多々あるっぽいですが、先に書いとくのが無難かと。

難しいものではなく、以下Contributingの説明ページにあるリンクからPDFを落として、英語で名前や住所・メールなど書くだけです。

github.com

こういうの手書きがいいの…?とか思って自分は手書きしたのをPDF化して送りましたが、今考えると普通にPDFを編集しても問題ない気が(^^;

まだプルリクはマージされてないのですが、「ありがとう!Tシャツ送るからサイズ教えて」みたいになって、贈ってくれました。大した修正したわけではないのだけど(^^;;;

なお、マルチバイトの問題はライブラリ側だけではなく、サーバサイド側でも若干問題があるようですので、やはり暫くはv2を使うのが無難そうです。

Javaのライブラリ、コードみてると、結構気になるところがあります(^^;;というかぶっちゃけ雑な気がw
コツコツ触るか、いっそ自分でライブラリ作りたいなーと。

*1:CLA = Contributor License Agreement、CCLA = Company Contributor Licensing Agreement

SendGrid LabsのThreadsを利用したイベントドリブンな自動メール送信

最近クラウドメールサービスのSendGridで色々と遊んだりしているのですが、色々調べていたら「Threads」なるサービスを見つけました。

threads.io

これはSendGrid Labs(SendGridの中で先端的な取り組みしてるチーム?ですかね?)が提供しているサービスの1つです。

labs.sendgrid.com

トップページで「AUTOMATED BEHAVIOR-DRIVEN EMAIL」とありますが、何かのイベントを契機にSendGrid経由でメール送信するのを簡単にしてくれるサービスです。
2015/8/1現在ではまだベータ版で、無償で使えます。なのでSendGridアカウント持ってる人は色々遊べるのではないかなーと。

f:id:kikutaro777:20150801022107j:plain

イベントは大きく分けて、次の2つの方法によって起こせます

  1. 直接JavaScriptでThreadsを呼ぶ
  2. Segment.comというサービスからThreadsと連携する

両方とも試して簡単にできたので、まず今回は1の方法についてまとめてみます。

設定の流れ

Threadsにユーザ登録して、ログインすると以下のようなDashboardが表示されています。

f:id:kikutaro777:20150801022728j:plain

手順がわかりやすい図になってる形ですね。

  1. イベントの送信(Send events)
  2. SendGridとの接続設定(Connect SendGrid)
  3. 送信元メールの設定(Add Sender)
  4. 送信メールテンプレートの設定(Create Template)
  5. ワークフロー(発火条件)の設定(Create Workflow)

です。

イベントの送信(Send events)

ここでは前述した2つのイベント送信の方法の説明があります。
Segment.comを利用する際にはEvent Keyが必要なのですが、その情報も表示されています(左下)。

f:id:kikutaro777:20150801023941j:plain

で、この右側にある「Live Log」ですが、イベント送信するとここがリアルタイムで更新されていきます。

f:id:kikutaro777:20150801024508j:plain

英語の説明にもあるように、表示されているJavaScriptをコピペするだけでいいです(^^;簡単
今回は自分のローカルに立ってるWebサーバのHTMLに埋め込みました。

<!DOCTYPE html>
<html>
    <head>
        <title>Start Page</title>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    </head>
    
    <body>
        <h1>Threadsで遊んでみる!</h1>
        <script type="text/javascript">
          <!-- Threads画面でCopyしたJSを張り付けるだけ -->
        </script>
    </body>
</html>

表示してみます。

f:id:kikutaro777:20150801024814j:plain

で、Live Logみてみると

f:id:kikutaro777:20150801024831j:plain

出てきた!

クリックすると、もう少し詳細な属性情報が確認できます。

f:id:kikutaro777:20150801024959j:plain

sourceで「threads」となってますが、例えばこれがsegment.com利用すると下図のように「segment」とでます。

f:id:kikutaro777:20150801025257j:plain

これだけでも何か楽しい(^^;

この後の設定は、このLive Logで出るイベントが契機としてSendGrid経由でメール送信できるようにするものです。

SendGridとの接続設定(Connect SendGrid)

SendGridのアカウントがあれば「connect」を押します。(なければ作成が必要です)

f:id:kikutaro777:20150801025522j:plain

SendGrid側への各種操作のパーミッションが求められるので許可します。

f:id:kikutaro777:20150801025736j:plain

これだけ。設定が完了するとDashboardで「Completed」に変わるので、どこまで設定完了してるか、わかりやすいです。

f:id:kikutaro777:20150801025756j:plain

送信元メールの設定(Add Sender)

メールの送信元情報を設定します。From emailは一応Verifyの確認メールがそこに飛ぶので許可する必要があります。

f:id:kikutaro777:20150801030020j:plain

Verifyが完了すると一覧で「Verified」とStatusが変わるので、これで準備OKです。

f:id:kikutaro777:20150801030238j:plain

送信メールテンプレートの設定(Create Template)

続けて送信するメールのテンプレートを設定します。
この辺、SendGridのテンプレートとか引っ張ってくれると楽なんだけどなぁ、と思いつつ、ちょっと見当たらなかった。

f:id:kikutaro777:20150801030539j:plain

Senderの所はプルダウン式に、先ほど登録したSender情報がでてくるので選ぶだけです。
テンプレートはHTMLとPlain-text、それぞれで書けます。

あとは保存するだけ。

  1. ワークフロー(発火条件)の設定(Create Workflow)

最後に、イベントをベースにどういう条件で発火させるのか、をワークフローで設定します。

f:id:kikutaro777:20150801031401j:plain

とりあえず試したのは、該当URLのWebページが開かれたら、ある特定のメールアドレスにメールを飛ばすというものです。
Conditionで「Page View」を選んで、Single Actionで「Send email」を選択してます。

ちなみにConditionとSingle Actionの他メニューとしては次のようなものがあります。

f:id:kikutaro777:20150801031625j:plain

f:id:kikutaro777:20150801031901j:plain

User Trait辺りはまだよくわかってないです(´・ω・`)

特定のメールアドレスはSpecific emailを選ぶと、メアドが打てます。

f:id:kikutaro777:20150801032041j:plain

これで全て「Completed」になり準備万端です。

f:id:kikutaro777:20150801032314j:plain

Identifyの追加

で、再び最初のLive Logで確認しながらイベントを起こしたのですが、メールが送信されない orz

な、なぜ、と調べたらIdentifyをつけないといけないとのことです。support.threads.io

最初にコピペしたJavaScriptにidentifyの呼び出しを追加

threads.load("igVCDv"),threads.page()}}(window,document);
threads.identify('userId', { email: 'userId@xxxx.co.jp' });

Live LogみるとIdentifyも識別されて、無事メールが飛びました!
f:id:kikutaro777:20150801032900j:plain

受信したメール

f:id:kikutaro777:20150801033013j:plain

ちゃんとトリガーかかるとWorkflowsのStatsで「X times triggered」のところに回数がでるので、発火したかどうか確認できます。

f:id:kikutaro777:20150801033151j:plain

細かく書いたので、長く感じますが、既にアカウントとか持ってたりすれば5~10分くらいでできちゃうかと。

時間取れれば次にSegment.comから使ったほうも書きたい。そちらだとJavaからも遊べるんかな。

SendGrid Web API V3をUnirest for Javaでコールする -認証-

SendGrid Web API V3では認証方法が増えて、ベーシック認証やAPIキーを利用することができるみたいです。

API v3 Overview - SendGrid Documentation | SendGrid

f:id:kikutaro777:20150720193244j:plain

先日使ってみたHTTPクライアントライブラリのUnirest for Javaは、元々このAPI叩くために触ってました(^^;
全然利用例を書いていないのにはてブのったりして焦りました…。kikutaro777.hatenablog.com

Basic認証

SendGridで登録したユーザとパスワードをコロンでつなげてBase64で変換します。
例えば、ユーザが「Aladdin」でパスワードが「open sesame」の場合は「Aladdin:open sesame」をBase64で変換します。

今回は次のWebサイト使って変換しました。

www.base64encode.org
f:id:kikutaro777:20150720231241j:plain

ちなみにAladdinとopen sesameはUSのWikipediaのBasic認証の解説ページからでした(^^;
Basic access authentication - Wikipedia, the free encyclopedia

ここまで準備できたら、あとは次のように呼び出すだけ。

HttpResponse<JsonNode> ret = Unirest.get("https://api.sendgrid.com/v3/templates")
                .header("Authorization", "Basic QWxhZGRpbjpvcGVuIHNlc2FtZQ==")
                .asJson();
System.out.println(ret.getBody());

SendGridではメールのひな形(テンプレート)を作れるのですが、それを取得するものです。
結果はJSONで次のような情報が返ってきます。

{
    "templates": [
        {
            "id": "8832dabe-3515-47ac-a06d-f8852970556a", 
            "name": "kikutaro_template", 
            "versions": [
                {
                    "active": 1, 
                    "id": "37268f35-0ed2-4c55-bf1a-593a677b7f43", 
                    "name": "kikutaro_template Version 1", 
                    "subject": "<%subject%>", 
                    "template_id": "8832dabe-3515-47ac-a06d-f8852970556a", 
                    "updated_at": "2015-07-18 10:23:53"
                }
            ]
        }
    ]
}

今回はテンプレートを全て取得するものでしたが、基本的にREST形式となっていて

  • 全てのテンプレートを取得
  • テンプレートIDを指定して一本引き
  • テンプレートの作成(POST)
  • テンプレートの編集(PATCH)
  • テンプレートの削除(DELETE)

などの操作がAPIからできます。この辺はまた別途使っていきたい。

なお、UnirestではBASIC認証に対応していて、次のように書くこともできます。

HttpResponse<JsonNode> ret = Unirest.get("https://api.sendgrid.com/v3/templates")
                .basicAuth("Aladdin", "open sesame")
                .asJson();
System.out.println(ret.getBody());

APIキーによる認証

APIキーについてはKKEのブログに日本語で詳しく解説されてますので、ここでは解説を飛ばします。

APIキー認証でセキュリティを強化しよう | ブログ | SendGrid

次のように書けます。

HttpResponse<JsonNode> ret = Unirest.get("https://api.sendgrid.com/v3/templates")
                .header("Authorization", "Bearer SG.xxxxxxxxxxxxxxx.yyyyyyyyyyyyyyyyyyyyyyy")
                .asJson();
System.out.println(ret.getBody());

認証ができてしまえば、色々API叩けるので遊べそうです。

SendGrid-Javaライブラリを使ってみた

2年前くらいにSendGridでJava使ってメールを送るサンプル作った時、JavaMailを使うかsendgrid4jを使っていました↓

kikutaro777.hatenablog.com

久々にSendGrid触ってみようと思ったら、ログイン後のダッシュボードとかカッコいい感じに変わってて焦ったり(^^;
この辺は既にまとめられていました。ありがたや。

blog.shibayan.jp

で、いつの間にかSendGrid公式で「sendgrid-java」なるライブラリがでていました。
MavenのCentralみると今年の5月くらいなのかなぁ。

github.com

MavenやGradleで依存性定義すればOKなので、1分くらいでサンプル作れます。

以下はNetBeans&Mavenを使った流れですが、こんな感じ。

Mavenプロジェクト作成

NetBeansの「ファイル」→「新規プロジェクト」から「Maven」の「Javaアプリケーション」を選択
f:id:kikutaro777:20150713233731j:plain

プロジェクト名などを入力して「終了」
f:id:kikutaro777:20150713233642j:plain

pom.xml

依存性としてpom.xmlに以下を追加します。

<dependencies>
    <dependency>
        <groupId>com.sendgrid</groupId>
        <artifactId>sendgrid-java</artifactId>
        <version>2.2.2</version>
    </dependency>
</dependencies>

ビルドしてjarが依存性に入ればOK

コード

とりあえずGitHubにあるサンプルコードをコピペレベルで書いてみます。

package jp.co.kke.sendgridsample;

import com.sendgrid.SendGrid;
import com.sendgrid.SendGridException;

/**
 * sendgrid-javaを利用したメール送信サンプル
 * @author kikuta
 */
public class Main {

    public static void main(String[] args) {
        SendGrid sendgrid = new SendGrid("ここにアカウント", "ここにパスワード");

        SendGrid.Email email = new SendGrid.Email();
        email.addTo("宛先のメールアドレス");
        email.setFrom("送信元のメールアドレス");
        email.setSubject("こんにちは");
        email.setText("このメールはキクタローがSendGridから送ったよ。");

        try {
          SendGrid.Response response = sendgrid.send(email);
          System.out.println(response.getMessage());
        }
        catch (SendGridException e) {
          System.err.println(e);
        }
    }
    
}

実行

ビルドして実行すると、ResponseがJSONで返ってきています。成功すればmessageとしてsuccessが返ります。下図のような感じ。

f:id:kikutaro777:20150713234120j:plain

メール確認

あっさりと届いてる!

f:id:kikutaro777:20150713234319j:plain

このsendgrid-javaライブラリ、色々できそうなので、試していこう~

SendGrid Parse WebhookでPOSTしたメール内容をvoicetext4jで音声読み上げしてみた

こんなもの作って遊んでみました↓


SendGrid Parse Webhook with voicetext4j - YouTube

受信したメール内容を音声で読み上げるだけなんですが(^^;

先日のJJUGで@makingさんがLTで紹介されたVoiceText Web APIと、それを簡単にJavaで使えるvoicetext4jライブラリが印象的で、色々遊べそうだよなぁと。

で、SendGridが提供しているParse Webhook使ったら面白そうかなぁと。

単純にPOSTされたメール内容をvoicetext4jで読み上げるだけなのですが(^^;

ちなみにSendGridのParse Webhookについては以下に詳細がのってます。

Parse Webhookテクニカルガイド【入門】 | ブログ | SendGrid

POST先のサーバどうしよう…と思ったら、上記の記事で自分のローカルにトンネルする方法まで書いてあった(^^;;
ということで、ngrok使ってみました。

ngrok - secure introspectable tunnels to localhost

サーバはJava EE使うまでもない…ということで、Spark使いました(^^;

Sparkは前にちょっとだけ試してました。

Java 8でSpark 2.0.0が楽しそう - Challenge Java EE !

コードはかなりテキトー(^^; StreamAPI使って綺麗に書きたかったけど、リファクタは後で…。

package jp.co.sample.voicereadingfrommail;
import am.ik.voicetext4j.EmotionalSpeaker;
import java.io.IOException;
import java.util.logging.Level;
import java.util.logging.Logger;
import org.apache.commons.fileupload.FileItemIterator;
import org.apache.commons.fileupload.FileItemStream;
import org.apache.commons.fileupload.FileUploadException;
import org.apache.commons.fileupload.servlet.ServletFileUpload;
import org.apache.commons.fileupload.util.Streams;
import static spark.Spark.*;

/**
 * SendGrid Parse Webhookでpostしてメール内容を音声読み上げする.
 * 
 * @author kikuta
 */
public class App {
    public static void main(String[] args) {
        //voicetext用のキー(登録するとメールで送られてきます)
        System.setProperty("voicetext.apikey", "****************");
        
        //ポート
        setPort(8080);
        
        //SendGridからPOSTデータを受信
        post("/", "plain/text", (req, res) -> {
            ServletFileUpload parse = new ServletFileUpload();
            FileItemIterator itm;
            try {
                itm = parse.getItemIterator(req.raw());
                while(itm.hasNext()){
                    FileItemStream stream = itm.next();
                    if(stream.isFormField()){
                        String str = Streams.asString(stream.openStream(), "iso-2022-jp");
                        if(stream.getFieldName().equals(("text"))){
                            EmotionalSpeaker.HARUKA.ready()
                                .pitch(100)
                                .speed(100)
                                .happy()
                                .speak(str);
                        }
                    }
                }
            } catch (FileUploadException | IOException ex) {
                Logger.getLogger(App.class.getName()).log(Level.SEVERE, null, ex);
            }
            return req.body();
        });
    } 
}

SendGridのブログではPOSTされるデータがJSONぽく書いてありますが、実際にはファイルアップロードなどでformをPOSTするときのmultipart/form-dataの形式でデータが来ました。
なのでサンプルではApache Commons Uploadを使ってます(^^;

JavaFX勉強会で堀北真希さんのLTをしてしまいました… #javafx_ja

今日はGlassFish勉強会とJavaFX勉強会が同日に平行開催されました。

GlassFish勉強会に登録していたのですが、後半で抜け出してJavaFX勉強会でLTをさせて頂きました(^^;

LTきっかけ

さくらばさんからJavaFX勉強会でお話しませんか、とお声かけ頂きました(>_<)

こんな光栄な機会を断るわけにいかない!ということで、技術的な内容が全くないLTでしたが、JavaFXに興味があるけど実際に触ったことがない方をターゲットに(ってJavaFX勉強会には、そんな人いないんじゃないかと思いつつ…汗)した発表をさせて頂きました。


発表資料

発表資料はアップしました。

堀北真希さんのことばかりで本当に恐縮です…

デモ動画

上記資料にもリンクで貼ってますが、ここでも載せておきます。
アプリケーションを作成したときのブログも入れときますが、作った時点からは色々といじって非同期にしたりとかしてますが、その辺りはどこかで機会あればまとめます(^^;

MakiMakiImageViewer

上記動画の後半はStageStyleでTRANSPARENTを指定したもので、アプリ上段の枠が消えただけなのですが、なんかビューアっぽい感じになってるかと(^^)これも作った後、さくらばさんからアドバイスもらったものです。

作ったときのブログ
堀北真希さん誕生日を祝ってJavaFXで画像ビューアを作ってみる
StageStyleを指定してみる

ここから始めるJavaFX!

自分はJJUGで今年の8月に行われたJavaFXハンズオンの資料を参考にして、初めてJavaFXを触りました。

このハンズオンで、SceneBuilderやプログラム作成の基本的な流れはわかるので、あとは自分で作りたいものを作ればいいのかなと。

JavaFXハンズオンにお家でChallenge!

感想

堀北真希エバンジェリストになりたい…(*´Д`)

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