続々 Google App Engine / Java 「Mail API」

さて、前回メール送信はLowlevelAPIで実装すればハッピーになれるというところまでわかりました。
さてメール送信となると、テンプレートを使わないわけにはいきません。
やはりテンプレートといえばapache Velocityですね。
まず下記公式サイトより最新のvelocityをダウンロードします。
The Apache Velocity Project
今のところvelocity-1.6.3ですね。
後で必要になるので、velocity-tools-1.4もダウンロードしておいてください。

1.6.3をダウンロードして展開すると、本体のvelocity-1.6.3.jarと依存ライブラリのvelocity-1.6.3-dep.jarが入っていると思います。
この2つをwar/WEB-INF/libへコピーします。
プロジェクトの参照ライブラリにも追加しておいてください。

あらかじめダウンロードしておいたvelocity-tools-1.4も展開してください。
どうもdep.jarだけでは依存ライブラリが1つ足りないようで、このtools-1.4に入っているcommons-logging-1.1.jarもwar/WEB-INF/libへコピーして参照ライブラリに追加する必要があるようです。

これで必要ライブラリはそろいました。

では次はプログラムのほうを見ていきます。
フォームなどから取得したbodyとfromをテンプレートに入れて文字列にしています。

UserService userService = UserServiceFactory.getUserService();
User user = userService.getCurrentUser();
String result;
String body = requestScope("body");
String from = user.getEmail();

try{
    MailData mail = new MailData();
    mail.setBody(body);
    mail.setFrom(from);
    
    Velocity.init("WEB-INF/velocity_conf.properties");
    VelocityContext context = new VelocityContext();

    context.put("mail", mail);

    StringWriter sw = new StringWriter();
    // war/velocity/templates/mail.tmplを読み込む
    Template template = Velocity.getTemplate("mail.tmpl", "UTF-8");
    template.merge(context, sw);
    result = sw.toString();
    sw.flush();
    
}catch(Exception e){
    e.printStackTrace();
}


velocity_conf.propertiesの中身

resource.loader = FILE
FILE.resource.loader.class = org.apache.velocity.runtime.resource.loader.FileResourceLoader
FILE.resource.loader.path = velocity/templates

velocity/templatesと書くことでwar/velocity/templatesがテンプレートのrootディレクトリとなります。プログラム中のVelocity.getTemplate()で渡すファイルはこのディレクトリの中にあるものになります。

mail.tmplの中身

$mail.from

$mail.body

MailDataクラスはfromとbodyというString変数を持っているだけのクラスです。
velocityのリソースパスはwarディレクトリをrootとして検索するようなのでwar直下のディレクトリを基準に記述してください。このとき「WEB-INF/xxx」という感じで頭に/をつけないようにしてください。


これでメールのテンプレートをvelocityで記述できるようになりました。