2011-04-08 18 views
19

JavaMail especifica un conjunto de propiedades que se pueden establecer para configurar una conexión SMTP. Para usar STARTTLS es necesario establecer la siguiente propiedadPropiedades smtp de JavaMail (para STARTTLS)

mail.smtp.starttls.enable=true 

¿Dónde puedo especificar el nombre de usuario/contraseña para usar el servicio SMTP? ¿Es suficiente para especificar el:

mail.smtp.user=me 
mail.smtp.password=secret 

O tengo que explícitamente Entre usando el:

transport.connect(server, userName, password) 

Sí, ya intentado hacer esto y parece que es necesario conectarse a través de transporte .conectar(..). Pero si es así, ¿para qué son las propiedades de paso de mail.smtp.user &? ¿No son suficientes para usar smtp con starttls?

Respuesta

5

Tienes que subclase autenticador y crear un objeto PasswordAuthentication para la sesión junto con las propiedades env para iniciar sesión

Session session = Session.getDefaultInstance(props, new javax.mail.Authenticator() { 

    protected PasswordAuthentication getPasswordAuthentication() { 
     return new PasswordAuthentication("user-name", "user-password"); 
    } 
    }); 

de nombre de usuario es a veces Identificación del correo electrónico completa para algunos servidores como Gmail. Espero que esto ayude.

22

Aquí es mi método sendEmail que está utilizando SMTP de Gmail (JavaMail) con STARTTLS

public void sendEmail(String body, String subject, String recipient) throws MessagingException, 
      UnsupportedEncodingException { 
     Properties mailProps = new Properties(); 
     mailProps.put("mail.smtp.from", from); 
     mailProps.put("mail.smtp.host", smtpHost); 
     mailProps.put("mail.smtp.port", port); 
     mailProps.put("mail.smtp.auth", true); 
     mailProps.put("mail.smtp.socketFactory.port", port); 
     mailProps.put("mail.smtp.socketFactory.class", "javax.net.ssl.SSLSocketFactory"); 
     mailProps.put("mail.smtp.socketFactory.fallback", "false"); 
     mailProps.put("mail.smtp.starttls.enable", "true"); 

     Session mailSession = Session.getDefaultInstance(mailProps, new Authenticator() { 

      @Override 
      protected PasswordAuthentication getPasswordAuthentication() { 
       return new PasswordAuthentication(login, password); 
      } 

     }); 

     MimeMessage message = new MimeMessage(mailSession); 
     message.setFrom(new InternetAddress(from)); 
     String[] emails = { recipient }; 
     InternetAddress dests[] = new InternetAddress[emails.length]; 
     for (int i = 0; i < emails.length; i++) { 
      dests[i] = new InternetAddress(emails[i].trim().toLowerCase()); 
     } 
     message.setRecipients(Message.RecipientType.TO, dests); 
     message.setSubject(subject, "UTF-8"); 
     Multipart mp = new MimeMultipart(); 
     MimeBodyPart mbp = new MimeBodyPart(); 
     mbp.setContent(body, "text/html;charset=utf-8"); 
     mp.addBodyPart(mbp); 
     message.setContent(mp); 
     message.setSentDate(new java.util.Date()); 

     Transport.send(message); 
    } 
+0

Hola. ¿Dónde colocas el nombre de usuario y la contraseña reales? – masb

+1

En el método getPasswordAuthentication() de la clase Authenticator –

+5

Hm, cuando configuro "... socketFactory.class", parece que usa SSL sobre SMTP en lugar de StartTLS y obtengo un "mensaje SSL no reconocido, conexión de texto sin formato". excepción. – Stroboskop

4

Se puede especificar el usuario como

[email protected] 

(o mail.smtp.user si no se utiliza mail.transport.protocol=smtps) en las propiedades que usas para la sesión.

AFAIK, no puede proporcionar la contraseña. Pero ciertamente puede ponerlo en los accesorios y recuperarlo usted mismo. O consígalo de alguna otra forma, p. al preguntar al usuario.

Cuando lo tiene, hay dos formas de suministrarlo a la sesión. El más simple es usar

Transport tr = session.getTransport(); 
tr.connect(null, password); 
tr.sendMessage(message, message.getRecipients()); 

O, como se señaló, puede utilizar un autenticador. Pero luego se ignora al usuario de los puntales y se debe pasar explícitamente al PasswordAuthentication. Si lo haces, entonces tu recompensa es que puedes usar el Transport.send estático.

4

usted tiene que proporcionar un autenticador cuando se crea la sesión

Authenticator authenticator = new PasswordAuthentication("username", "password"); 
Session session = Session.getInstance(properties, authenticator); 

entonces utilizar la sesión para enviar su mensaje (omitiendo el try/catch, por razones de brevedad):

SMTPTransport tr = (SMTPTransport) session.getTransport("smtps"); 
tr.connect(); 
tr.sendMessage(mimeMessage, mimeMessage.getAllRecipients()); 
+0

Según lo establecido en las [Preguntas frecuentes de JavaMail] (https://javaee.github.io/javamail/FAQ.html#commonmistakes), el uso del Authenticator es opcional y generalmente desordenado. – MauganRa

1

Uso Simple Java Mail que debe ser sencillo:

Email email = new Email(); 

email.setFromAddress("lollypop", "[email protected]"); 
email.addRecipient("C.Cane", "[email protected]", RecipientType.TO); 
email.setText("We should meet up!"); 
email.setTextHTML("<b>We should meet up!</b>"); 
email.setSubject("hey"); 

new Mailer("smtp.gmail.com", 25, "your user", "your password", TransportStrategy.SMTP_TLS).sendMail(email); 
new Mailer("smtp.gmail.com", 587, "your user", "your password", TransportStrategy.SMTP_TLS).sendMail(email); 
new Mailer("smtp.gmail.com", 465, "your user", "your password", TransportStrategy.SMTP_SSL).sendMail(email); 

Si tiene a su vez de dos factores de inicio de sesión ed on, debe generar un application specific password desde su cuenta de Google.


Si aún desea hacerlo usted mismo, la biblioteca code behind this es muy simple. En él se establecen las propiedades específicas de la sesión en función de la cual se aprobó TransportStrategy (normal, SSL o TLS) y utiliza un Authenticator para realizar la autenticación:

"mail.transport.protocol" : "smtp" 
"mail.smtp.starttls.enable" : "true" 
"mail.smtp.host" : host 
"mail.smtp.port" : port 
"mail.smtp.username" : username 
"mail.smtp.auth" : "true" 

Y

return Session.getInstance(props, new Authenticator() { 
    @Override 
    protected PasswordAuthentication getPasswordAuthentication() { 
     return new PasswordAuthentication(username, password); 
    } 
}); 
Cuestiones relacionadas