私はJava javax.mailを使用してSMTPメッセージを送信するプログラムを持っています。このプログラムは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", "[email protected]"));
msg.setSubject(mySubject);
msg.setSentDate(new Date());
msg.setContent(sBuf.toString(), "text/html");
Transport.send(msg);
このプログラムは、ほとんどすべてにデフォルトを使用しています。同じネットワーク上の別のボックスで正常に動作します。通常のメールクライアントで使用しているのと同じ設定を使用しますが、これは正常に機能します。このWindowsボックスには、SMTPをブロックしているものがありますが、Java専用です。
Symantec(Norton)360をインストールしています。オフにしても違いはありませんが、セーフモード(ほとんどすべてが無効になります)で再起動すると、プログラムが正常に機能し、メールを送信できます。
要約すると、次のようになります。
別の日を費やして物事を分解し、アンインストール/再インストールする前に、誰かがこれを修正するためのアドバイスがあるかどうか疑問に思いました。
この問題は、JavaのIPv4/IPv6設定が原因です。 JavaはデフォルトでIPv6を使用しようとしますが(?)、私のISPはIPV6をサポートしていません。ただし、Windows7ボックスではデフォルトで有効になっています。
同様の動作が発生している場合は、[コントロールパネル/ネットワークおよびインターネット/ネットワーク接続]に移動し、インターネット接続を右クリックして、コンテキストメニューから[ステータス]を選択することで、これを確認できます。 [ステータス]ダイアログには、次のような2行が表示されます。
IPv4 Connectivity: Internet
IPv6 Connectivity: No Internet access
これが問題の根本です-Javaは、インターネットへの接続に使用できないIPv6を優先します。
これを修正するには、次のいずれか(または両方)を実行します。
このコマンドラインオプションを使用して、Javaプログラムを起動します:
-Djava.net.preferIPv4Stack=true
これらのいずれかを実行すると、問題が修正されます。
フォームJava 1.6からJava 1.7へのアップグレード中に同じ問題が発生しました。この問題は、Java 1.7がデフォルトでIPv6を使用しているために発生しました。これを修正するには、以下の例のようにJavaオプションを追加する必要があります。
Windowscmdで次のコマンドを実行するだけです。
setx _Java_OPTIONS -Djava.net.preferIPv4Stack=true
Synantec EP 12.1 RU5 問題を修正します。
Symantec Endpoint Protectionは、Javaメールクライアントから送信された電子メールをブロックします
修正ID:3399185
症状:Symantec Endpoint Protectionのインターネット電子メール自動保護機能は、Javaメールクライアントから送信されたSMTP電子メールをブロックします。
解決策:インターネット電子メール自動保護ドライバーを更新して、IPv4にマップされたIPv6アドレスを処理できるようにしました。
私も同じ問題に直面していました。基本的にはJava 7の問題で、JVM引数 "-Djava.net.preferIPv4Stack = true"を渡すだけで、問題を解決しました。
この問題は解決されましたが、一部のWindowsファイアウォールは(純粋にポート番号自体ではなく)実行可能ファイル名に基づいてポートへのアクセスをブロック/許可するため、1つのプログラム(Outlookなど)で終わる可能性があることを指摘しておくと便利です。 )許可され、別の(Javaなど)がブロックされます。
同様の問題が発生しましたが、jdk 1.7をインストールすると、奇妙なことにすべてがjdk1.6で正常に機能していました。例外が発生しました。何が原因なのかしら!
IPV4引数を追加した後、正常に動作しています。ありがとうございます。