2007年6月12日火曜日

"S2Mai + Velocity"でメール送信

スズキです。

Seasar2のメール関係のプロダクトにS2Mailというすばらしいものがあります。
インターフェースに抽象メソッド書いて、それに対応するメールテンプレート
(Velocity/FreeMarker)を作っておくと、実装クラス書かなくても、
勝手に該当するテンプレート使って、メール送ってくれます。
(Velocity使えるようにする部分は、私も手伝わさせていただきました)

要は、S2Daoのメール版といった感じで、SQLファイルが
メールテンプレートになってる感じです。

とにかく、ここが総本山。
http://s2mai.sandbox.seasar.org/ja/index.html
※使いたい人は、とりあえず、ここの情報は把握しておきましょう。

最初に注意点ですが、下記jarが存在すると、
geronimo-j2ee_1.4_spec-1.0.jar
メール送信時に、挙動がおかしくなる可能性があります。
(TOがメールサーバに送られず、メールが送信できない!?)

で実際に、どんなコードを書けばよいかですが、
今回は、テンプレートにVelocityを使うこととします。

まずはクラス/インターフェースの作成です。

--------SampleMaiDto.java
package xxx.dto;
public class SampleMaiDto {
  private String from; // メールのFromになります。
  private String to; // メールのToになります。
  private String userName; // 本文に差し込む値です。
  // getter & setter は省略
  ...
}
--------

--------SampleMai.java
package xxx.mai;
import xxx.dto.SampleMaiDto;
public interface SampleMai {
  public void sendSampleMail(SampleMaiDto dto);
}
--------

sendSampleMailメソッドを実行すると、dtoのデータと、
メールテンプレートがマージされてメールができ、それが送信されます。
※From, To, Cc, Bcc, Subject, などの指定はいろいろなやり方(diconなど)があります。

次にメールのテンプレートですがMaiインターフェースと同じパッケージ下に、
配置する必要があります。そして命名規則もあり、
インターフェース名_メソッド名.vm(Velocityの場合)
となります。(S2Daoのsqlと同じですね)

--------SampleMai_sendSampleMail.vm
Subject: サンプルサブジェクト

サンプル本文
${data.userName}
--------

"Subject: "の次にサブジェクト入れて、一行空けて本文を書きます。
引数のdtoの値を参照する場合は${data.フィールド名}となります。
※Subjectの設定方法もいろいろあります。

そして最後にやらなければいけないのが、diconの設定です。
まず用意しなければいけないdiconは、
●mailProperties.dicon : smtpサーバの情報設定
●mailTemplate.dicon : テンプレートの設定(Velocity or FreeMarker)
です。(ダウンロードしたアーカイブにサンプルがあるはずです)

ここで、テンプレートはVelocityにするので、下記のように修正しておきます。

--------mailTemplate.dicon
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE components PUBLIC "-//SEASAR//DTD S2Container 2.3//EN"
    "http://www.seasar.org/dtd/components23.dtd">
<components namespace="mailTemplate" >
  <include path="mailProperties.dicon"/>
  <include path="org/seasar/mai/template/velocity.dicon"/>
</components>
--------

本来なら、次に、SmartDeployの設定して、めでたし、めでたし、
にしたいところですが、なぜかうまくいきません。

なので、現状、僕は、app.diconなどに、下記の記述をしています。

--------xxx.dicon
<include path="s2mai.dicon"/>
...
<component class="xxx.mai.SampleMai">
  <aspect>s2MaiInterceptor</aspect>
</component>
--------
※Mai作るたびに、記述しています。

徒然なる紹介でした。

SmartDeployの勉強もかねて、原因調査してみよう。

--
blog: http://suz-lab.blogspot.com/

1 コメント:

匿名 さんのコメント...

たぶん customizer.dicon の設定がミスしてるきがします。
以下サンプル


"s2mai.s2MaiInterceptor"





maiAspectCustomizer