- - PR -
メーラで送信OKだがJavaMailで送信に失敗する。SMTPに接続できない。
投稿者 | 投稿内容 | ||||||||
---|---|---|---|---|---|---|---|---|---|
|
投稿日時: 2008-07-17 13:12
CentOSでpostfix+dovecotによるメールサーバを構築し
SMTP-Auth認証を有効に設定しております。 メールサーバの設定は完了し ルータ内部、外部どちらも送受信ができるようになったことを OutLookExpressやthunderbirdなどのメーラにて確認したのですが、 以下のJavaMailを利用した場合 LAN内部のメールサーバ以外のクライアントからは、送信OKなのに LAN外部のクライアントからは送信ができないで状態です。 ■ソース抜粋 Properties props = System.getProperties(); props.put("mail.smtp.host", "hoge.com"); // SMTP before POP3対応 props.put("mail.smtp.auth","true"); // JavaMailのデバッグモード props.put("mail.debug", "true"); // ポートの設定 props.put("mail.smtp.port", String.valueOf("25")); // 接続するホスト名 props.put("mail.host","hoge.com"); Session sess = Session.getDefaultInstance(props, null); MimeMessage mmsg = new MimeMessage(sess); if(to != null && !to.trim().equals("")){ mmsg.addRecipient(Message.RecipientType.TO,new InternetAddress(to)); } if(cc != null && !cc.trim().equals("")){ mmsg.addRecipient(Message.RecipientType.CC,new InternetAddress(cc)); } if(bcc != null && !bcc.trim().equals("")){ mmsg.addRecipient(Message.RecipientType.BCC,new InternetAddress(bcc)); } mmsg.setFrom(new InternetAddress("hoge@hoge.com", "hogehoge","ISO-2022-JP")); mmsg.setSubject(subject,"ISO-2022-JP"); mmsg.setHeader("Content-Type", "text/plain"); mmsg.setSentDate(new Date()); mmsg.setText(mailtext +" ","ISO-2022-JP"); // Transport.send(mmsg); //transportの設定 Transport transport = sess.getTransport("smtp"); // 認証用ユーザ名とパスワードを設定しコネクト transport.connect(null,"hoge","hogepass"); //送信します transport.sendMessage( mmsg,mmsg.getAllRecipients()); //transportを閉じる transport.close(); ■クライアント側のエラーは以下のような出力です。 DEBUG: getProvider() returning javax.mail.Provider[TRANSPORT,smtp,com.sun.mail.smtp.SMTPTransport,Sun Microsystems, Inc] DEBUG SMTP: useEhlo true, useAuth true DEBUG SMTP: trying to connect to host "hidetarou.selfip.com", port 25, isSSL false javax.mail.MessagingException: Could not connect to SMTP host: hoge.com, port: 25; nested exception is: java.net.ConnectException: Connection refused: connect at com.sun.mail.smtp.SMTPTransport.openServer(SMTPTransport.java:1227) at com.sun.mail.smtp.SMTPTransport.protocolConnect(SMTPTransport.java:322) at javax.mail.Service.connect(Service.java:236) at javax.mail.Service.connect(Service.java:137) at tmp.mail.smp1.MailInfoBeans.sendMail(MailInfoBeans.java:71) at tmp.mail.smp1.MailController.doPost(MailController.java:36) at javax.servlet.http.HttpServlet.service(HttpServlet.java:710) at javax.servlet.http.HttpServlet.service(HttpServlet.java:803) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:269) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:188) at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:210) at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:174) at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127) at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:117) at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:108) at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:151) at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:870) at org.apache.coyote.http11.Http11BaseProtocol$Http11ConnectionHandler.processConnection(Http11BaseProtocol.java:665) at org.apache.tomcat.util.net.PoolTcpEndpoint.processSocket(PoolTcpEndpoint.java:528) at org.apache.tomcat.util.net.LeaderFollowerWorkerThread.runIt(LeaderFollowerWorkerThread.java:81) at org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.java:685) at java.lang.Thread.run(Unknown Source) ■サーバ側のログには、何も吐き出されません。 tail -f /var/log/maillog ... …つまりSMTPに接続すらできていないようです。 何かお気づきの方や、原因がわかる方がおりましたら、ご教授ください。 よろしくお願いいたします。 | ||||||||
|
投稿日時: 2008-07-17 15:40
初めまして。
JavaMailの事はよくわかりませんが、回答します。 SMTPで送信する前にPOP3サーバーに一度ログオン(接続)することが必要なのでは ないでしょうか? (自身はありませんが、ソースを見たところ、ないようなので) それと、 http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=45640&forum=10 の質問もあなたのものですよね。 そちらの方も同様の問題(メーラーでの送受信で初回にこける)だと思います。 メーラーの設定をMS-outlook2007の例で説明すると、送信サーバーの設定で 「メールを送信する前に受信メールサーバーにログオンする。」を有効にして 試してみてください。 他のメーラーにも同様の設定はあると思うので変更してみてください。 これで解決した場合は、そちらの方にもその旨書き込んでください。 以上です。 [ メッセージ編集済み 編集者: 未記入 編集日時 2008-07-17 15:46 ] [ メッセージ編集済み 編集者: 未記入 編集日時 2008-07-17 16:00 ] | ||||||||
|
投稿日時: 2008-07-18 10:27
度々すいません。未記入です。
LAN内部からJavaMailで接続できるんですよね? すいません。見落としていました。
smtp before popで送信できないのではと、思いましたが ログに出力されないということなので別問題のようですね。 変な回答をして、申し訳ありませんでした。 [ メッセージ編集済み 編集者: 未記入 編集日時 2008-07-18 10:29 ] | ||||||||
|
投稿日時: 2008-07-18 11:49
未記入さま
コメントありがとうございました。 ご指摘いただいた「POP before SMTPの対応」も組み合わせでいろいろ試してみました。 …ですが、結果はやはり同じです。 (その場合、もちろん先にPOP接続は成功するのですが、次のSMTP接続でやはりこけるのです。) Transport.send(mmsg); でやってみた場合も、 Transport transport = sess.getTransport("smtp"); // 認証用ユーザ名とパスワードを設定しコネクト transport.connect(null,MailInfo.MAIL_USER,MailInfo.MAIL_PASSWORD); //送信します transport.sendMessage( mmsg,mmsg.getAllRecipients()); //transportを閉じる transport.close(); でやった場合もNGです。 ■クライアント側ログ DEBUG: getProvider() returning javax.mail.Provider[STORE,pop3,com.sun.mail.pop3.POP3Store,Sun Microsy stems, Inc] DEBUG POP3: connecting to host "hidetarou.selfip.com", port 110, isSSL false S: +OK Dovecot ready. C: USER kenshuu S: +OK C: PASS kenshuu S: +OK Logged in. C: QUIT S: +OK Logging out. DEBUG: getProvider() returning javax.mail.Provider[TRANSPORT,smtp,com.sun.mail.smtp.SMTPTransport,Sun Microsystems, Inc] DEBUG SMTP: useEhlo true, useAuth true DEBUG SMTP: trying to connect to host "hidetarou.selfip.com", port 25, isSSL false javax.mail.MessagingException: Could not connect to SMTP host: hidetarou.selfip.com, port: 25; nested exception is: java.net.ConnectException: Connection refused: connect at com.sun.mail.smtp.SMTPTransport.openServer(SMTPTransport.java:1227) ■サーバ側ログ POP3での接続しかされていない… Jul 18 11:32:35 hidetarou dovecot: pop3-login: Login: user=<kenshuu>, method=PLAIN, rip=::ffff:124.32.207.226, lip=::ffff:192.168.1.40 Jul 18 11:32:35 hidetarou dovecot: POP3(kenshuu): Disconnected: Logged out top=0/0, retr=0/0, del=0/0, size=0 まあ、確かに、POP before SMTPの対応しなくても LAN内部のメールサーバ以外のクライアントからは、送信OKしているので なぞなんです… ■ちなみにソースは抜粋で、 Session sess = Session.getDefaultInstance(props, null); // add pop3 before smtp Store store = sess.getStore("pop3"); store.connect(MailInfo.MAIL_SMTPHOST, MailInfo.MAIL_USER,MailInfo.MAIL_PASSWORD); store.close(); MimeMessage mmsg = new MimeMessage(sess); ... Transport transport = sess.getTransport("smtp"); // 認証用ユーザ名とパスワードを設定しコネクト transport.connect(null,MailInfo.MAIL_USER,MailInfo.MAIL_PASSWORD); //送信します transport.sendMessage( mmsg,mmsg.getAllRecipients()); //transportを閉じる transport.close(); | ||||||||
|
投稿日時: 2008-07-18 12:32
hidetarou.selfip.comとやらの25番ポートが空いてないだけなのでは…。
| ||||||||
|
投稿日時: 2008-07-18 12:37
mio さま
コメントありがとうございます。 残念ながら、ポート周りは対応済みです。 DNSは詳しくないですが、内部と外部で差があるのだから、そこらへんかとは思うのですが、普通のメーラでは内部、外部問わず、送受信成功しているのです。 | ||||||||
|
投稿日時: 2008-07-18 13:15
識者がいれば一発で解決できるかもしれないが、
こういう場合は、問題を切り分けていった方がいいようです。 今のところ、私もmioさんと同じ意見です。 すでにやっているかもしれないが、 LAN外部から、telnetでhidetarou.selfip.comの25番ポートの疎通確認をする。 だめな場合は、ipaddressでも確認をやってみる。 どちらも、だめな場合は、25番ポートが空いていないのではないでしょうか? それと、LAN外部から送受信成功しているメーラの入っているPCとJavaMailで 送受信しているPCは同一でしょうか? 送受信成功しているメーラの設定と、JavaMailで送信する場合の設定は同一で しょうか?(特にポートについて) 以上です。 | ||||||||
|
投稿日時: 2008-07-18 13:23
エラー内容が「Unknown host」や「Destination Unreachable」ではなく、
「Connection refused」なので、そのホスト自体には到達してますよね。 外からメーラでつないだときは、実は587番ポートだったりとか。 内側と外側とでポートの開放を変えることはできますし。 |