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
営業力を強化するメールマーケティング
株式会社ベリタス











