続々 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で記述できるようになりました。