nekop's blog

OpenShift / JBoss / WildFly / Infinispanの中の人 http://twitter.com/nekop

JBoss AS 7でJavaMailを利用してメールを送る

JBoss Advent Calendar 2011の8日目のエントリです。コメントでJBoss AS 7でJavaMailを利用してメールを送る方法が知りたいというリクエストをもらったので20分で簡単なアプリを書きました。そのうち10分近くはURLにsessionをsessoinとtypoしててハマっていました。typoは永遠の課題です。あとJavaMailでメール送るコードのサンプルぐぐったり。

プロジェクトは以下に置いてあります。

https://github.com/nekop/as7-mailsessiondemo/

メール送るCDIのBean

https://github.com/nekop/as7-mailsessiondemo/blob/master/src/main/java/jp/programmers/as7/mailsessiondemo/MailBean.java

package jp.programmers.as7.mailsessiondemo;

import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.MimeMessage;
import javax.mail.internet.InternetAddress;
import javax.mail.Message;
import javax.inject.Named;
import javax.annotation.Resource;

@Named
public class MailBean {
    @Resource(mappedName="java:jboss/mail/Default")
    Session session;

    public void sendTestMessage() throws Exception {
        String from = "nekop+from@localhost";
        String to = "nekop+to@localhost";
        MimeMessage message = new MimeMessage(session);
        message.setFrom(new InternetAddress(from));
        message.addRecipient(Message.RecipientType.TO, new InternetAddress(to));
        message.setSubject("Hello JavaMail");
        message.setText("Welcome to JavaMail");
        Transport.send(message);

        System.out.println("おくったよ!");
    }
    
}

メール送るコードもWeb上のドキュメントとかからコピーしただけなので自分では10行以下しか書いてません。

メソッド起動するJSF2の画面

https://github.com/nekop/as7-mailsessiondemo/blob/master/src/main/webapp/index.xhtml

<html xmlns="http://www.w3.org/1999/xhtml"
      xmlns:f="http://java.sun.com/jsf/core"      
      xmlns:h="http://java.sun.com/jsf/html">
<body>
  <h:form>
    <h:commandButton value="Send test email" action="#{mailBean.sendTestMessage}"></h:commandButton>
  </h:form>
</body>
</html>

あとは起動してwarコピーして http://localhost:8080/mailsessiondemo/ にあるボタンをポチッとな。

実行結果

Fedora 16上でmailコマンドで確認してます。モダンなLinuxとかだと特に何も設定しなくてもユーザ名だけ書き換えれば上のコードでローカルホストを利用してテストできるはずです。Windowsとかな人は試験用のメールサーバ作ったり見つけたりしてがんばってください。

$ mail
Heirloom Mail version 12.5 7/5/10.  Type ? for help.
"/var/spool/mail/nekop": 1 message 1 new
>N  1 nekop+from@localhost  Thu Dec  8 17:40  16/606   "Hello JavaMail"
& 1
Message  1:
From nekop+from@localhost.localdomain  Thu Dec  8 17:40:16 2011
Return-Path: <nekop+from@localhost.localdomain>
Date: Thu, 8 Dec 2011 17:40:16 +0900
From: nekop+from@localhost.localdomain
To: nekop+to@localhost.localdomain
Subject: Hello JavaMail
Content-Type: text/plain; charset=us-ascii
Status: R

Welcome to JavaMail
&

きちんと送信されていますね。

WEB-INF/web.xmlとbeans.xmlはJSF2とCDIを使うためのおまじないファイルなので同じようなプロジェクト書くときはそのままパクればいいと思います。

JBoss AS 7のjavax.mail.SessionのJNDI設定

さて、@Resourceインジェクションされているjavax.mail.Sessionですが、これはJBoss ASに昔からあるコンテナ側に接続情報を定義したものをJNDI経由で取得できる機能で、JBoss AS 7でも7.1で実装されています。7.0系では残念ながら使えません。

https://issues.jboss.org/browse/AS7-1177

設定は$JBOSS_HOME/standalone/configuration/standalone*.xmlに書いてあり、素のSMTPであればホスト名変更するくらいで動作するはずです。SSLはコードを見る限り現状では対応していないようです。

Java EE 6ばんざい。