コンテンツへスキップ

スーパーアジャイルなJAVA、SAStrutsでメール送信をする

OverView

  1. SAStrutsを利用してメールを送信
  2. メールは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
  • mail
  • 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の仕組みを利用しているので

設定箇所は多くなりますがその分コーディングは簡略化されます。

簡単にメールテンプレートの追加もできるのでおすすめです。

 

 

 

コメントを残す

メールアドレスが公開されることはありません。