Domanda

Ho trovato molte altre domande su SO riguardanti l'API JavaMail e l'invio di posta attraverso un server SMTP, ma nessuna di queste ha discusso usando la sicurezza TLS. Sto cercando di utilizzare JavaMail per inviare aggiornamenti di stato a me stesso tramite il mio server di posta SMTP di lavoro, ma richiede TLS e non riesco a trovare online alcun esempio su come utilizzare JavaMail per accedere a un server SMTP che richiede la crittografia TLS. Qualcuno può aiutare con questo?

È stato utile?

Soluzione

Nel nostro prodotto è presente un codice di notifica che utilizza TLS per inviare la posta, se disponibile.

Dovrai impostare le proprietà di Java Mail. Hai solo bisogno di quello TLS ma potresti aver bisogno di SSL se il tuo server SMTP utilizza SSL.

Properties props = new Properties();
props.put("mail.smtp.starttls.enable","true");
props.put("mail.smtp.auth", "true");  // If you need to authenticate
// Use the following if you need SSL
props.put("mail.smtp.socketFactory.port", d_port);
props.put("mail.smtp.socketFactory.class", "javax.net.ssl.SSLSocketFactory");
props.put("mail.smtp.socketFactory.fallback", "false");

È quindi possibile passarlo a una sessione JavaMail oa qualsiasi altro istante di sessione come Session.getDefaultInstance (props) .

Altri suggerimenti

Buon post, la linea

props.put("mail.smtp.socketFactory.class", "javax.net.ssl.SSLSocketFactory");

è obbligatorio se il server SMTP utilizza Autenticazione SSL , come fa il server SMTP GMail. Tuttavia, se il server utilizza Autenticazione in testo normale su TLS , non dovrebbe essere presente, poiché Java Mail si lamenterà del fatto che la connessione iniziale è in chiaro.

Assicurati anche di utilizzare l'ultima versione di Java Mail. Recentemente ho usato alcuni vecchi barattoli di Java Mail di un progetto precedente e non sono riuscito a far funzionare il codice, poiché il processo di accesso non andava a buon fine. Dopo aver eseguito l'aggiornamento all'ultima versione di Java Mail, il motivo dell'errore è diventato chiaro: era una javax.net.ssl.SSLHandshakeException, che non era stata generata nella vecchia versione della libreria.

Le impostazioni dell'esempio sopra non funzionavano per il server che stavo usando ( authsmtp.com ) . Ho continuato a ricevere questo errore:

javax.net.ssl.SSLException: Unrecognized SSL message, plaintext connection?

Ho rimosso le impostazioni mail.smtp.socketFactory e tutto ha funzionato. Le impostazioni finali erano queste (l'autenticazione SMTP non è stata utilizzata e ho impostato la porta altrove):

java.util.Properties props = new java.util.Properties();
props.put("mail.smtp.starttls.enable", "true");

Usa semplicemente il seguente codice. È davvero utile per inviare e-mail tramite Java e funziona:

import java.util.*;
import javax.activation.CommandMap;
import javax.activation.MailcapCommandMap;
import javax.mail.*;
import javax.mail.Provider;
import javax.mail.internet.*;

public class Main {

    public static void main(String[] args) {
            final String username="your@gmail.com";
            final String password="password";
            Properties prop=new Properties();
            prop.put("mail.smtp.auth", "true");
            prop.put("mail.smtp.host", "smtp.gmail.com");
            prop.put("mail.smtp.port", "587");
            prop.put("mail.smtp.starttls.enable", "true");

            Session session = Session.getDefaultInstance(prop,
          new javax.mail.Authenticator() {
            protected PasswordAuthentication getPasswordAuthentication() {
                return new PasswordAuthentication(username, password);
          }
        });
          try {
                 String body="Dear Renish Khunt Welcome";
                 String htmlBody = "<strong>This is an HTML Message</strong>";
                 String textBody = "This is a Text Message.";
         Message message = new MimeMessage(session);
         message.setFrom(new InternetAddress("your@gmail.com"));
                 message.setRecipients(Message.RecipientType.TO,InternetAddress.parse("receiver@gmail.com"));
        message.setSubject("Testing Subject");
        MailcapCommandMap mc = (MailcapCommandMap) CommandMap.getDefaultCommandMap();
        mc.addMailcap("text/html;; x-java-content-handler=com.sun.mail.handlers.text_html");
        mc.addMailcap("text/xml;; x-java-content-handler=com.sun.mail.handlers.text_xml");
        mc.addMailcap("text/plain;; x-java-content-handler=com.sun.mail.handlers.text_plain");
        mc.addMailcap("multipart/*;; x-java-content-handler=com.sun.mail.handlers.multipart_mixed");
        mc.addMailcap("message/rfc822;; x-java-content-handler=com.sun.mail.handlers.message_rfc822");
        CommandMap.setDefaultCommandMap(mc);
            message.setText(htmlBody);
                        message.setContent(textBody, "text/html");
            Transport.send(message);

            System.out.println("Done");

        } catch (MessagingException e) {
            e.printStackTrace();
        }

    }

}

Con Simple Java Mail 5.0.0 (simplejavamail.org) è molto semplice e la biblioteca si occuperà di tutte le proprietà della sessione per te.

Ecco un esempio che utilizza i server SMTP di Google:

Email email = EmailBuilder.startingBlank()
        .from("lollypop", "lol.pop@somemail.com")
        .to("C.Cane", "candycane@candyshop.org")
        .withSubject("hey")
        .withPlainText("We should meet up!")
        .withHTMLText("<b>We should meet up!</b>")
        .buildEmail();

MailerBuilder.withSMTPServer("smtp.gmail.com", 25, "user", "pass", SMTP_TLS)
        .buildMailer()
        .sendMail(email);

MailerBuilder.withSMTPServer("smtp.gmail.com", 587, "user", "pass", SMTP_TLS)
        .buildMailer()
        .sendMail(email);

MailerBuilder.withSMTPServer("smtp.gmail.com", 465, "user", "pass", SMTP_SSL)
        .buildMailer()
        .sendMail(email);

Se hai attivato l'accesso a due fattori, devi generare una password specifica per l'applicazione dal tuo account Google.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top