- PR -

メーラで送信OKだがJavaMailで送信に失敗する。SMTPに接続できない。

投稿者投稿内容
Hyde
ベテラン
会議室デビュー日: 2005/05/18
投稿数: 63
投稿日時: 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
投稿数: 6
投稿日時: 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/17
投稿数: 6
投稿日時: 2008-07-18 10:27
度々すいません。未記入です。

引用:

Hydeさんの書き込み (2008-07-17 13:12) より:
以下のJavaMailを利用した場合
LAN内部のメールサーバ以外のクライアントからは、送信OKなのに
LAN外部のクライアントからは送信ができないで状態です。



LAN内部からJavaMailで接続できるんですよね?
すいません。見落としていました。

引用:

■サーバ側のログには、何も吐き出されません。
tail -f /var/log/maillog

…つまりSMTPに接続すらできていないようです。



smtp before popで送信できないのではと、思いましたが
ログに出力されないということなので別問題のようですね。

変な回答をして、申し訳ありませんでした。


[ メッセージ編集済み 編集者: 未記入 編集日時 2008-07-18 10:29 ]
Hyde
ベテラン
会議室デビュー日: 2005/05/18
投稿数: 63
投稿日時: 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();
mio
ぬし
会議室デビュー日: 2005/08/25
投稿数: 734
お住まい・勤務地: 神奈川県
投稿日時: 2008-07-18 12:32
hidetarou.selfip.comとやらの25番ポートが空いてないだけなのでは…。
Hyde
ベテラン
会議室デビュー日: 2005/05/18
投稿数: 63
投稿日時: 2008-07-18 12:37
mio さま

コメントありがとうございます。
残念ながら、ポート周りは対応済みです。

DNSは詳しくないですが、内部と外部で差があるのだから、そこらへんかとは思うのですが、普通のメーラでは内部、外部問わず、送受信成功しているのです。

未記入
会議室デビュー日: 2008/07/17
投稿数: 6
投稿日時: 2008-07-18 13:15
識者がいれば一発で解決できるかもしれないが、
こういう場合は、問題を切り分けていった方がいいようです。

今のところ、私もmioさんと同じ意見です。

すでにやっているかもしれないが、
LAN外部から、telnetでhidetarou.selfip.comの25番ポートの疎通確認をする。
だめな場合は、ipaddressでも確認をやってみる。
どちらも、だめな場合は、25番ポートが空いていないのではないでしょうか?

それと、LAN外部から送受信成功しているメーラの入っているPCとJavaMailで
送受信しているPCは同一でしょうか?

送受信成功しているメーラの設定と、JavaMailで送信する場合の設定は同一で
しょうか?(特にポートについて)

以上です。
mio
ぬし
会議室デビュー日: 2005/08/25
投稿数: 734
お住まい・勤務地: 神奈川県
投稿日時: 2008-07-18 13:23
エラー内容が「Unknown host」や「Destination Unreachable」ではなく、
「Connection refused」なので、そのホスト自体には到達してますよね。
外からメーラでつないだときは、実は587番ポートだったりとか。

内側と外側とでポートの開放を変えることはできますし。

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