example - javamail ssl
Propiedades de smtp de JavaMail(para STARTTLS) (5)
JavaMail especifica un conjunto de propiedades que se pueden configurar para configurar una conexión SMTP. Para usar STARTTLS es necesario configurar la siguiente propiedad
mail.smtp.starttls.enable=true
¿Dónde especifico el nombre de usuario / contraseña para usar el servicio smtp? ¿Es suficiente especificar el:
mail.smtp.user=me
mail.smtp.password=secret
¿O tengo que iniciar sesión explícitamente utilizando:
transport.connect(server, userName, password)
Sí, ya intenté hacer esto y parece que es necesario conectarse utilizando transport.connect (..). Pero en caso afirmativo, ¿para qué son las propiedades mail.smtp.user y pass? ¿No son suficientes para usar smtp con starttls?
Aquí está mi método sendEmail que usa GMail smtp (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);
}
Debe crear un autenticador cuando cree la sesión.
Authenticator authenticator = new PasswordAuthentication("username", "password");
Session session = Session.getInstance(properties, authenticator);
luego utiliza la sesión para enviar su mensaje (omitiendo el try / catch, por brevedad):
SMTPTransport tr = (SMTPTransport) session.getTransport("smtps");
tr.connect();
tr.sendMessage(mimeMessage, mimeMessage.getAllRecipients());
Debe crear una subclase de Authenticator y crear un objeto PasswordAuthentication para Session 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");
}
});
nombre de usuario a veces es el identificador de correo electrónico completo para algunos servidores como gmail. Espero que esto ayude.
Puede especificar el usuario como
(o mail.smtp.user
si no usa mail.transport.protocol=smtps
) en las propiedades que usa para la sesión.
AFAIK, no puede proporcionar la contraseña. Pero ciertamente puedes ponerlo en los accesorios y recuperarlo tú mismo. O consígalo de alguna otra manera, por ejemplo, preguntando al usuario.
Cuando lo tenga, hay dos formas de suministrarlo a la sesión. La 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 el usuario de los accesorios y debe pasarlo explícitamente a PasswordAuthentication
. Si lo hace, entonces su recompensa es que puede usar Transport.send
estático.
Usando Simple Java Mail debería 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 activado el inicio de sesión de dos factores, debe generar una contraseña específica de la aplicación desde su cuenta de Google.
Si aún desea hacer esto usted mismo, el código detrás de esta biblioteca es muy simple. Establece propiedades específicas en la sesión dependiendo de qué TransportStrategy se pasó (plain, ssl o tls) y usa un autenticador 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);
}
});