James

Jamesって?

JamesはJavaで書かれたメールサーバです。 SMPT、POP3などのプロトコルに対応しています。 James単体でメールサーバとして機能するため、 他にメールサーバを使わずに、注文確認メールを送ったり、 メーリングリストを運用したりできます。

面白いのはMailetという仕組みで、 到着したメールをトリガーにMailetという プログラムを呼び出すことが出来ます。 機能的にはHTTPサーブレットのメール版と考えられますが、 サーブレットAPIとは異なるインターフェイスで作られています (SMTPサーブレットとかではない)。

インターネットの一番の使い道と言えばメールでしょう。 メールでJavaでJakarta、それがJamesです。 詳しくないので、利点や使い道をうまく理解できず、 説明もできませんが、とりあえず観単に使ってみました。

実行してみる

DocumentationのInstallに書かれているステップがちゃんと短い要約になっているので、それに従ってインストール、実行します。 設定を変えなければ、けっこう簡単です。 ここではWindowsXP + JDK1.4のローカル環境で実行してみました。

ダウンロードしたファイルを展開し、任意のディレクトリに配置します。 binディレクトリのrun.bat(run.sh)を実行すると、Jamesが起動します。 うまくいくと、こんな感じになります。
C:\apps\james-2.0a3\bin>run

Phoenix 4.0a4

Application file:/C:/apps/james-2.0a3/apps/james.sar uses a deprecated packaging
 format.
James 2.0a3-cvs
Started POP3 Server plain:110
Started SMTP Server plain:25
Started NNTP Server plain:119
終了はとりあえずCTRL+S(強制終了)です。

Jamesの起動で私は30分はまりました。 ウィルスバスターのpop3Trapがpop3ポートを取っていて、 ウィルスバスターを終了してもポートを開放しないんです。 しょうがないから、タスクマネージャでプロセスを強制終了(ちゃんとした方法はあるかも)。 JVM already Bindとかいうメッセージを見かけたら、 netstat -aとかでポートを確認してみましょう。

メール送受信してみる

デフォルトではユーザーアカウントがないので、 送受信のためにユーザーを登録します。

telnetで4555ポートに接続し、
Microsoft Windows XP [Version 5.1.2600]
(C) Copyright 1985-2001 Microsoft Corp.

C:\Documents and Settings\miya>telnet
Microsoft Telnet クライアントへようこそ

エスケープ文字は 'CTRL+]' です

Microsoft Telnet> open localhost 4555
ルートでログインし、ユーザーを作成します。
JAMES RemoteAdministration Tool 2.0a3-cvs
Please enter your login and password
Login id:
root
Password:
root
Welcome root. HELP for a list of commands
addUser hoge hoge
User hoge added
ここで私は10分はまりました。telnetで4555ポートに接続するっていうのが、 分からなかった(素人かな。。。)。

普通のメーラーを起動し、アカウントの設定を行い、 先ほど作ったアドレス(hoge@localhostなど)に送信します。 受信すると、ちゃんとメール出せてますねぇ〜。

ここでもまた、はまります。 外部のプロバイダを経由して送信してました。 それはlocalhostには届かんだろうて。。。

Mailetの作成

ようやく、やりたかったことを始められます。 簡単なMailetを作成します。
package hoge;

import java.util.*;

import javax.mail.*;
import javax.mail.internet.*;

import org.apache.mailet.*;


public class HelloMailet extends GenericMailet{

  /**
   * @see org.apache.mailet.Mailet#service(Mail)
   */
  public void service(Mail mail) throws MessagingException {

    System.out.println("called HelloMailet...");

    try{    
      MimeMessage message = mail.getMessage();
    
      System.out.println("headers=");
      Enumeration enum = message.getAllHeaderLines();
      while(enum.hasMoreElements()){
        System.out.println(enum.nextElement());
      }

      Address[] address = message.getFrom();
      sendMail(address);

    }catch(Exception e){
      e.printStackTrace();
    }

  }


  /**
   * to宛にメール送信
   */
  private void sendMail(Address[] to) throws MessagingException{

    Properties prop = new Properties();
    prop.setProperty("mail.from", "result@localhost");
    prop.setProperty("mail.smtp.host", "localhost");

    MimeMessage message = new MimeMessage(Session.getDefaultInstance(prop));
    message.setFrom(new InternetAddress("result@localhsot"));
    message.setRecipients(Message.RecipientType.TO, to);

    String enc = "ISO-2022-JP";
    message.setSubject("はろー", enc);
    message.setText("届いたよ", enc);
    Transport.send(message);
  }
}
やってることは、受信メールのヘッダ一覧を表示し、到着確認メールを返信するってだけです。詳細の解説はおこがましすぎて出来ません (JavaMailさわったのも初めてに近く、きっとおかしなことをしてそうです)。

Mailetの登録

先ほど作ったMailetを登録します。

作成したクラスをJamesが認識できる場所におきます。
クラスをjarにして、apps/james/libに置きます。

設定ファイルでMailetを登録します。
apps/james/conf/config.xmlが設定ファイルです。
まず、クラスを含むパッケージを登録します。 例ではhogeパッケージだったので、hogeを登録します。

80行目付近
<mailetpackages>
  <mailetpackage>org.apache.james.transport.mailets</mailetpackage>
  <mailetpackage>hoge</mailetpackage>
</mailetpackages>
次にHelloMailetを登録します。 以下では、あて先ユーザーがpuuだったときに、 HelloMailetを呼び出します (条件の例はDocumentationのConfigrationに書いています)。

160行目付近
<processor name="transport">
<!-- Is the recipient is for a local account, deliver it locally -->

  <mailet match="UserIs=puu" class="hoge.HelloMailet">
  </mailet>

  <mailet match="RecipientIsLocal" class="LocalDelivery">
  </mailet>
Jamesを起動し、puu@localhostにメールを出します。 うまくいくと、コンソールに以下のように出力されます。
James 2.0a3-cvs
Started POP3 Server plain:110
Started SMTP Server plain:25
Started NNTP Server plain:119
called HelloMailet...
headers=
Return-Path: 
Received: from localhost ([127.0.0.1])
          by miyax (JAMES SMTP Server 2.0a3-cvs) with SMTP ID 680
          for ;
          Sat, 7 Sep 2002 02:17:06 +0900
Date: Sat, 07 Sep 2002 02:17:06 +0900
From: hoge 
Subject: aaa
To: puu@localhost
MIME-Version: 1.0
Content-Type: text/plain; charset=us-ascii
Content-Transfer-Encoding: 7bit
X-Mailer: TuruKame 1.98 (WinNT,501)
Message-Id: 
でもって、返信メールも届いてますね?

それから

せっかくBフレッツをつないだことだし、 インターネットにつながるJamesメールサーバを立ててみようかな。 そして、写メールバトラーでも作ってみようかと思いましたが、 実現するのはいつの日か。

参考



(2002/9/7)
もどる