- PR -

Log4jのメール送信機能

投稿者投稿内容
もも
ベテラン
会議室デビュー日: 2007/07/01
投稿数: 78
投稿日時: 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
GENZO
大ベテラン
会議室デビュー日: 2003/11/26
投稿数: 111
お住まい・勤務地: 名古屋
投稿日時: 2007-11-06 22:24
直接の回答ではありませんが、log4jのデバッグオプションを付けて動作させてみてはいかがでしょうか?
定義ファイルに「log4j.debug=true 」を加えてみてください。何かしら情報が出ると思います。
flatline
大ベテラン
会議室デビュー日: 2005/09/22
投稿数: 102
投稿日時: 2007-11-07 00:01
プロパティファイルの記述方法はよくわからないのですが、XML 形式なら、

コード:
<appender name="SMTP" class="org.apache.log4j.net.SMTPAppender">
    <param name="Threshold" value="ERROR" />
    <param name="BufferSize" value="1" />
    <param name="To" value="systemAdmin@hoge.co.jp" />
    <param name="From" value="systemAdmin@hoge.co.jp" />
    <param name="Subject" value="[○○システム ERROR]" />
    <param name="SMTPHost" value="smtp.hoge.co.jp" />
    <layout class="org.apache.log4j.PatternLayout">
    	<param name="ConversionPattern" value="%d %-5p [%t] %C{2} (%F:%L) - %m%n"/>
    </layout>
</appender>



と記述し、

コード:
<logger name="jp.co.hoge">
   	<level value="info" />
   	<appender-ref ref="console" />
   	<appender-ref ref="file" />
   	<appender-ref ref="SMTP" />
</logger>



という感じでやってます。
もも
ベテラン
会議室デビュー日: 2007/07/01
投稿数: 78
投稿日時: 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)
小僧
ぬし
会議室デビュー日: 2002/08/14
投稿数: 526
投稿日時: 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/07/01
投稿数: 78
投稿日時: 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/07/01
投稿数: 78
投稿日時: 2007-11-07 15:23
追記です。
今、書いた質問を読み返して、要点がぼやけているのでちょっと整理させてください。

●改修前のLog4jで認証エラーが起こっていたが、なぜ認証エラーが発生したのか?
 ・参考サイトで行った設定のみでうまくいく場合と、今回の私が認証エラーを起こした違いとは?
●そもそも、認証はTransPort.connect以外で行えるのか?Log4jでは、どのようにして認証しているのか?

というのが解ると、消化できそうな気がします。
自分でも調べるつもりですが、時間も限られていますのでアドバイスいただけると幸いです。
何度も申し訳ありません、よろしくお願いします。

ふーばー
大ベテラン
会議室デビュー日: 2003/06/05
投稿数: 163
投稿日時: 2007-11-07 17:07
引用:

ももさんの書き込み (2007-11-07 15:23) より:
●改修前のLog4jで認証エラーが起こっていたが、なぜ認証エラーが発生したのか?
 ・参考サイトで行った設定のみでうまくいく場合と、今回の私が認証エラーを起こした違いとは?



改修前
 メール送信を実行している。

改修後
 メール送信処理でSMTP認証をする、っていう指定と認証情報をセットしてからメール送信を実行している。

ということを質問しているわけではない?

引用:

●そもそも、認証はTransPort.connect以外で行えるのか?Log4jでは、どのようにして認証しているのか?



connect 時に認証するので他ではたぶんできないんじゃないかな。
Log4j は必要な設定をして、「メール送信!」ってやっているだけ。
認証やメールサーバとの会話などのメール処理は javax.mail の中でやっている。

スキルアップ/キャリアアップ(JOB@IT)