2012-10-15 25 views
17

Mam problem z uzyskaniem aplikacji do korzystania z interfejsu API JavaMail w celu wysyłania plików w sposób bardziej zautomatyzowany niż jesteśmy do tego przyzwyczajeni. Jestem bardzo nowy w Javie i NetBeans, ale programowałem w innych językach, więc proszę wybacz mi, jeśli wydaje mi się trochę zagubiony w Javie i lub NetBeans.JavaMail API do iMail - java.net.SocketException: Odmowa uprawnień: połącz

Wciąż otrzymuję ten błąd

java.net.SocketException: Permission denied: połączyć

gdy próbuje połączyć się z lokalnego serwera pocztowego. Połączyłem i wysłałem pocztę za pośrednictwem serwera SMTP Gmaila z tym samym kodem, zmieniając tylko nazwę użytkownika, hasło i port. Udało mi się również telnetować do naszego serwera i uzyskać odpowiedź 220 z portu 25. Mam również plik wsadowy, który działa i pomyślnie wysyła wiadomości e-mail za pośrednictwem naszego lokalnego serwera. Jakieś przemyślenia i pomysły, dlaczego nie mogę się połączyć przez JavaMail?

Oto kod, który wysyła wiadomość e-mail.

kod źródłowy:

public void sendEmail(String customerNumber, ArrayList fileList){ 
    String from = "xxxx"; 
    String username = "xxxx"; 
    String to = "xxxx"; 
    String host = "10.1.1.6"; 
    String pwd = "xxxx"; 
    String port = "25"; 

    Properties props = System.getProperties(); 
    props.put("mail.smtp.host", host); 
    props.put("mail.smtp.port", port); 
    props.put("mail.smtp.user", username); 
    props.put("mail.smtp.auth", "true"); 
    props.put("mail.smtp.starttls.enable", "true"); 
    props.put("mail.smtp.debug", "true"); 
    props.put("mail.smtp.socketFactory.port", port); 
    props.put("mail.smtp.socketFactory.class", "javax.net.ssl.SSLSocketFactory"); 
    props.put("mail.smtp.socketFactory.fallback", "false"); 

    Session session = Session.getInstance(props, null); 
    session.setDebug(true); 

    MimeMessage message = new MimeMessage(session); 
    try{ 
     message.setFrom(new InternetAddress(from)); 
     message.setRecipients(Message.RecipientType.TO, to); 
     message.setSubject("Electronic Invoices"); 
     BodyPart messageBodyPart = new MimeBodyPart(); 
     messageBodyPart.setText("Electronic Invoices"); 
     Multipart multipart = new MimeMultipart(); 
     multipart.addBodyPart(messageBodyPart); 
     for(int i = 0; i < fileList.size(); i++){ 
      messageBodyPart = new MimeBodyPart(); 
      String fileName = (String) fileList.get(i); 
      DataSource source = new FileDataSource(fileName); 
      messageBodyPart.setDataHandler(new DataHandler(source)); 
      messageBodyPart.setFileName(fileName); 
      multipart.addBodyPart(messageBodyPart); 
     } 
     message.setContent(multipart); 

     Transport tr; 
     tr = session.getTransport("smtp"); 
     tr.connect(host, username, pwd); 
     tr.sendMessage(message, message.getAllRecipients()); 
     jTextArea2.append("Mail Sent Successfully"); 
     tr.close(); 

    } catch(Exception e){ 
     jTextArea2.append("sendEmail()::" + System.getProperty("line.separator") + e + System.getProperty("line.separator")); 
     System.out.println(e.getMessage()); 
     System.out.println(e.getCause()); 
    } 
} 

Wyjście z dwóch sprawozdań wyjątek:

DEBUG: setDebug: JavaMail version 1.4.5 
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 "10.1.1.6", port 25, isSSL false 
Could not connect to SMTP host: 10.1.1.6, port: 25 
java.net.SocketException: Permission denied: connect 
+0

JDK 7? Sprawdź tego faceta http://stackoverflow.com/a/7478027/643500 –

+0

Dodałem plik -Djava.net.preferIPv4Stack = true do mojego pliku konfiguracyjnego NetBeans, ale nadal mam błąd. Nadal pozwala mi jednak wysyłać z konta Gmail. Dziękuję za szybką odpowiedź. – John

+1

To powinno przejść do opcji maszyny wirtualnej. Innym sposobem potwierdzenia, czy jest to ten sam problem, w Netbeans, kliknij prawym przyciskiem myszy na projekt> właściwości> Biblioteki i wybierz platformę JDK 6 Java (zainstaluj, jeśli go nie masz). Oczyść, zbuduj i spróbuj ponownie. To wyeliminuje ten problem jako problem. –

Odpowiedz

18

Dodaj -Djava.net.preferIPv4Stack=true do opcji VM. Innym sposobem potwierdzenia, czy jest to ten sam problem, w Netbeans, kliknij prawym przyciskiem myszy na projekt> właściwości> Biblioteki i wybierz platformę JDK 6 Java (zainstaluj, jeśli go nie masz). Oczyść, zbuduj i spróbuj ponownie. Pozwoli to wyeliminować ten problem jako problem

Credit https://stackoverflow.com/a/7478027/643500

1

W przypadku uproszczenia aplikacji wywołania (np CLI) używany w kodzie na początku:

System.setProperty("java.net.preferIPv4Stack", "true")

zakładając, że aplikacja będzie pracować ze starszym stosem sieci IPv4.