16.6.オリジナルのMailetを作成しよう
 16.6.1.作成のための環境を整える
 16.6.2.Mailetを作成する
 16.6.3.Mailetをコンパイルする
 16.6.4.jarファイルの作成
 16.6.5.設定ファイルのコピー
 16.6.6.sarファイルの作成
 16.6.7.jamesへの配置
 16.6.8.config.xmlの編集
 16.6.9.動作確認
 


16.6.オリジナルのMailetを作成しよう

 16.6.1.作成のための環境を整える
   オリジナルのMailetを作成する前に、Mailetをコンパイルしたりアーカイブしたりする環境を整える必要があります。

  1.SARファイルの拡張子変更
   [f:\java\james\apps]ディレクトリにある[james.sar]をコピーして拡張子を名前変更し[james.zip]とします。
  2.SARファイルの解凍
   次に先ほど作った[james.zip]を[f:\java\myjames\]ディレクトリに解凍します。
  3.james.zipの削除
   解凍が終了してしまったjames.zipはもういらないので削除しておきます。
  
   最終的に以下のようなディレクトリ構造になっているはずです。
f:\java\myjames\
  |-conf\
  | |-sqlResources.xml
  |-META-INF\
  | |-MANIFEST.MF
  |-SAR-INF\
    |-assembly.xml
    |-conf.xml
    |environment.xml
    |-lib\
     |-james.jar
     |-mail_1_3.jar
     |・・・
     |-mm.mysql.LICENCE

 zipファイルの解凍先などは、各自の環境に合わせて変えていただいても結構ですが、この後相当ややこしいことを行っていくので、なるべくはこの例と同じ構造にしていただいたほうがよいかと思います。


 16.6.2.Mailetを作成する
   Mailet作成の環境が整ったところで、次はMailetのプログラムを書かなければいけません。今回は自動返信のメールレットを実際に作成してみたいと思います。
とりあえず、以下のプログラムを[AutoReturnMailet.java]というファイル名で[f:\java\myjames\SAR-INF\lib\testmailet\]ディレクトリを作成して保存しましょう。
AutoReturnMailet.java
package testmailet;

import java.util.*;
import java.io.*;
import javax.mail.*;
import javax.mail.internet.*;
import org.apache.mailet.*;

public class AutoReturnMailet extends GenericMailet{
  /*
   * メールを受け取ってココから処理が始まる
   */
  public void service(Mail mail) throws MessagingException {
    try{
      //引数のメールメッセージを取得
      MimeMessage mess = mail.getMessage();
      
      //メールの本文を取得
      BufferedReader bodyReader= new BufferedReader(
                   new InputStreamReader(
                     mess.getInputStream(),"ISO2022JP"));
      StringBuffer mailBody=new StringBuffer();
      String temp="";
      do{
        temp=bodyReader.readLine();
        if(temp!=null)mailBody.append("\n"+temp);
      }while(temp!=null);
      
      
      //送信者を取得
      Address[] address = mess.getFrom();
      
      //件名を取得
      String subject=mess.getSubject();
      
      //メールを送信
      sendMail(address,subject,mailBody.toString());
    }catch(Exception e){
      e.printStackTrace();
    }
  }

  /**
   * メールを送信
   */
  private void sendMail(Address[] to,String subject,String body) throws Exception{
    //送信情報
    Properties pt = new Properties();
    pt.setProperty("mail.from", "iihito@localhost");
    pt.setProperty("mail.smtp.host", "localhost");
    
    //送信メッセージの作成
    MimeMessage message = new MimeMessage(Session.getDefaultInstance(pt));
    message.setFrom(new InternetAddress("iihito@localhsot"));
    message.setRecipients(Message.RecipientType.TO, to);
    message.setSubject("Re:"+subject, "ISO-2022-JP");
    message.setText("以下のメールを受け取りました\n\n"+body, "ISO-2022-JP");
    Transport.send(message);
  }
}

 それでは、このMailetプログラムを簡単に解説します。まず、一行目はこのAutoReturnMailetを入れるのパッケージ名の指定です。パッケージに入れないとMailetがどこにあるのかわからなくなってしまうため、必ず一階層以上のパッケージに入れてください。
 次のimportの部分はこのMailetで必要なものをimportします。ここでインポートされているものは「mail.jar(james2.1.3ではmail_1_3.jar)」と「james.jar」に入っています。
 さて、本題の「AutoReturnMailet」クラスは「GenericMailet」を継承しています。これによってMailetとしての基本的な機能を受け継ぐことが可能となっているのです。
 そして、その中にある「service(Mail mail)」メソッドはMailetにとって特殊なメソッドでJamesからMailetが呼び出された場合にまずこのメソッドに処理が移ります。普通のJavaアプリケーションのmain()メソッドみたいなものですね。さらに、このメソッドの中では、メールの送信者や内容などの情報を引数で与えられたMailオブジェクトから取り出しています。そして、最後につぎで説明するsendMailメソッドを呼び出してメールを送信します。
 次の「sendMail」メソッドでは、引数で得た情報を元にMimeMessageオブジェクトを作成し、これを「GenericMailet」から継承したTransportオブジェクトの「send()」メソッドを用いて送信しています。
 このプログラムの細かい部分はMailetAPIやJavaMailのAPIを見るとはっきりわかるでしょう。


 16.6.3.Mailetをコンパイルする
    プログラムがすべて入力できたら、Mailetをコンパイルしましょう。ただしMailetのコンパイルには[james.jar]と[mail_1_3.jar]の二つのライブラリが必要なので以下のようにします。ただし、表示が二行になっている場合にもすべて一行で入力します。
F:\java\myjames\SAR-INF\lib>javac testmailet\AutoReturnMailet.java -classpath .;james.jar;mail_1_3.jar

 説明の必要はないと思いますが、AutoReturnMailetはパッケージ[testmailet]の中に入っているので、コンパイルは必ず[F:\java\myjames\SAR-INF\lib]から行うようにしましょう。


 16.6.4.jarファイルの作成
    コンパイルが正常に行えたら、次はAutoRurnMailetを含むjarファイルを作成します。以下のようにコマンドを入力してJarファイルを作成してください。
F:\java\myjames\SAR-INF\lib>jar cfv testMailet.jar testmailet
マニフェストが追加されました。
testmailet/ を追加中です。(入 = 0) (出 = 0)(0% 格納されました)
testmailet/AutoReturnMailet.java を追加中です。(入 = 1666) (出 = 799)(52% 収縮されました)
testmailet/AutoReturnMailet.class を追加中です。(入 = 2383) (出 = 1276)(46% 収縮されました)

 正常にjarファイルの作成が行われると[F:\java\myjames\SAR-INF\lib]に[testMailet.jar]が作成されるはずです。ちゃんと作成されているか確認しておきましょう。


 16.6.5.設定ファイルのコピー
  
●前々章で作成したconfig.xmlファイルを今から作成するmyjamesに適用するためにコピーします。
 [f:\java\james\apps\james\SAR-INF\]にある[config.xml]を[f:\java\myjames\SAR-INF\]に上書きコピーします。
 
●さらに、ユーザの設定やユーザのmailboxなどをコピーします。
 [f:\java\james\apss\james\]の中の[var]ディレクトリ以下を[f:\java\myjames]にコピーします。


 16.6.6.sarファイルの作成
    次はTomcatでいうところのWARファイルであるSARファイルを作成します。実際にはsarファイルもjarファイルの拡張子を変えただけの物なので以下のコマンドで作成できます。ただし、カレントディレクトリに注意してください。
F:\java\myjames\SAR-INF\lib>cd ../../
F:\java\myjames>jar cfv myjames.sar *
マニフェストが追加されました。
conf/ を追加中です。(入 = 0) (出 = 0)(0% 格納されました)
conf/sqlResources.xml を追加中です。(入 = 21668) (出 = 2765)(87% 収縮されました)

エントリ META-INF/ を無視します。
エントリ META-INF/MANIFEST.MF を無視します。
SAR-INF/ を追加中です。(入 = 0) (出 = 0)(0% 格納されました)
SAR-INF/assembly.xml を追加中です。(入 = 7771) (出 = 1325)(82% 収縮されました)
・・・中略・・・
SAR-INF/lib/testMailet.jar を追加中です。(入 = 2832) (出 = 2487)(12% 収縮されました)


これで、[f:\java\myjames\]にmyjames.sarというファイルが作成されます、ちゃんと作成されているか確認してみましょう。


 16.6.7.jamesへの配置
   以下のようにして作成したメールレットをJamesへ配置します。
  1.[myjames.sar]を[f:\java\james\apps\]ディレクトリへ移動します。
  2.[james.sar]の名前を変更して[james.sar.org]などとしましょう。
  3.現在ある[f:\java\james\apps\]の中にある[james]ディレクトリを削除します。
  4.jamesを起動させてsarファイルの展開を行います。
F:\java\james\bin>run
Using PHOENIX_HOME: F:\java\james
Using PHOENIX_TMPDIR: F:\java\james\temp
Using JAVA_HOME: D:\java\j2sdk1.4.1_02

Phoenix 4.0.1

James 2.1.3
Remote Manager Service started plain:4555
POP3 Service started plain:110
SMTP Service started plain:25
NNTP Service Disabled
Fetch POP Disabled




 16.6.8.config.xmlの編集
   次に前章で行ったMailetを使用する方法を使って自分で作成したMailetを実行するように設定します。
 [f:\java\james\apps\myjames]ディレクトリが作成されているはずですので、この中の[SAR-INF\]ディレクトリにあるconfig.xmlを以下のように編集します。
config.xml
113行目あたり
<mailetpackages>
  <mailetpackage>org.apache.james.transport.mailets</mailetpackage>
  <mailetpackage>testmailet</mailetpackage>
  ↑この一行を追加
</mailetpackages>

226行目あたり
<processor name="transport">
  <mailet match="SubjectIs=AutoReturn" class="AutoReturnMailet"/>

 まず前半部分の設定では、Mailetとして使用するパッケージ名を追加します。ここには本来Jamesに付属されているMailetが入っているパッケージ[org.apache.james.transport.mailets]の記述があるので、この下に一行追加してオリジナルのMailetのパッケージ名を設定します。
 後半部分は、前章でやったように[AutoReturnMailet]を呼び出す条件とその設定です。この設定ではSubjectが[AutoReturn]であるメールはすべてAutoReturnMailetによって処理されます。

 16.6.9.動作確認
   それでは、Jamesを再起動させて、実際にJamesのユーザ宛てにSubjectが「AutoReturn」という名前のメールを送信してみましょう。
その内容が書かれた、メールが帰ってこれば成功です。


このようにMailetを自分で記述すれば、不可能な処理はありません。今回は自動返信という簡単な例を紹介しましたがWebサービス技術への応用もそう難しいことなく実現できるようなきがします。
もっといえば、家にメールを送っておくと帰ってきたときには風呂が沸いているなんていう、世界もそう遠くないかもしれませんね。

 
   >>> 終わり <<<


このドキュメントの間違い・誤字・脱字を発見された方は筆者までご連絡をいただけるとうれしいです。

また、私のわかる範囲でご質問にも答えようと思います。ご質問や疑問点がある方は気楽にメールをください。