2012-12-28 12 views
12

私は、javax.mailを使ってSMTPメッセージを送信するJavaプログラムを持っています。このプログラムは、Linuxの箱でうまく動作します。私はそれを前もって強調したいと思います。私は私のWindows 7のx64ボックスに、この同じコードをしようとすると、私はこのエラーを取得:Java Mailの謎 - SMTPブロック?

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); 

このプログラムは、ほとんどすべてのデフォルト値を使用しています。

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 

ここでは、コードです。同じネットワーク上の別のボックスで正常に動作します。通常のメールクライアントと同じ設定を使用しますが、正常に動作します。このWindowsボックスにはSMTPをブロックしているものがありますが、Javaの場合のみです。

Symantec(Norton)360がインストールされています。これをオフにしても差はありませんが、Safe Mode(ほとんどの機能を無効にします)に再起動すると、プログラムは正常に動作しメールを送信できます。

  1. プログラムコードの動作:要約するので

    、。

  2. 設定が正しいです。
  3. SMTPはWindowsメール用に動作し、このWindowsマシン上でのみJava用にブロックされます。

私が別の日を過ごしてアンインストール/再インストールする前に、誰かがこれを修正するためのアドバイスを持っていたのだろうかと思いましたか?

+0

コマンドプロンプトから 'telnet smtp.west.cox.net 25'を実行するとどうなりますか? –

+0

どのバージョンのWindowsですか? Windowsファイアウォールはアクティブですか? – Perception

+0

あなたのコードは安全なモードで動作するので、あなたのコードではありません。私はJavaがWindowsのファイアウォール経由で許可されていないと思う。 –

答えて

49

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

同様の現象が発生している場合は、「コントロールパネル/ネットワークとインターネット/ネットワーク接続」でインターネット接続を右クリックし、コンテキストメニューから「ステータス」を選択して確認できます。 JavaがIPv6を好む、それはインターネットに接続するために使用することはできません - これは問題の根本である

IPv4 Connectivity: Internet 
IPv6 Connectivity: No Internet access 

:ステータスダイアログは次のような2行を表示します。この問題を解決するには

、これらのもののいずれか1つ(または両方)を行います。あなたのWindows 7ボックスに

  1. IPv6を無効にします。
  2. は、このコマンドラインオプションを使用して、Javaプログラムを起動し

    -Djava.net.preferIPv4Stack=true 
    

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

+0

この説明をお寄せいただきありがとうございます。 stackoverflowの誰かが、サーバのIPv4アドレスではなく、メール/ ExchangeサーバのIPv6アドレスをホストとして使用できると主張しました。上記の問題を解決するかどうかはわかりません。 – armyofda12mnkeys

+0

これは本当にキアスの答えです、私は壁に頭を叩いていました!もし私ができるなら、私はあなたに最高100票を与えるだろう。 –

+0

@BaileyS - ありがとう!私は助けられてうれしいです。 :) – user1071914

11

私は、Java 1.6から1.7にアップグレードする際に同じ問題がありました。 Java 1.7がデフォルトでIPv6を使用しているため、問題が発生しました。 これを修正するには、下記の例のようにJava Optionを追加する必要があります。

だけで、WindowsのCMD上で次のコマンドを実行します。

**setx _JAVA_OPTIONS -Djava.net.preferIPv4Stack=true** 
+0

それは魅力のように動作してくれてありがとう。 – Som

+0

星は何ですか? – azerafati

2

私も同じ問題に直面していた、基本的にはそれだけでJVM引数に渡して、Javaの7問題でした「-Djava.net.preferIPv4Stack = true」を私は問題から取り除かれました。

+0

コメントなどの短い回答を追加してください – MichaC

0

私は似たような問題を抱えていましたが、奇妙なことに、jdk 1.6をインストールするとすべてがうまくいきました。例外はあります。私はこれの理由が何であるのだろうかと思います!

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

3

Synantec EP 12.1 RU5は問題を修正します。

Symantec Endpoint Protection blocks email sent by Java mail client

Fix ID: 3399185

Symptom: The Internet Email Auto-Protect feature of Symantec Endpoint Protection blocks SMTP email sent by a Java mail client.

Solution: Updated the Internet Email Auto-Protect driver to allow processing of IPv4-mapped IPv6 addresses.

1

、この問題が解決されているが:まだいくつかのWindowsファイアウォールのブロック/実行ファイル名(というよりも、純粋にポート番号自体)に基づいてポートへのアクセスが許可されていることを指摘することが有用であるかもしれない - あなたが終了することができますので、 1つのプログラム(Outlookなど)が許可され、別のプログラム(Javaなど)がブロックされます。