2012-12-12 17 views
6

Próbuję wysłać wiadomość e-mail z mojego programu przez połączenie TLS. Oto mój kodPoczta Java przez TLS

final String username = "XXXXXX"; 
    final String password = "XXXXX"; 
    Properties props = new Properties(); 
    props.put("mail.transport.protocol", "smtp"); 
    props.put("mail.smtp.starttls.enable","true"); 
    props.put("mail.smtp.auth", "true"); 
    props.put("mail.smtp.host", "mail.xxxx.com"); 
    props.put("mail.smtp.port", "587"); 

    Session session = Session.getInstance(props, 
      new javax.mail.Authenticator() { 
       protected PasswordAuthentication getPasswordAuthentication() { 
        return new PasswordAuthentication(username, password); 
       } 
      }); 

    Message message = new MimeMessage(session); 
    message.setFrom(new InternetAddress("[email protected]")); 
    message.setRecipients(Message.RecipientType.TO, 
     InternetAddress.parse(to_address)); 
    message.setSubject("Test Mail"); 
    message.setText("TestMail "); 
    Transport.send(message) 

Moja brama email ma Ustawienia poczty przychodzącej z włączonym SSL i TLS wychodzące z portu 587. włączona jestem w stanie skonfigurować tego ustawienia w programie Outlook i to działa dobrze. Ale w moim programie java jest napisane "Odmowa połączenia". Pomoc doceniona!

Pracował Wreszcie:

użyłem programu InstallCert importować certicate wygenerować plik jssecacerts i dodałem plik do mojego/jre/lib/security/ścieżki. tutaj jest mój kod roboczych

properties.put("mail.transport.protocol", "smtp"); 
    properties.put("mail.smtp.host", "XXXXXX"); 
    properties.put("mail.smtp.port", "465"); 
    properties.put("mail.smtp.ssl.enable", true); 
    properties.put("mail.smtp.socketFactory.port", "465"); 
    properties.put("mail.smtp.socketFactory.class","javax.net.ssl.SSLSocketFactory"); 
    properties.put("mail.smtp.socketFactory.fallback", "false"); 
    properties.put("mail.smtp.quitwait", "false"); 
    properties.put("mail.smtp.auth", "true"); 
+0

W takim przypadku wystarczy zaimportować certyfikat z określonego serwera? Mam ten sam problem, ale moja aplikacja musi wysyłać pocztę z dowolnego konta skonfigurowanego przez użytkownika, kod działa z Outlookiem, Google i Yahoo, ale dla konta z smtp zimbra.xxxxxx.net nie działa z powodu tego certyfikatu . –

Odpowiedz

4

Trzeba użyć protokołu smtps zamiast smtp

props.put("mail.transport.protocol", "smtps"); 
props.put("mail.smtps.starttls.enable","true"); 
props.put("mail.smtps.auth", "true"); 
props.put("mail.smtps.host", "mail.xxxx.com"); 
props.put("mail.smtps.port", "587"); 

Można także spróbować ustawić protokół specificly dla rfc822, pomaga to kilka razy

props.put("mail.transport.protocol.rfc822", "smtps"); 
+0

Próbowałem ten sam problem ... tym razem próbuje połączyć "localhost", port 25. To jest mój dziennik debugowania .... DEBUG SMTP: próbuje połączyć się z hostem "localhost", port 25, isSSL false – Surez

+0

Jakiej wersji javamailu używasz? –

+0

Java Mail 1.4.5 – Surez