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
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ばんざい。