2012-12-28 9 views
12

Mam program Java, który używa javax.mail do wysyłania wiadomości SMTP. Ten program działa dobrze na Linuksie, chcę to wcześniej podkreślić. Gdy próbuję tego samego kodu na moim Windows 7 x64 pole, dostaję ten błąd:Tajemnica Java Mail - SMTP zablokowany?

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 

Oto kod:

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

Ten program dość dużo używa domyślnych za wszystko. Działa dobrze na innym polu w tej samej sieci. Używa tych samych ustawień, których używam dla mojego zwykłego klienta pocztowego, co działa dobrze. Na tym pudełku systemu Windows jest coś, co blokuje SMTP, ale tylko dla Javy.

Mam zainstalowany program Symantec (Norton) 360. Wyłączenie go nie ma znaczenia, ale ponowne uruchomienie w trybie awaryjnym (który wyłącza prawie wszystko) pozwala programowi pracować i wysyłać pocztę dobrze.

Tak więc, aby podsumować:

  1. Kod programu działa.
  2. Ustawienia są prawidłowe.
  3. SMTP działa dla Poczty systemu Windows i jest blokowany tylko dla Javy na tym komputerze z systemem Windows.

Zanim spędzę kolejny dzień rozdzierając różne rzeczy i odinstalowując/ponownie instalując, zastanawiałem się, czy ktoś ma jakieś rady na temat naprawy?

+0

co się stanie, jeśli spróbujesz "telnet smtp.west.cox.net 25" z wiersza poleceń? –

+0

Jaką wersję systemu Windows? Czy Zapora systemu Windows jest aktywna? – Perception

+0

Ponieważ twój kod działa w trybie awaryjnym ... to nie jest twój kod. Podejrzewam, że Java nie była dozwolona przez zaporę systemu Windows. –

Odpowiedz

49

Problem wynika z ustawienia IPv4/IPv6 Java. Java próbuje domyślnie używać IPv6 (?), A mój dostawca usług internetowych nie obsługuje IPV6. Jest on jednak domyślnie włączony na moich polach Windows 7.

Jeśli masz podobne zachowanie, możesz to sprawdzić, przechodząc do "Panel sterowania/Połączenia sieciowe i internetowe/sieciowe", klikając prawym przyciskiem myszy połączenie internetowe i wybierając "Stan" z menu kontekstowego. Okno statusu wyświetla dwa wiersze podobne do tego:

IPv4 Connectivity: Internet 
IPv6 Connectivity: No Internet access 

To jest główny problem - Java preferuje IPv6, których nie można używać do łączenia się z internetem.

Aby rozwiązać ten problem, należy wykonać jeden (lub oba) z tych rzeczy:

  1. Wyłącz IPv6 w skrzynce systemu Windows 7.
  2. Uruchom program java za pomocą tej opcji wiersza poleceń:

    -Djava.net.preferIPv4Stack=true 
    

Doing albo jeden z nich będzie rozwiązać problem.

+0

Dzięki za wyjaśnienie, naprawię mój problem. Ktoś inny na stackoverflow twierdził, że mógłby używać adresu IPv6 swojego serwera poczty/serwera Exchange jako hosta zamiast adresu IPv4 serwera. ale nie jestem pewien, czy rozwiązuje problemy wymienione powyżej. – armyofda12mnkeys

+0

To naprawdę kicka odpowiedź, waliłem głową w ścianę! Dałbym ci 100 głosów w górę, gdybym mógł. –

+0

@BaileyS - dziękuję! Cieszę się, że mogłem pomóc. :) – user1071914

11

Miałem ten sam problem podczas aktualizacji java 1.6 do wersji 1.7 Java. Wystąpił problem, ponieważ java 1.7 domyślnie korzysta z IPv6. Aby to naprawić, musisz dodać opcję Java, jak na przykładzie poniżej.

Wystarczy uruchomić tę komendę cmd Windows:

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

dzięki temu działa jak urok. – Som

+0

czym są gwiazdy? – azerafati

2

Byłem też w obliczu tego samego problemu, w zasadzie była to kwestia Java 7, tylko przejazdem w JVM argument "-Djava.net.preferIPv4Stack = true" , pozbyłem się problemu.

+0

proszę dodać takie krótkie odpowiedzi jako komentarze – MichaC

0

Miałem podobny problem, ale o dziwo wszystko działało dobrze z jdk 1.6 po zainstalowaniu jdk 1.7 Dostałem wyjątek. Zastanawiam się, jaki może być tego powód!

Po dodaniu argumentu IPV4 działa dobrze. Dziękuję bardzo.

3

Synantec EP 12.1 RU5 rozwiązuje problem.

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

Chociaż ten problem jest rozwiązany: to może być jeszcze przydatny podkreślić, że niektóre blok systemu Windows Firewall/umożliwić dostęp do portów na podstawie nazwy pliku wykonywalnego (a nie tylko numer portu siebie) - tak można zakończyć z jednym programem (np. Outlook), a inne (np. Java) są blokowane.