- - PR -
Log4jのメール送信機能
投稿者 | 投稿内容 | ||||||||
---|---|---|---|---|---|---|---|---|---|
|
投稿日時: 2007-11-06 20:27
■環境
activation-1.0.jar javamail-1.3.2.jar log4j-1.2.15.jar struts1.3.8 上記環境で、アプリの開発をしており、今回Log4jのメール送信機能を使用することになり、導入作業をしました。 現在の状況としましては、全くメールが受信できていません。 今まで、log4jでDailyRollingFileAppenderを使用していたので、log4j自体は動いていると思います。 また、既にJavaMailを実装して動いている実績があるので、javamail-1.3.2.jarや、SMTPサーバー側、POPサーバー側の問題ではないと考えています。 詳しくご説明させていただくと、以下のような設定を行いました。 ・log4j.propertiesに以下の記述を追加する。 ## Mail Setting log4j.logger.com.mail=ALL, A log4j.appender.A =org.apache.log4j.net.SMTPAppender log4j.appender.A.BufferSize=6 log4j.appender.A.To=mail@.co.jp(日常使っているメールアドレス) log4j.appender.A.From=mail@.co.jp log4j.appender.A.Subject=log4jTest log4j.appender.A.SMTPHost=mail.co.jp(日常使用しているSMTPサーバー) log4j.appender.A.SmtpUsername=hogehoge(日常使っているユーザー) log4j.appender.A.SmtpPassword=hogehoge_PW(日常使っているパスワード) ・javaファイル内に以下のソースを追加 log.error("071106 hogehoge"); ⇒このソースの前にJavaMailを実装してあり、そちらのほうはメール送信がなされています。 下記サイトを参考にさせてもらって設定しているのですが、Exceptionなどは 発生しておりません。 原因が全く分からず、困っております。 エラーの探し方でも、気になる点でも何でもかまいませんので、どなたかご存知の方 がいらっしゃいましたら、教えてください。 よろしくお願いします。 http://www.techscore.com/tech/ApacheJakarta/Log4J/4.html | ||||||||
|
投稿日時: 2007-11-06 22:24
直接の回答ではありませんが、log4jのデバッグオプションを付けて動作させてみてはいかがでしょうか?
定義ファイルに「log4j.debug=true 」を加えてみてください。何かしら情報が出ると思います。 | ||||||||
|
投稿日時: 2007-11-07 00:01
プロパティファイルの記述方法はよくわからないのですが、XML 形式なら、
と記述し、
という感じでやってます。 | ||||||||
|
投稿日時: 2007-11-07 10:25
皆様、すばやい返信ありがとうございました。
>定義ファイルに「log4j.debug=true 」を加えてみてください。何かしら情報が出ると思います。 をうけて、実行したら、Exceptionが発生していました。 まだ、原因の特定までは出来ていませんが、取り急ぎ経過報告させていただきます。 詳細を下に載せさせていただきます。 NOOP 250 2.0.0 OK log4j:ERROR Error occured while sending e-mail notification. javax.mail.SendFailedException: Invalid Addresses; nested exception is: class com.sun.mail.smtp.SMTPAddressFailedException: 550 5.7.1 <hogehoge@hogehoge.co.jp>... Relaying denied. Proper authentication required. at com.sun.mail.smtp.SMTPTransport.rcptTo(SMTPTransport.java:1130) at com.sun.mail.smtp.SMTPTransport.sendMessage(SMTPTransport.java:525) at javax.mail.Transport.send0(Transport.java:151) at javax.mail.Transport.send(Transport.java:80) at org.apache.log4j.net.SMTPAppender.sendBuffer(SMTPAppender.java:330) at org.apache.log4j.net.SMTPAppender.append(SMTPAppender.java:215) at org.apache.log4j.AppenderSkeleton.doAppend(AppenderSkeleton.java:251) at org.apache.log4j.helpers.AppenderAttachableImpl.appendLoopOnAppenders(AppenderAttachableImpl.java:66) at org.apache.log4j.Category.callAppenders(Category.java:206) at org.apache.log4j.Category.forcedLog(Category.java:391) at org.apache.log4j.Category.log(Category.java:856) at org.apache.commons.logging.impl.Log4JLogger.error(Log4JLogger.java:181) at com.mail.MailSend.send(MailSend.java:141) at com.mail.MailSend.send(MailSend.java:55) at rclub.login.PasswordAction.perform(PasswordAction.java:111) at com.system.SystemAction.execute(SystemAction.java:122) at org.apache.struts.chain.commands.servlet.ExecuteAction.execute(ExecuteAction.java:58) at org.apache.struts.chain.commands.AbstractExecuteAction.execute(AbstractExecuteAction.java:67) at org.apache.struts.chain.commands.ActionCommandBase.execute(ActionCommandBase.java:51) at org.apache.commons.chain.impl.ChainBase.execute(ChainBase.java:190) at org.apache.commons.chain.generic.LookupCommand.execute(LookupCommand.java:304) at org.apache.commons.chain.impl.ChainBase.execute(ChainBase.java:190) at org.apache.struts.chain.ComposableRequestProcessor.process(ComposableRequestProcessor.java:283) at org.apache.struts.action.ActionServlet.process(ActionServlet.java:1913) at org.apache.struts.action.ActionServlet.doPost(ActionServlet.java:462) at javax.servlet.http.HttpServlet.service(HttpServlet.java:709) at javax.servlet.http.HttpServlet.service(HttpServlet.java:802) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:237) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:157) at filters.SetCharacterEncodingFilter.doFilter(SetCharacterEncodingFilter.java:169) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:186) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:157) at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:214) at org.apache.catalina.core.StandardValveContext.invokeNext(StandardValveContext.java:104) at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:520) at org.apache.catalina.core.StandardContextValve.invokeInternal(StandardContextValve.java:198) at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:152) at org.apache.catalina.core.StandardValveContext.invokeNext(StandardValveContext.java:104) at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:462) at org.apache.catalina.core.StandardValveContext.invokeNext(StandardValveContext.java:102) at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:520) at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:137) at org.apache.catalina.core.StandardValveContext.invokeNext(StandardValveContext.java:104) at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:118) at org.apache.catalina.core.StandardValveContext.invokeNext(StandardValveContext.java:102) at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:520) at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109) at org.apache.catalina.core.StandardValveContext.invokeNext(StandardValveContext.java:104) at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:520) at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:929) at org.apache.coyote.tomcat5.CoyoteAdapter.service(CoyoteAdapter.java:160) at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:799) at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.processConnection(Http11Protocol.java:705) at org.apache.tomcat.util.net.TcpWorkerThread.runIt(PoolTcpEndpoint.java:577) at org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.java:684) at java.lang.Thread.run(Thread.java:534) | ||||||||
|
投稿日時: 2007-11-07 14:44
> class com.sun.mail.smtp.SMTPAddressFailedException: 550 5.7.1 ><hogehoge@hogehoge.co.jp>... Relaying denied. Proper authentication required.
SMTPサーバがエラーコード550を返してますね。 「このままじゃリレーできないから、認証してから再度試してみてー」と 言っているみたいですね。POP before SMTPとかで認証する必要とかある かもしれないですよ。 | ||||||||
|
投稿日時: 2007-11-07 15:16
皆様の親切なアドバイスを受けて、解決いたしました。
小僧さんのおっしゃるように、認証エラーのようでしたので、 log4jの認証部分(SMTPAppender.java)を変更いたしました。 認証部分は、以下の掲示板を参考にし、ほぼ同じ改修を施しました。 http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=33526&forum=12&3 上記掲示板と重複になるところが多々ありますが、ちょっとだけ記載させてください。 ●props.put("mail.smtp.port", smtpPort); ●Authenticator auth = new Authenticator() { protected PasswordAuthentication getPasswordAuthentication() { return new PasswordAuthentication(smtpUsername, smtpPassword); } }; Session session = Session.getInstance(props, auth); → Session session = Session.getInstance(props, null); ●Transport認証用ユーザ名とパスワードを設定しコネクト xxx.connect(null,"xxxx(アカウント名)","xxxxxx(パスワード)"); ●send → sendMessageへの変更 xxx.sendMessage( mimeMessage,mimeMessage.getFrom()); ただ、お恥ずかしながら、動くようになりましたが、下記部分の解釈がいまいちわからず、自分の中で根本的な解決になっていないでいます。 Authenticator auth = new Authenticator() { protected PasswordAuthentication getPasswordAuthentication() { return new PasswordAuthentication(smtpUsername, smtpPassword); } }; 私の解釈は3割程度しかイメージできていないのですが、authで認証時に必要なオブジェクトを作成して、getInstanceでセットしているので、認証時(どこで?)には良きにはからってくれる(ここらへんが??です)と思っています。 ですが、実際、私がサイトを見ながら変更した方法だと、 Transport.connectで認証しています。 ここら辺が、いまいちイメージがつかないでいます。 JavaMailをアプリ内で実装した箇所(既存のもの)もTransport.connectで認証してありました。 Log4jでメールを送れたものの、消化不良な感じでいます。 不勉強ではありますが、APIや、サイト等の説明ではいまいち??です。 どなたか、ご説明いただけないでしょうか? 重ね重ねお手数ですが、どうぞよろしくお願いします。 | ||||||||
|
投稿日時: 2007-11-07 15:23
追記です。
今、書いた質問を読み返して、要点がぼやけているのでちょっと整理させてください。 ●改修前のLog4jで認証エラーが起こっていたが、なぜ認証エラーが発生したのか? ・参考サイトで行った設定のみでうまくいく場合と、今回の私が認証エラーを起こした違いとは? ●そもそも、認証はTransPort.connect以外で行えるのか?Log4jでは、どのようにして認証しているのか? というのが解ると、消化できそうな気がします。 自分でも調べるつもりですが、時間も限られていますのでアドバイスいただけると幸いです。 何度も申し訳ありません、よろしくお願いします。 | ||||||||
|
投稿日時: 2007-11-07 17:07
改修前 メール送信を実行している。 改修後 メール送信処理でSMTP認証をする、っていう指定と認証情報をセットしてからメール送信を実行している。 ということを質問しているわけではない?
connect 時に認証するので他ではたぶんできないんじゃないかな。 Log4j は必要な設定をして、「メール送信!」ってやっているだけ。 認証やメールサーバとの会話などのメール処理は javax.mail の中でやっている。 |