【Java】【Velocity】 Velocityを利用してメールテンプレート機能の実装を考える [1]

はじめに

 * 以下の関連記事でメール送信することはできたが、本文が直書きなので、
  外出しファイルで実装したい
http://blogs.yahoo.co.jp/dk521123/36230453.html
http://blogs.yahoo.co.jp/dk521123/36230816.html
できれば、
 * 件名も外出ししたい
 * 日本語だけでなく、国際化にも将来的に対応できるようにしたい
が、まずは本文だけを考える

# 件名を加えた考慮については、以下の関連記事を参照のこと。
http://blogs.yahoo.co.jp/dk521123/36246607.html

構成

 ■ EmailParamCreator : メール・パラメータ作成クラス

 * 本文
  => 本文「Body」は、Velocityテンプレートを使う 
  => インターフェイスとしては、
     public static String getMailBody(String templatePath, String templateFileName, IMailBean bean;

準備

 * velocity-X.X-dep.jar(今回は「velocity-1.7-dep.jar」)をインポートしておくこと
 * 詳細は以下の関連記事を参照のこと。
http://blogs.yahoo.co.jp/dk521123/34456704.html

サンプル

SampleTemplete.vm

 * Velocityを利用してメールテンプレート
$mailBean.userName 様
                                       $mailBean.date
 この度はお買い上げ頂き、誠にありがとうございます。

【商品】
#foreach ($productName in $mailBean.productNames)
商品名   : $productName
#end

以上

IMailBean.java

public interface IMailBean {
}

SampleMailBean.java

import java.util.ArrayList;
import java.util.List;

public class SampleMailBean implements IMailBean {
  private String userName;
  private String date;
  private List<String> productNames;

  public SampleMailBean() {
    this.productNames = new ArrayList<>();
  }

  public void setUserName(String userName) {
    this.userName = userName;
  }

  public String getUserName() {
    return userName;
  }

  public String getDate() {
    return date;
  }

  public void setDate(String date) {
    this.date = date;
  }

  public List<String> getProductNames() {
    return productNames;
  }

  public void addProductNames(String productName) {
    productNames.add(productName);
  }
}

EmailParamCreator.java

import java.io.IOException;
import java.io.StringWriter;

import org.apache.velocity.Template;
import org.apache.velocity.VelocityContext;
import org.apache.velocity.app.Velocity;

public class EmailParamCreator {
  private static final String DEFAULT_ENCODING = "UTF-8";

  public static String getMailBody(String templatePath, String templateFileName, IMailBean bean) throws IOException {

    try (StringWriter writer = new StringWriter();) {
      Velocity.setProperty("file.resource.loader.path", templatePath);
      Velocity.setProperty(VelocityEngine.RUNTIME_LOG_LOGSYSTEM_CLASS, 
          "org.apache.velocity.runtime.log.NullLogSystem");
      Velocity.init();
      VelocityContext context = new VelocityContext();

      context.put("mailBean", bean);
      Template tmplate = Velocity.getTemplate(templateFileName, DEFAULT_ENCODING);
      tmplate.merge(context, writer);
      return writer.toString();
    }
  }
}

Main.java

呼び出し側
import java.io.IOException;

public class Main {

  public static void main(String[] args) {
    SampleMailBean bean = new SampleMailBean();
    bean.setUserName("○井");
    bean.setDate("2016-07-23");
    bean.addProductNames("C#  Program Book");
    bean.addProductNames("Java Program Book");
    bean.addProductNames("C++ Program Book");
    
    try {
      System.out.println(EmailParamCreator.getMailBody("./conf", "SampleTemplete.vm", bean));
    } catch (IOException ex) {
      ex.printStackTrace();
    }
  }
}

出力結果

○井 様
                                       2016-07-23
 この度はお買い上げ頂き、誠にありがとうございます。

【商品】
商品名   : C#  Program Book
商品名   : Java Program Book
商品名   : C++ Program Book

以上


関連記事

Velocity に関するトラブルシューティング

 * VelocityExceptionの対応
http://blogs.yahoo.co.jp/dk521123/36257386.html

Velocityを利用してメールテンプレート機能の実装を考える [2]

http://blogs.yahoo.co.jp/dk521123/36246607.html

Apache Velocity関連

Apache Velocity ~入門編~
http://blogs.yahoo.co.jp/dk521123/34456704.html
Apache Velocity ~VTL(Velocity Template Language)編~
http://blogs.yahoo.co.jp/dk521123/34463879.html
Velocity を Servlet で使用するには
http://blogs.yahoo.co.jp/dk521123/34460303.html

メール送信関連

Java で、 Email を送るには... ~ JavaMail / テキストメール編 ~
http://blogs.yahoo.co.jp/dk521123/36230453.html
Java で、 Email を送るには... ~ JavaMail / 添付ファイル付きメール編 ~
http://blogs.yahoo.co.jp/dk521123/36230816.html