Emotion Wave Tech Blog

福岡にあるエモーションウェーブ株式会社のエンジニアが書いています。

javaテンプレートエンジンを使用した一斉メール配信


こんばんは。今月の案件で、プッシュ型のサービス(一斉メール配信)をjavaで開発しました。 年のせいか、最近物忘れが激しいので、やり方を忘れないうちにメモしておきます。

■要件

「あなたの明日の予定はこれこれですよー」と予定をメールでお知らせする機能がほしいと依頼されました。 明日の予定これこれはDBに入っています。

■考えたしくみ

既に運用中のサービスへの追加機能でしたので、現状の運用環境に追加しやすく、 かつ数日でできるしくみをメンバー内で考えました。 運用環境はLinuxで、javaが動いています。rubyでささっとできそうでしたが、結局は以下のしくみにしました。 ①cronで毎日指定時間にメール配信機能起動シェルスクリプトを呼ぶ ②シェルスクリプト内で環境設定などしてjavaで作成されたメール配信機能を起動 ③起動したメール配信機能で、テンプレートエンジンを使用して文面作成 ④作成したメールを一定数毎に配信

■テンプレートエンジン(今回の肝)

テンプレートエンジンには、Apache Velocity(velocity-1.7-dep.jar)を採用しました。 テンプレートエンジンとは、雛形(テンプレート)と個々に異なる入力データを合成して最終成果物を出力するものです。 まず、テンプレートをVTLという言語で書きます(こんな感じ)。

 明日の$NAMEさんのご予約状況。
 【開始時間】$START_TIME
 【終了時間】$END_TIME
 ・・・


テンプレートへの文字列設定はこんな感じ。

private String getMailText(Template tempText, MailElement elm) throws Exception {
    // 置換する情報を設定
    VelocityContext context = new VelocityContext();
    context.put("NAME", elm.getName());
    context.put("START_TIME", elm.getStartTime());
    context.put("END_TIME", elm.getEndTime());

    // テンプレートとマージ
    StringWriter sw = new StringWriter();
    tempText.merge(context, sw);
    sw.flush(); 
    
    return sw.toString();
}


■メール配信

ここの内容と同じような処理をしています。 http://www.atmarkit.co.jp/fjava/javatips/123java022.html 連続で送信するのはよろしくないので、一定間隔あけながら送信しています。

以上です。 同様の案件はたくさんあると思いますが、ベストプラクティスを知りたいです。 経験ある方、ぜひコメント下さい!!!