OverView
- SAStrutsを利用してメールを送信
- メールはSeasarプロジェクトのS2Maiを利用します
S2Maiのダウンロード
公式からS2MaiとS2Mai-Tigerをダウンロード。
今回ダウンロードしたのは以下。
S2Mai ver 0.9.7
S2Mai-Tiger ver 0.9.7
S2MaiをSAStrutsに組み込む
ダウンロードしたS2Mai/S2Mai-Tigerを解凍。
libの中にある以下のjarをSAStrutsプロジェクトのWEB-INF/libにコピー。
- activation
- ozacc-mail
- s2mai
- s2mai-tiger
- freemarker
次にダウンロードしたS2Maiの中のsrc/main/resourcesにある
- s2mai.dicon
をSAStrutsプロジェクトのsrc/main/resourcesにコピー。
S2Maiの初期設定
S2Maiはいろいろな方法で使うことができます。
今回はできるだけ公式に従ってsmartデプロイに対応する形式でS2Maiを使っていきます。
src/main/resources/app.diconに以下を追加
<include path="s2mai.dicon"/>
src/main/resources/creator.diconに以下を追加
<component class="org.seasar.mai.creator.MaiCreator"/>
src/main/resources/customizer.diconに以下を追加
<component name="maiAspectCustomizer" class="org.seasar.framework.container.customizer.AspectCustomizer"> <property name="interceptorName">"s2mai.s2MaiInterceptor"</property> </component> <component name="maiCustomizer" class="org.seasar.framework.container.customizer.CustomizerChain"> <initMethod name="addCustomizer"> <arg>maiAspectCustomizer</arg> </initMethod> </component>
メール送信時のパラメタ用としてdtoを作成
ルートパッケージ配下の「dto」あたりのパッケージに「MailDto.java」を作成。
S2Maiで設定可能項目は以下です。
host | SMTPサーバ名かIPアドレス | |
port | SMTPポート。 | S2MaiがSSLに対応していないので25とか |
username | SMTP認証用ユーザ名 | |
password | SMTP認証用パスワード | |
templateEncoding | メールテンプレートの文字コード | 省略でもOK |
connectionTimeout | SMTPタイムアウトまでの時間(ミリ秒?) | 省略でもOK |
readTimeout | SMTP送受信時のタイムアウトまでの時間(ミリ秒?) | 省略でもOK |
mailCharset | メールのエンコードに使用する文字コード | 省略でもOK |
subject | 件名 | String |
from | メール送信元 | MailAddress型を利用可能 |
to | メールto | MailAddress型の配列 |
cc | メールcc | MailAddress型の配列 |
bcc | メールbcc | MailAddress型の配列 |
replyTo | メールreply-to | MailAddress型 |
returnPath | メールreturn-path | MailAddress型 |
また、ファイル添付するにはAttachedFile型が利用できます。
さらにメールの本文に埋め込む為の変数などを独自に追加しておいてもよいです。
dtoには必ずget****という名前でゲッターを用意しておいてください。
S2Maiが自動的に該当ゲッターを見つけて処理します。
それらを踏まえて作成したサンプルです。
/** * メール送信用DTO * @author Administrator * */ public class MailDto { public String host = "SMTPサーバ"; public String port = "25"; public String userName = "ユーザID"; public String password = "パスワード"; public MailAddress[] to; public MailAddress[] cc; public MailAddress[] bcc; public MailAddress from; public String subject; public String replyTo; public String returnPath; public String body; public String extendValue1; // 拡張用 public String extendValue2; // 拡張用 public String extendValue3; // 拡張用 public String extendValue4; // 拡張用 public String extendValue5; // 拡張用 public List<AttachedFile> fileList; /** * 以下Getter * S2MaiがGetterを要するため */ public String getHost() { return host; } public String getPort() { return port; } public String getUserName() { return userName; } public String getPassword() { return password; } public MailAddress[] getTo() { return to; } public MailAddress[] getCc() { return cc; } public MailAddress[] getBcc() { return bcc; } public MailAddress getFrom() { return from; } public String getReturnPath() { return (from != null) ? from.getAddress() : null; } public String getSubject() { return subject; } public String getreplyTo() { return replyTo; } public String getreturnPath() { return returnPath; } public String getBody() { return body; } public String getextendValue1() { return extendValue1; } public String getextendValue2() { return extendValue2; } public String getextendValue3() { return extendValue3; } public String getextendValue4() { return extendValue4; } public String getextendValue5() { return extendValue5; } public List<AttachedFile> fileList() { return fileList; } }
メール送信インターフェースの作成
ルートパッケージ配下に「mai」という名前でパッケージを作成し、その下に「MailMai.java」を作成。
ルートパッケージ配下にある「mai」というパッケージで
***Mai.javaというインターフェースであることというS2Maiのネーミングルールがあります。
S2Maiの使い方によってはルール通りでなくても動作しますが、ここは合わせていきましょう。
こんな感じですね。
MailMai.javaはメール送信用のインターフェースを記述します。
実装クラスは作成しないのがミソです。ネーミングルールに従うことでS2Maiが実装してくれます。
MailMaiインターフェースにはメール送信するメソッド名とパラメタとしてdtoを渡すこととします。
また、MailMaiの中ではtigerアノテーションを利用して
メールのfromやsubjectなどの固定値を設定することができます。
@From(@MailAddr(address="xxxxxxx@xxx.xxx", personal="メールFROMに表示される名前")) public interface MailMai { //:TODO メールの種類によってメソッドを追加してください。 // その際、メールテンプレート(.ftlファイル)も「MailMai_メソッド名.ftl」というファイル名で追加してください。 @Subject("メール件名") public void sendAuthMail(MailDto dto); @Subject("メール件名") public void sendRegisterMail(MailDto dto); @Subject("メール件名") public void sendErrorMail(MailDto dto); @Subject("メール件名") @To({@MailAddr(address="xxxxx@xxxxxx.xxx", personal="メールTOに表示される名前")}) public void sendSupportMail(MailDto dto); }
Tigerアノテーションは設定する箇所によって対象範囲を変更できます。
上記の例だと@FROMアノテーションはinterfaceの前に記述していることから、
@FROMの設定内容はsendAuthMailなどのメソッド全てに適用されます。
Tigerアノテーションで指定可能なものは以下です。
@Subject | String | @Subject(“タイトル”) |
@From | @MailAddr | @From({@MailAddr(address=”xxxxx@xx.xx”, personal=”名前”, @MailAddr(…)}) |
@To | @MailAddr配列 | @To({@MailAddr(address=”xxxxx@xx.xx”, personal=”名前”, @MailAddr(…)}) |
@Cc | @MailAddr配列 | @Cc({@MailAddr(address=”xxxxx@xx.xx”, personal=”名前”, @MailAddr(…)}) |
@Bcc | String配列 | |
@ReplyTo | @MailAddr | |
@ReturnPath | String |
メールテンプレートの作成
メールテンプレートはmaiパッケージの直下に作成します。
名前にルールがあって
- Mailインターフェース名_メソッド名.ftl
という名前になります。例えば今回の例でいくと
sendAuthMailというメソッドで送信されるメールのテンプレートは「MailMai_sendAuthMail.ftl」です。
maiパッケージの直下に作成します。
こんな感じですね。
======================================== メールです。 ======================================== ${data.extendValue1}さん ご連絡ありがとうございます。
例のように${data.xxxx}の形式でdtoに設定した値を取得して
テンプレートに表示することができます。
メール送信の実行
後はメールを送信するのみです。
適当なActionクラスで実験してみましょう。
Actionクラスの最初でMailmaiを自動作成させるように記述を追加するのを忘れないでください。
public class LoginAction { @ActionForm @Resource protected LoginForm loginForm; @Binding(bindingType = BindingType.MUST) MailMai mailMai; ・・・(省略)・・・ public String sendMailtoUser() { // メール送信 MailDto mailDto = new MailDto(); mailDto.to = new MailAddress[]{new MailAddress("xxxxxxx@xx.xx")}; mailDto.extendValue1 = "送信者さん"; mailMai.sendRegisterMail(mailDto); }
DTOに情報を詰めて自動作成されたMailMaiのインスタンスmailMaiのメソッドより
メールを送信します。
設定はこれだけでメール送信ができるようになります。
あとがき
S2Containerの仕組みを利用しているので
設定箇所は多くなりますがその分コーディングは簡略化されます。
簡単にメールテンプレートの追加もできるのでおすすめです。