12

javax.mailを使用してSMTPメッセージを送信するJavaプログラムがあります。このプログラムはLinuxボックスで正常に動作します。事前に強調したいと思います。Windows 7 x64ボックスでこれと同じコードを試してみると、次のエラーが発生します。

send failed, exception: javax.mail.MessagingException: Could not connect to SMTP host:     smtp.west.cox.net, port: 25;
nested exception is:  java.net.SocketException: Network is unreachable: connect

コードは次のとおりです。

Session session = Session.getInstance(props, null);
MimeMessage msg = new MimeMessage(session);
msg.setFrom();
msg.setRecipients(Message.RecipientType.TO, props.getProperty("mail.to", "me@mine.com"));
msg.setSubject(mySubject);
msg.setSentDate(new Date());
msg.setContent(sBuf.toString(), "text/html");
Transport.send(msg);

このプログラムは、ほとんどすべてにデフォルトを使用しています。同じネットワーク上の別のボックスで正常に動作します。通常のメールクライアントで使用しているのと同じ設定を使用しており、正常に機能します。このWindowsボックスには、SMTPをブロックしているものがありますが、Java専用です。

Symantec(Norton)360をインストールしています。オフにしても違いはありませんが、セーフモード(ほとんどすべてが無効になります)で再起動すると、プログラムが正常に機能し、メールを送信できます。

要約すると、次のようになります。

  1. プログラムコードは機能します。
  2. 設定は正しいです。
  3. SMTPはWindowsメールで機能し、このWindowsマシンのJavaでのみブロックされます。

Before I spend another day tearing things apart and uninstalling / reinstalling, I wondered if anyone had any advice on fixing this?

4

6 に答える 6

51

この問題は、JavaのIPv4/IPv6設定が原因です。JavaはデフォルトでIPv6を使用しようとしますが(?)、私のISPはIPV6をサポートしていません。ただし、Windows7ボックスではデフォルトで有効になっています。

同様の動作が発生している場合は、[コントロールパネル/ネットワークおよびインターネット/ネットワーク接続]に移動し、インターネット接続を右クリックして、コンテキストメニューから[ステータス]を選択することで、これを確認できます。[ステータス]ダイアログには、次のような2行が表示されます。

IPv4 Connectivity:  Internet
IPv6 Connectivity:  No Internet access

これが問題の根本です。JavaはIPv6を優先しますが、これを使用してインターネットに接続することはできません。

これを修正するには、次のいずれか(または両方)を実行します。

  1. Windows7ボックスでIPv6を無効にします。
  2. 次のコマンドラインオプションを使用してJavaプログラムを起動します。

    -Djava.net.preferIPv4Stack=true
    

これらのいずれかを実行すると、問題が解決します。

于 2012-12-28T16:14:35.240 に答える
12

Java1.6からJava1.7へのアップグレード中に同じ問題が発生しました。この問題は、Java1.7がデフォルトでIPv6を使用しているために発生しました。これを修正するには、以下の例のようにJavaオプションを追加する必要があります。

Windowscmdで次のコマンドを実行するだけです。

setx _JAVA_OPTIONS -Djava.net.preferIPv4Stack=true
于 2013-08-09T05:26:16.600 に答える
3

Synantec EP12.1RU5で問題が修正されました。

Symantec Endpoint Protectionは、Javaメールクライアントから送信されたメールをブロックします

修正ID:3399185

症状:SymantecEndpointProtectionのインターネット電子メール自動保護機能がJavaメールクライアントから送信されたSMTP電子メールをブロックします。

解決策:インターネット電子メール自動保護ドライバーを更新して、IPv4にマップされたIPv6アドレスを処理できるようにしました。

于 2014-12-01T12:23:13.987 に答える
2

私も同じ問題に直面していました。基本的にはJava7の問題で、JVM引数「-Djava.net.preferIPv4Stack = true」を渡すだけで、問題が解消されました。

于 2013-10-02T16:40:35.617 に答える
1

この問題は解決されましたが、一部のWindowsファイアウォールは(純粋にポート番号自体ではなく)実行可能ファイル名に基づいてポートへのアクセスをブロック/許可するため、1つのプログラム(Outlookなど)で終わる可能性があることを指摘しておくと便利です。 )許可され、別の(Javaなど)がブロックされます。

于 2015-02-26T21:39:38.837 に答える
-1

同様の問題が発生しましたが、jdk 1.7をインストールすると、奇妙なことにすべてがjdk1.6で正常に機能していました。例外が発生しました。何が原因なのかしら!

IPV4引数を追加した後、正常に機能しています。ありがとうございます。

于 2014-06-06T20:06:28.837 に答える