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

はじめに

http://blogs.yahoo.co.jp/dk521123/36245554.html
の続き。上記で言ってた
~~~~
できれば、
 * 件名も外出ししたい
~~~~
を考える。

実装案

http://blogs.yahoo.co.jp/dk521123/34463879.html
を眺めていたら「##」がコメントアウトになるので、例えば、
・件名は、一行目のコメント文に書く
と決めておけば実現できそう。

サンプル

SampleTemplete.vm

$mailBean.userName 様
                                       $mailBean.date
 この度はお買い上げ頂き、誠にありがとうございます。

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

以上

IMailBean.java / SampleMailBean.java

http://blogs.yahoo.co.jp/dk521123/36245554.html
と同じなので省略

EmailParamCreator.java

import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.StringWriter;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.AbstractMap.SimpleEntry;

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();
    }
  }

  // ★ここ★
  public static String getMailSubject(String templatePath, String templateFileName) throws IOException {
    Path path = Paths.get(templatePath, templateFileName);
    try (BufferedReader bufferedReader = new BufferedReader(
        new InputStreamReader(new FileInputStream(new File(path.toString())), DEFAULT_ENCODING));) {
      String firstLine = bufferedReader.readLine();
      String firstLineWithoutComment = firstLine.replaceFirst("##", "");
      return firstLineWithoutComment.trim();
    }
  }

  // ★ここ★
  public static SimpleEntry<String, String> getMailSubjectAndBody(String templatePath, String templateFileName,
      IMailBean bean) throws IOException {
    String mailSubject = EmailParamCreator.getMailSubject(templatePath, templateFileName);
    String mailBody = EmailParamCreator.getMailBody(templatePath, templateFileName, bean);

    return new SimpleEntry<>(mailSubject, mailBody);

  }
}

Main.java

呼び出し側
import java.io.IOException;
import java.util.AbstractMap.SimpleEntry;

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 {
      SimpleEntry<String, String> mailSubjectAndBody = EmailParamCreator.getMailSubjectAndBody("./conf",
          "SampleTemplete.vm", bean);
      System.out.println(mailSubjectAndBody.getKey());
      System.out.println();
      System.out.println(mailSubjectAndBody.getValue());
    } 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を利用してメールテンプレート機能の実装を考える [1]

http://blogs.yahoo.co.jp/dk521123/36245554.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