Challenge Engineer Life !

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

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

メール購読フォームを作るとき、皆さんはデータベースに何を使っていますか?個人開発でなるべくお金をかけたくない場合、選択肢が少ないのではないかと思います。(HerokuのPostgresやmLabの無料枠など)

私が現在作っているものではSendGridのマーケティングキャンペーン機能(以降MCと省略)を使うことにしました。MCでは宛先を2,000件まで無料で登録できるので、データベース代わりに使えます。

MCと連携する部分はMicrosoft AzureのLogic Appsを使います。メール購読フォームからMCに登録するまでのフローは次のイメージです。

f:id:kikutaro777:20190718000949p:plain

前編ではSendGridにメールアドレスを登録するまでの流れを紹介します。

SendGridに宛先を登録する流れ

宛先の登録はMCのWeb APIを利用します。MCは画面操作が中心の機能で、Web APIは使いづらい部分もあるので利用の際はご注意ください。

宛先リストの作成

最初に、宛先をまとめる「宛先リスト」を作ります。

Contact APIのListsを使います。

f:id:kikutaro777:20190717232805p:plain

宛先リストを作成するとlist_idが返ってくるので、本来ならば、このlist_idを使ってメールアドレスを登録したいところなのですが、残念ながらメールアドレスを直接指定することができません。

f:id:kikutaro777:20190717233225p:plain

先に宛先を作成して、recpient_idを取得する必要があります。

宛先の作成

Contact APIのRecipientsを使います。

f:id:kikutaro777:20190717233332p:plain

宛先を作成するとrecpient_idが返ってくるので、最初のlist_idと一緒に使って、宛先リストに宛先を登録します。

宛先リストに宛先を登録

再びContact APIのListsを使います。

f:id:kikutaro777:20190717233442p:plain

この流れをLogic Appsで作っていきます。

Logic Appsで作成するフロー

冒頭で紹介しましたが、次のフローとなります。

f:id:kikutaro777:20190719195728p:plain

当初Microsoft Flowで作ろうとしたのですが、以前は使えていたHTTPのトリガーがPremiumアカウントのみに変わっていました。HTTPを選ぶとダイアログがでてきます。

そのため、AzureのLogic Appsを使うことにしました。Microsoft Flow、Logic Apps、Azure Functionsは使い分けが難しいのですが、公式ドキュメントで整理されていました。(細かくはまだ把握できていない…)

docs.microsoft.com

f:id:kikutaro777:20190717234311p:plain

Logic Appsの使い方はMicrosoft Flowとほぼ同じで、処理を作ってつなげていくだけです。

とりあえず前編はここまで。後編はLogic Appsで具体的にフローを作っていきます。

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

メール購読フォームを手軽に作る方法を模索しています。今回はZapierとSendGridを使ってみました。データベースも使わず、SendGridのContactsに直接登録してみました。

POST先のURLを作成

Zapierで作ります。

「Webhooks」を選択します。

f:id:kikutaro777:20190717211951p:plain

「Catch Hook」を選んで「Save + Continue」を押します。

f:id:kikutaro777:20190717212209p:plain

URLが発行されたらHTTPリクエストの送信を試します。

f:id:kikutaro777:20190717212219p:plain

今回はcurlで以下のようなリクエストを実行しました。

curl -X POST https://hooks.zapier.com/hooks/catch/xxx/yyy/ -d '{"email" : "hoge@example.com"}

successの応答後「Ok,I did this」を押すとZapierが受信したリクエストがみれます。

f:id:kikutaro777:20190717212409p:plain

続いて以下のリンクをクリックしてActionを作成します。

f:id:kikutaro777:20190717212436p:plain

SendGridのContactに登録

受信したメールアドレスをSendGridのWeb APIでContactに登録します。

「Webhooks」を選びます。

f:id:kikutaro777:20190717212503p:plain

「POST」を選んで「Save + Continue」

f:id:kikutaro777:20190717212516p:plain

POSTで送る内容を登録します。

f:id:kikutaro777:20190717212715p:plain

以下の内容を入力します。

URL:https://api.sendgrid.com/v3/contactdb/recipients
Payload Type:JSON
Data:
 Key:email
 Value:下図を参照
Wrap Request In Array:yes
Headers:
 Key:Authorization
 Value:Bearer SG.xxx(SendGridのAPIキー)

DataのValueはTriggerのテストで受けたEmailを選択します。

f:id:kikutaro777:20190717212613p:plain

Send Test To Webhooks by Zapierを押してテストします。

f:id:kikutaro777:20190717212747p:plain

以下の成功メッセージが表示されたら成功です。

f:id:kikutaro777:20190717212846p:plain

Zapの名前を付けて登録します。

f:id:kikutaro777:20190717212852p:plain

実行

再度curlでリクエストを実行します。

curl -X POST https://hooks.zapier.com/hooks/catch/xxx/yyy/ -d '{"email" : "hoge@example.com"}

Actionが実行されてSendGridのContactsに登録されれば成功です。

f:id:kikutaro777:20190717212930p:plain

あとは画面のフォームを用意するだけです。本来はダブルオプトインにするべきなので、もう一工夫必要そうです。

Java標準のHTTP ClientからSendGridを使ってメール送信する

2年ほど前に会社ブログでこんな記事を書きました。

JShellからSendGridでメール送信する | SendGridブログ

このときはSendGridのJavaライブラリを利用していたのですが、「あれ?そういえばJava 11で標準のHttp Clientが入ったって聞いた気がする」と思って試してみました。参考にした情報はこちらです。

OpenJDK 12.0.1のJShellで試しました。

jshell> import java.net.http.*
jshell> import java.net.http.HttpRequest.*
jshell> import java.net.http.HttpResponse.*
jshell> var client = HttpClient.newBuilder().build()
jshell> var req = HttpRequest.newBuilder().uri(URI.create("https://api.sendgrid.com/v3/mail/send")).header("Content-Type","application/json").header("Authorization", "Bearer SG.xxxxxxxxxxxxxxxxxxxxxxxxxxxx").POST(BodyPublishers.ofString("{\"personalizations\":[{\"to\":[{\"email\":\"to@example.com\"}]}],\"from\":{\"email\":\"from@example.com\"},\"subject\":\"hello\",\"content\":[{\"type\":\"text/plain\",\"value\":\"content\"}]}")).build()
jshell> client.send(req, BodyHandlers.ofString())

※APIキーとメアドはマスクしています。

JSONの部分はBodyPublishers.ofFileなどでJSONファイルから読み込むのが楽そうですが、とりあえず文字列で指定しました。Raw Stringの記法が入ったらもうちょっとシンプルになりそう。JDK 13待ちかな?

今までJavaでHTTPリクエストを投げるときはApache HttpClientUnirest for Javaを使ってきたので、JShellだとライブラリ読み込みなどが手間だったのですが、標準を使えばシンプルに実行できます。

SendGridのJavaライブラリはApacheのHttpClientに依存しているのだよなぁ。標準で書いてみようかな…。

MailSlurpを利用したメールのEnd-To-Endテスト

システム開発する上でメールの送受信テストは何かと面倒です。できればユニットテストに組み込んで人手のテストは避けたい所だと思います。

JavaでJUnitを使ってテストする場合、SubEtha SMTPのようなライブラリを使うと割と簡単にテストできます。この辺はWEB+DB PRESS Vol.102のJavaの新定石で特集されているので、詳しく知りたい方は手に取ってみてください。
gihyo.jp

プログラミング言語に縛られない良い方法はないのかなと思っていたところ、先日SparkPostのブログでMailSlurpというサービスが紹介されていました。

www.sparkpost.com

f:id:kikutaro777:20180218234316p:plain

End-to-endのメールテストを簡単にするサービスで、Web APIを使ってテスト用のinbox作成と受信確認ができます。

実際に試してみたら非常に簡単だったので紹介します。

アカウント作成後、API Keyを取得します。

f:id:kikutaro777:20180218230936p:plain

Web APIでinboxを作成します。

curl -X POST https://api.mailslurp.com/inboxes?apiKey=test

成功するとidと宛先のメールアドレスが返ってきます。

{
  "payload":{
    "id":"xxxxxx-xxxx-xxxx-xxxx-xxxx",
    "address":""xxxxxx-xxxx-xxxx-xxxx-xxxx@example.com"
  },
  "message":""
}

上記メアドにメールを送信後した後、idをURLのパスに含めてGETするとinboxで受信したメールを取得できます。

curl https://api.mailslurp.com/inboxes/xxxxxx-xxxx-xxxx-xxxx-xxxx?apiKey=test

レスポンスで返ってくるpayloadはinbox作成時と違って配列形式なので注意してください(気付かずJavaでJSON->Object変換にしばらくハマってました)

{
  "payload": [
    {
      "body": "xxxxx",
      "from": "xxx",
      "id": "xxxxxx-xxxx-xxxx-xxxx-xxxx",
      "received": "2018-02-18T14:11:02.688Z",
      "returnPath": "xxx@examle.com",
      "subject": "Hello",
      "to": [
        "string"
      ]
    }
  ],
    "message": ""
}

このようにWeb API経由でinboxを作成&受信確認できるので、言語に関わらず簡単に使えます。また、テスト用の宛先が発行されるので誤送信も防げます。

次のコードはJavaでテストした例です。メール送信はSendGrid&JavaMailを使っています。

inbox作成にwaitが必要で、この時間をどのくらいに定めるか微妙なところですが、非常にお手軽です。実際に動くソースは以下に置きました。

github.com

Send With Confidence Tourが東京に!

先日、米国のニューヨーク証券取引所でIPOして盛り上がってるSendGridですが

今年、Send With Confidence Tourというイベントでロンドンアムステルダムニューヨークサンタモニカサンフランシスコと世界を回ってました。

sendgrid.com

コンテンツとしては

  • Email trends and benchmarks
  • Common email marketing mistakes and how to avoid them
  • Deliverability need-to-knows
  • SendGrid’s vision of the future of email

といった辺りで、メール界隈のトレンドやメールマーケティングでよくやる間違い、到達率を上げるノウハウや将来のメールに対するSendGridのビジョンなど幅広いものでした。

で、そのイベントを来月12/13に東京(TECH PLAY SHIBUYA、旧dots.)で開催することになりました!米国メンバーが来日してのセッションと弊社セッション、そして日本のお客様によるユーザ事例セッションもあります!SendGridを既に利用されてる方から、まだ使ってないけどメールマーケティングに興味がある、という方まで幅広くご参加いただければと思います。もちろんAPIとかテクニカル面に興味ある方も大歓迎です。是非ご参加くださいー!
techplay.jp

弊社による紹介ブログはこちらです。
sendgrid.kke.co.jp

今日は完全に宣伝ブログでした(^^;;;

どこでもKotlin #3でKotlin x SendGridのLTしました~ #m3kt

前回初参加した「どこでもKotlin #2」が楽しかったので#3も参加させていただきました!しかもLT発表枠で参加!

m3-engineer.connpass.com

#2の様子は主催のM3さんが書かれてるTech Blogレポートをどうぞ。

www.m3tech.blog

LT申し込みの動機

少し前にちょうどSendGridをKotlinから使うネタを会社ブログで書きまして

sendgrid.kke.co.jp

せっかくなので話をしたいなーと。Kotlin盛り上がってますし、サーバサイドKotlinだとAPIによるメール送信の需要もあるかなーと。

LTスライドはこちらです。

一番ウケたのが自己紹介の堀北真希さんファンクラブ(元)会員番号11という部分でした(^^;;;後半で笑いどころを設けるべきだった…とちょっと反省。

メール送信ってわりと地味なのでLT発表は中々難しい(^^;もっと技術面でインパクト出したいところですが、今回は真面目にKotlinからの使い方について話しました。

Kotlin Webアプリケーション

前回の「どこでもKotlin #2」はアンケート回答による(だったかな確か…)書籍プレゼントの抽選がありました。

Kotlin Webアプリケーションこと、通称「黒ベコ本」!

で、こちらの抽選になんと!当たってしまいました(>_<)!ちょうど自分で買おうとしてた所だったのでメッチャ嬉しい!

f:id:kikutaro777:20171023233019j:plain

著者のたろーさんにサインいただきました!わーい!

f:id:kikutaro777:20171023233041j:plain

他の方のLT

LT、どれも面白くて、幅も広かったです。

最初のLTネタだったDeeplearning4jは今回LTを聞いて初めて知りました。

deeplearning4j.org

Skymind社さんが提供してるとのことですが、なんと!イベントにSkymind社CTOの方がいらっしゃってました。
オライリーから出した書籍プレゼントのじゃんけん大会が急遽開かれましたw

skymind.ai

私の前に発表された方は自己紹介をKotlinで書かれててシビれた!!Speaker.ktってw

Android Things知らなったです。あとGCPのCloud Functionsがあることも知らなかったなぁ。。。

あとQuery DSLの話もあって、まさかKotlin勉強会で聞くとは!

サイバーエージェントさんのJavaからKotlin導入話も面白かったです。Scala、Go、Kotlinの選択肢から実際に勉強会で皆で簡単なWebシステム作って比較ってのいいですね。以下表は後付けらしいですがw

以下のブログとも関連あり。

developers.cyberagent.co.jp

LTで最後に「導入がゴールではない」とおっしゃられてて刺さりました。

次回もLT大会らしいので楽しみです(^^)

Simple Java Mailの主な機能について

昨日書いたSimple Java Mailライブラリの続きです。

kikutaro777.hatenablog.com
f:id:kikutaro777:20170829233253p:plain

昨日のサンプルではビルダーパターンを使いました。

Email email = new EmailBuilder()
    .from("kikutaro_from", "kikutaro_from@example.com")
    .to("kikutaro_to", "kikutaro_to@example.com")
    .subject("サブジェクトだよ")
    .text("マルチパートのテキストだよ")
    .textHTML("<b>マルチパートのHTMLだよ</b>")
    .build();
new Mailer("smtp.sendgrid.net", 587, "****id****", "****pass****").sendMail(email);

もちろん普通に書くこともできます。

Email email = new Email();
email.setFromAddress("kikutaro_from", "kikutaro_from@example.com");
email.addToRecipients("kikutaro_to", "kikutaro_to@example.com");
email.setSubject("サブジェクトだよ");
email.setText("マルチパートのテキストだよ");
email.setTextHTML("<b>マルチパートのHTMLだよ</b>");
new Mailer("smtp.sendgrid.net", 587, "****id****", "****pass****").sendMail(email);

その他、色々紹介していきます。

Recipient

上記のコード例では、宛先を表示名とメールアドレスで表現していますが、これをまとめてRecipientクラスで定義することが可能です。
RecipientTypeは(当たり前ですが)TOとCCとBCCの3つです。

Recipient maiyan = new Recipient("白石麻衣", "kikutaro526@yahoo.co.jp", Message.RecipientType.TO);
Recipient nachan = new Recipient("西野七瀬", "kikutaro526@yahoo.co.jp", Message.RecipientType.CC);
Recipient waka = new Recipient("若月佑美", "kikutaro526@yahoo.co.jp", Message.RecipientType.BCC);

引数は可変長のものがあるので、Recipientを一気に渡せます。

Email email = new Email();
email.addRecipients(maiyan,nachan,waka);

宛先をまとめて指定

宛先のメールアドレスをカンマ区切り並べた文字列をそのまま渡せます。
ccやbccでも同じように指定可能です。

String recipientNogizaka = "shiraishi_mai@example.com,nishino_nanase@example.com,wakatsuki_yumi@example.com";
Email email = new EmailBuilder()
                .from("kikutaro", "kikutaro@example.com")
                .to(recipientNogizaka)
//以下略

Message-IDの指定

メールヘッダに含まれるMessage-IDを簡単に指定できます。
Message-IDの詳細(RFC 2822)はこちら→RFC 2822(対訳)インターネットメッセージの形式 - RFCの部屋
通常ユニークな値であるべきものなので、以下の例は良くないものですが、idメソッドで指定できます。

Email email = new EmailBuilder()
        .id("thisismyownmessageid")
        .from("kikutaro_from", "kikutaro_from@example.com")
        //以下略

実際に送ったメールで確認してみました。まずはMessage-IDを指定しなかった場合は次のとおり。
f:id:kikutaro777:20170829233023p:plain

そして次にMessage-IDを上記コード例のように指定した場合です。
f:id:kikutaro777:20170829232909p:plain
ちゃんと変わってます。

非同期送信

通常のメール送信は同期なのでSMTPの応答を待ちますが、非同期に送信するもできます。
送信するメールの数が多いとき、これは結構便利そうですね。エラーのハンドリングはどうやるのか、気になる所ですが。

Mailer mailer = new Mailer("smtp.sendgrid.net", 587, "xxxxidxxxx", "xxxxpassxxxx");
mailer.sendMail(email, true); //第二引数でasyncをtrueに設定

スレッドプール

スレッドプールの値はデフォルトが10とのことですが、変更できます。

Mailer mailer = new Mailer("smtp.sendgrid.net", 587, "xxxxidxxxx", "xxxxpassxxxx");
mailer.setThreadPoolSize(3);
mailer.sendMail(email, true);

ログだけ残して送信しないモード

デバッグログだけ出して実際のメール送信はしない、みたいなことができます。
誤送信しないようにしたり、テストコードとかで使えるのかな。

Mailer mailer = new Mailer("smtp.sendgrid.net", 587, "xxxxidxxxx", "xxxxpassxxxx");
mailer.setDebug(true);
mailer.setTransportModeLoggingOnly(true);

ログについては、Simple Java MailではSLF4jを利用しているのでlog4j2やlogbackなどが利用できるようです。

Spring対応

Springから簡単に利用できるようになっています。
以下はSpring Bootで書いた例ですが@Importを指定するだけです。

@Component
@Import(SimpleJavaMailSpringSupport.class)
public class MyMailService {
    @Autowired
    private Mailer mailer;

    public void sendmail() {
        Email email = new EmailBuilder()
            .from("kikutaro_from", "kikutaro_from@example.com")
            .to("kikutaro_to", "kikutaro_to@example.com")
            .subject("Spring bootから")
            .text("マルチパートのテキストだよ")
            .textHTML("<b>マルチパートのHTMLだよ</b>")
            .build();
        mailer.sendMail(email);
    }
}

application.propetiesでSMTPの設定を定義できます。

simplejavamail.smtp.host = smtp.sendgrid.net
simplejavamail.smtp.port = 587
simplejavamail.smtp.username = ********
simplejavamail.smtp.password = ********

その他

設定(Configure)はファイルでもConfigクラスでも可能です。プロキシなんかへの対応もあるようです。
カスタムヘッダ、添付ファイル、DKIM対応、Return-Receipt-To/Disposition-Notification-To、メールアドレスのバリデーション、MimeやEML,Outlook.msgなどなどあるので、別途書きたい。

Simple Java Mailの紹介

JavaでメールといえばJavaMail一択だと思っていたのですが、Simple Java Mailという中々良さげなライブラリがありました。

Simple Java Mail
f:id:kikutaro777:20170828231049p:plain

2007年ぐらいから開発されていて、2017年現在でもメンテや改造が進んでいるようです。中身が気になる方はGitHubへ。

GitHub - bbottema/simple-java-mail: Simple API, Complex Emails (JavaMail smtp wrapper)

「Simple API, Complex Emails」ってちょっとカッコイイですね。ちなみに中ではJavaMailを利用しているので、ラッパーライブラリという位置づけです。

細かい記述方法とかは別途解説していくとして(結構色んなことができそう)、シンプルなコードでJavaMailと簡単に比べてみます。

SendGridのSMTPサーバに接続して、テキストとHTML両方含めたマルチパートメールを送るというもの。JavaMailだとこんな感じですね。

JavaMailで書いた場合
package jp.co.kke.simplejavamailsample;

import java.util.Properties;
import javax.mail.Authenticator;
import javax.mail.BodyPart;
import javax.mail.Message;
import javax.mail.MessagingException;
import javax.mail.Multipart;
import javax.mail.NoSuchProviderException;
import javax.mail.PasswordAuthentication;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeBodyPart;
import javax.mail.internet.MimeMessage;
import javax.mail.internet.MimeMultipart;

/**
 * JavaMailを利用したメール送信
 *
 * @author kikuta
 */
public class Main {

    public static void main(String[] args) throws MessagingException {
        sendByJavaMail();
    }

    private static void sendByJavaMail() throws NoSuchProviderException, MessagingException {
        //接続先の設定
        Properties props = new Properties();
        props.put("mail.transport.protocol", "smtp");
        props.put("mail.smtp.host", "smtp.sendgrid.net");
        props.put("mail.smtp.port", 587);
        props.put("mail.smtp.auth", "true");
        
        //Authenticatorを継承したクラスを作って(ここではSMTPAuthenticator)
        //getPasswordAuthentication()をオーバーライドして認証情報をセット
        Authenticator auth = new SMTPAuthenticator();
        
        //セッション
        Session mailSession = Session.getDefaultInstance(props, auth);
        
        //メール送信のため
        Transport transport = mailSession.getTransport();
 
        //メールの情報を設定
        MimeMessage message = new MimeMessage(mailSession);
 
        //マルチパート・メディアタイプはalternativeを指定
        Multipart multipart = new MimeMultipart("alternative");
 
        BodyPart part1 = new MimeBodyPart();
        part1.setText("マルチパートのテキストだよ");
 
        BodyPart part2 = new MimeBodyPart();
        part2.setContent("<b>マルチパートのHTMLだよ</b>", "text/html;charset=UTF-8");
        
        multipart.addBodyPart(part1);
        multipart.addBodyPart(part2);
        message.setContent(multipart);
        
        //送信元
        message.setFrom(new InternetAddress("kikutaro_from@example.com"));
        
        //メールタイトル
        message.setSubject("サブジェクトだよ");
        
        //送信先
        message.addRecipient(Message.RecipientType.TO, new InternetAddress("kikutaro_to@example.com"));
        
        //メール送信
        transport.connect();
        transport.sendMessage(message, message.getRecipients(Message.RecipientType.TO));
        transport.close();
    }

    private static class SMTPAuthenticator extends Authenticator {
        @Override
        public PasswordAuthentication getPasswordAuthentication() {
           String username = "****id****"; //SendGridのログインID
           String password = "****pass****"; //SendGridのログインパスワード
           return new PasswordAuthentication(username, password);
        }
    }
}
Simle Java Mailで書いた場合

Simple Java Mailを利用したコードはこちらです。

package jp.co.kke.simplejavamailsample;

import org.simplejavamail.email.Email;
import org.simplejavamail.email.EmailBuilder;
import org.simplejavamail.mailer.Mailer;

/**
 * Simple Java Mailを利用したメール送信
 *
 * @author kikuta
 */
public class Main {

    public static void main(String[] args) throws MessagingException {
        sendBySimpleJavaMail();
    }

    private static void sendBySimpleJavaMail() {
        Email email = new EmailBuilder()
                .from("kikutaro_from", "kikutaro_from@example.com")
                .to("kikutaro_to", "kikutaro_to@example.com")
                .subject("サブジェクトだよ")
                .text("マルチパートのテキストだよ")
                .textHTML("<b>マルチパートのHTMLだよ</b>")
                .build();
        new Mailer("smtp.sendgrid.net", 587, "****id****", "****pass****").sendMail(email);
    }    
}

Builderでスッキリ!もちろんHeaderの設定とか色々なことができます。

Mavenのdependencyは以下です。

<dependency>
    <groupId>org.simplejavamail</groupId>
    <artifactId>simple-java-mail</artifactId>
    <version>4.4.4</version>
</dependency>

SendGridのsubstitutionsで本文を差し替えてみる

SendGridのV3 Mail Send APIではメール本文にあたるcontentは1つしか定義できません。(contentの型が配列で定義されているのはマルチパートでtext/plain,text/htmlを定義するため)
v3 Mail Send API概要 - ドキュメント | SendGrid

1リクエストの中で、どうしても異なる内容のメールを送りたい場合はsubstitutionsで本文を置換できるのでは?というツイートをみかけ、実際に試してみました。Javaなどのライブラリを利用した確認ではなく、JSONそのままでHTTPツールを使ってしまったのですが、以下のような形です。

{
  "personalizations": [
    {
      "to": [
        {
          "email": "kikutaro1@example.com"
	}
      ],
      "substitutions": {
        "%bodytext%": "テキスト1だよ",
	"%bodyhtml%": "HTML1だよ。<b>太字になる?</b>"
      },
      "subject": "メールタイトル1"
    },
    {
      "to": [
	{
	  "email": "kikutaro2@example.com"
        }
      ],
      "substitutions": {
        "%bodytext%": "テキスト2だよ",
	"%bodyhtml%": "HTML2だよ。<b>太字になる?</b>"
      },
      "subject": "メールタイトル2"
    }
  ],
  "from": {
    "email": "kikutaro@example.com",
    "name": "キクタロー"
  },
  "content": [
    {
      "type": "text/plain",
      "value": "%bodytext%"
    },
    {
      "type": "text/html",
      "value": "<html><body>%bodyhtml%</body></html>"
    }
  ]
}

substitutionはタグ定義を行って、そこに値を差し込む機能です。よく宛先とかで「%name%様へ」みたいにするようなやつです。これを使って、textとhtmlの本文をそれぞれ「%bodytext%」「%bodyhtml%」と定義して、差し込んでみました。

特にhtml側は、ちゃんとhtmlが差し込みで反映されるのか?が気になると思いますが、上記のような単純なHTMLである場合、以下のようにちゃんと表示されました。

f:id:kikutaro777:20170530002410p:plain

f:id:kikutaro777:20170530002339p:plain

転職(社内)して半年ちょっと経った振り返りと今後

仕事の内容が変わってから半年+α経ちました。やっと新しい業務にも慣れてきたのと、最近社内で振り返り・今後について考える機会があったので書いてみます。

ポエムです。

受託開発からサービスサポートの世界へ

私は入社以来、約10年ほどエンプラ系の受託システム開発に従事してきました。そして去年、事業開発系の部門へ転職異動してSendGridチームにジョインしました。

SendGridはメール配信のクラウドサービスを提供している米国の企業で、弊社が国内の正規代理店となっています。現在はサポートを中心に、色々な作業をしていて、今までとは毛色の異なる仕事が多くて日々新鮮です。

井の中の蛙

振り返ると会社入ってから7,8年くらいは「会社がすべての世界」みたいに視野が狭い人間でした。(視野の広い人が多い会社なんですが…)

あるとき、初めてJavaのWeb案件に関わることになって、部内や社内に知見がなくて困っていた所、「日本Javaユーザグループ(Japan Java User Group, JJUG)」なるものがあることを知りました。はじめて勉強会に参加したとき「こんな世界があるのか!」と感動したのですが、今思えば、あまりにも井の中の蛙過ぎたんだよなぁと(´・ω・`)

ちなみに、このブログ読んで「へー、そんなのあるんだ」と思った方は是非5/20にあるJJUG CCC 2017 Springというイベントにご参加ください!

www.java-users.jp

Java楽しいワイワイ

JJUGの勉強会に参加して、そこで学んだことや日々の開発で知ったことをブログに書いてるうちに、徐々にTwitter等で新しいつながりができたりしました。アドベントカレンダーに誘っていただいたとき、とても緊張したことを今も覚えてます。

外で発表させていただく機会も徐々に増えました。一番緊張したのはやっぱりJJUG CCCだったかなぁ。久しぶりにスライドを持って来たら2014年!!そんなになるのか…。

発表の機会を通じて、段々と現実世界で人とお話する機会も増えました。元々すごいコミュ障人見知りであまり人と積極的に会話できないタイプだったので、人と話すことの大切さに改めて気付いたり(^^;

Java EEのプロジェクトを幾つかやって、その辺の話も取り上げていただいたり。

初めてのJava EE 6開発! 最初の壁をどう乗り越えた?──最新Java EE開発“虎の穴” 第1回 菊田洋一氏 - builder by ZDNet Japan

「顧客ニーズへの柔軟かつ速やかな対応」、「開発環境のカイゼン」──Java EE 6の採用で構造計画研究所が得たメリット - builder by ZDNet Japan

気が付けば本の執筆に声をかけていただいて、とても良い経験をさせていただきました。

Javaエンジニア養成読本 [現場で役立つ最新知識、満載!] (Software Design plus)
きしだ なおき のざき ひろふみ 吉田 真也 菊田 洋一 渡辺 修司 伊賀 敏樹
技術評論社
売り上げランキング: 132,172

パーフェクト Java EE
パーフェクト Java EE
posted with amazlet at 17.04.27
井上 誠一郎 槙 俊明 上妻 宜人 菊田 洋一
技術評論社
売り上げランキング: 28,950

新しい環境での悩み

一方で泥臭い開発案件も多く、去年は厳しい案件にあたり心身ともに疲弊してしまいました。そんな中、社内で一番先鋭的な取組みをしてるSendGridチームに巡り合った形です。

メールといえばJavaMailって感じな自分でしたが、改めてみてみると、メール世界の奥深さにびっくりします。レピュテーションとかIPウォームアップとか色んな概念があって、海外ではメールに関連するあらゆるサービスがあります。

日々勉強(^^;

で、そんな中、先日とある面談したとき

「キクタローさんがジョインして、獲得したお客さんはどのくらいいるの?」

と聞かれたのですが、答えられれなかったんですよね。自分の話で興味持って登録してくれた人は具体的に特定しきれないので、数値を出すのも難しいですが、まぁ少ないだろうなと。

自分の考えではJavaでやってたように、コツコツと発信を続けて、何年かしたら、みたいに思っていたのですが、この歳になって求められるのは結果だよなぁと。

社外への転職と考えれば結果求められるのは当然だろうし…

……

かといって、自分としては今まで開発者だったイチエンジニアがいきなり「SendGridいいんですよ!」といっても響くわけがないと思ってて。

難しいなぁと。

なんかカリスマ的な人だったら、それだけで広まるんでしょうが。

自分のようなタイプはもっとサービスのことを色々話せるようになることを意識しながら、これまでやってきた技術とかと絡めて情報発信を積極的に続けるしかないと思っています。

ということで今後も色々発信していきたいと思います。もし

・ハンズオンでメール送信にSendGrid使うから説明プレゼンして欲しい
・アプリのバックエンドでメール送信したいサービスについて教えて

みたいなお話があればお声かけいただければと思います(^^)

今までだと以下のような関連で発信してるので、クラウドサービスのハンズオンで、とかXamarinみたいなモバイルアプリのバックエンドで、みたいな話とか。

・Java関連
sendgrid.kke.co.jp

kikutaro777.hatenablog.com

kikutaro777.hatenablog.com

kikutaro777.hatenablog.com

・Azure
qiita.com

・Xamarin
qiita.com

・Salesforce
kikutaro777.hatenablog.com

・Line Notify
sendgrid.kke.co.jp

・Google Cloud Platform
kikutaro777.hatenablog.com

・Cloud Foundry(Pivotal)

・Cognitive Services

今年は自分で何かサービスを作って、そのバックエンドのメールでPostfixとかApache JamesとかSendGridとか使って運用し、SMTPサーバとしての比較なんかもしていきたいです。

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