• twitterフォローしてね♪
  • エイジアラボ
  • マーケ担当
  • システム担当
  • 経営者
  • 営業
  • 管理
  • ドラッカー
  • twitter

ホーム  > エイジアラボ  > プログラミング  > James Protocolsでつくるブラックホール
記事詳細
2011年10月03日(Mon)

James Protocolsでつくるブラックホール


Apache James Serverをおぼえていますか?
ずいぶんと長かった沈黙を破って大きく生まれ変わろうとしていますよ!

Javaで開発されたメールアプリケーションサーバであるJames Serverは、
開発中のバージョン3.0で、軽量コンテナに乗り換えて一気に現代的になりそうです。

生まれ変わったJames Server 3.0のリリースが楽しみです。

 


今日は、そのJamesのサブプロジェクトであるJames Protocolsについてのお話しです。

Jamesでは、機能ごとにサブプロジェクトに分かれて開発が進められていて、
サブプロジェクトの成果物の集合がJames Serverとしてリリースされるとも言えます。

James Protocolsは、そのサブプロジェクトのひとつであり、
SMTP等のメール関連のプロトコル実装をおこなっているプロジェクトです。

そして、そのプロトコルの実装にNettyが使われているところが今日のポイントです。

これまで、NettyでSMTPを実装したオープンソースソフトウェアがなかったので、
誰かやってくれないかと願ったり、あきらめて自分で実装したりしたものでした。

これをJames Protocolsでやってくれるのであれば利用しない手はありません!

 


以前の私の記事で、Nettyを使ってSMTPプロトコルを実装し、
パフォーマンス試験で使用するブラックホールサーバをつくって紹介しました。

そこで今回は、James Protocolsを使って、
さらにお手軽にブラックホールサーバをつくってみようと思います。

 


では、SMTPブラックホールサーバの概要です。

 

    ・  電子メールの受信サーバである。
    ・  受信した電子メールはそのまま破棄する。(ブラックホール状態)
    ・  受信したことがわかる最小限のログを出力する。
    ・  アクセス制限の機構は持たない。(LAN内で使うのでオフにする)

 

  ※注意:
      ここで紹介するサーバは、インターネット上に設置しないでください。
      アクセス制限がかかっていないため、
      オープンリレーのSMTPサーバと認識される可能性があり大変危険です。

 


使用するライブラリは、それぞれ以下のWebサイトからダウンロードできます。

James Protocolsは、リリース版のバージョン1.5ではなく開発版の1.6を使います。
どうやら、バージョン1.5から1.6にかけてパッケージの変更等があるようなので、
今後に活きるサンプルコードとするために開発版のバージョン1.6を使って紹介します。

    ・  https://repository.apache.org/content/repositories/snapshots/org/apache/james/protocols/
        → protocols-api-1.6-SNAPSHOT.jar
        → protocols-impl-1.6-SNAPSHOT.jar
        → protpcols-smtp-1.6-SNAPSHOT.jar

        ※バージョン1.6がリリースされた後はこちらから → http://james.apache.org/download.cgi

    ・  http://james.apache.org/download.cgi
        → apache-mailet-2.4.jar
        → apache-mailet-base-1.1.jar

    ・  http://www.oracle.com/technetwork/java/javamail/index.html
        → mail.jar

    ・  http://www.jboss.org/netty/downloads
        → netty-3.2.5.Final.jar

    ・  http://www.slf4j.org/download.html
        → slf4j-api-1.6.2.jar
        → slf4j-simple-1.6.2.jar

 


ソースコードは以下の2クラスです。

    ○SimpleBlackholeServer.java ファイル

 

package jp.co.azia.webcas.example.blackhole;

import java.net.InetSocketAddress;
import java.util.Arrays;

import org.apache.james.protocols.impl.NettyServer;
import org.apache.james.protocols.smtp.SMTPConfigurationImpl;
import org.apache.james.protocols.smtp.SMTPProtocol;
import org.apache.james.protocols.smtp.SMTPProtocolHandlerChain;

public class SimpleBlackholeServer {

    private static final String DEFAULT_BIND_HOSTNAME = "localhost";  // 0.0.0.0 for remote access
    private static final int DEFAULT_BIND_PORT = 10025;

    public static void main(String[] args) throws Exception {

        String bindHostname = DEFAULT_BIND_HOSTNAME;
        int bindPort = DEFAULT_BIND_PORT;

        SMTPConfigurationImpl config = new SMTPConfigurationImpl();

        SMTPProtocolHandlerChain chain = new SMTPProtocolHandlerChain();
        chain.addHook(new SimpleBlackholeHandler());

        NettyServer server = new NettyServer(new SMTPProtocol(chain, config));

        server.setListenAddresses(Arrays.asList(new InetSocketAddress(bindHostname, bindPort)));
        server.bind();
    }
}

 

    ○SimpleBlackholeHandler.java ファイル

 

package jp.co.azia.webcas.example.blackhole;

import org.apache.james.protocols.smtp.MailEnvelope;
import org.apache.james.protocols.smtp.SMTPSession;
import org.apache.james.protocols.smtp.hook.HookResult;
import org.apache.james.protocols.smtp.hook.HookReturnCode;
import org.apache.james.protocols.smtp.hook.SimpleHook;
import org.apache.mailet.MailAddress;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class SimpleBlackholeHandler extends SimpleHook {

    private static final Logger logger = LoggerFactory.getLogger(SimpleBlackholeHandler.class);

    @Override
    public HookResult doHelo(SMTPSession session, String helo) {
        return new HookResult(HookReturnCode.OK);
    }

    @Override
    public HookResult doMail(SMTPSession session, MailAddress sender) {
        return new HookResult(HookReturnCode.OK);
    }

    @Override
    public HookResult doRcpt(SMTPSession session, MailAddress sender, MailAddress rcpt) {
        logger.info("sender=" + sender.toString() + ", rcpt=" + rcpt.toString());
        return new HookResult(HookReturnCode.OK);
    }

    @Override
    public HookResult onMessage(SMTPSession session, MailEnvelope mail) {
        logger.info("Data received.");
        return new HookResult(HookReturnCode.OK);
    }
}

 


これらのソースコードをコンパイルして実行します。
実行するクラスは、SimpleBlackholeServerです。
すると、10025番ポートでサーバが起動します。

このサーバに対してクライアントからのSMTPリクエストがあると、
「MAIL FROM」と「RCPT TO」のリクエストがログに出力されます。
また、「DATA」の内容を受信し終えたときにもログが出力されます。

 


いかがですか?

ブラックホールサーバで終わらせるにはもったいないくらいの
パワフルなSMTPサーバが簡単にできました。

Hookを実装することで他にも様々な処理をおこなうことができますので、
あなたもJames Protocolsで遊んでみてはいかがでしょうか。

 

 

投稿者:友池 貴之

株式会社JIMOSデータベースを自在に活用してメール販促
株式会社JIMOS

株式会社JIMOS導入事例
既存顧客の購買促進のため、商品購入後のフォローアップメール、紙のキャンペーンDMのフォローメール、メルマガなど、さまざまなメール販促で売上UPを図っています!

株式会社ベリタス営業力を強化するメールマーケティング
株式会社ベリタス

株式会社ベリタス導入事例
営業支援ツールとして、お客様への情報提供にメール配信を活用。メール反応からアプローチする顧客を抽出したり、製品お問い合わせ窓口を設置したりして、お客様との関係構築に努めています。
資料請求で成功事例集プレゼント
当社のCRMパッケージ市場メール送信分野/メール配信パッケージ市場共にシェアNo.1のCRMシステムを資料請求していただいた方に導入事例集をもれなくプレゼントしております。→こちらからエイジアへのお問い合わせ
当社のメール配信システム、アンケートシステム、メール共有管理システムに関する「WEB CAS」のお問い合わせはこちらよりお気軽にご連絡下さい。
ご相談 0120-965-082

「James Protocolsでつくるブラックホール」はいかがでしたか?

記事はお楽しみいただけましたか?役に立つ情報でしたか?ぜひ他の場所で共有してみてください。

缶をクリックすると、いろいろなサイトにブックマークできます。

カテゴリ
タグクラウド
タグ :
トップページのタグクラウドやサイドバー、記事ごとのタグで関連する記事を斜め読みすることができます。
月間アーカイブ
TOPへ