Ich möchte eine E-Mail über ein EJB senden, aber das einzige, was ich im Gegenzug bekomme, ist diese Ausnahme:
java.lang.RuntimeException: javax.mail.AuthenticationFailedException: failed to connect, no password specified?
So sieht mein EJB aus:
@Stateless(name = "ejbs/EmailServiceEJB")
public class EmailServiceEJB extends Authenticator implements IEmailServiceEJB {
public PasswordAuthentication getPasswordAuthentication() {
return new PasswordAuthentication("xxxxxxx@gmail.com",
"xxxxxxx");
}
public void sendAccountActivationLinkToBuyer(String destinationEmail,
String name) {
// UNSERE E-MAIL EINSTELLUNGEN
String host = "smtp.gmail.com";// Gmail
int port = 465;
String serviceUsername = "xxxxxxx@gmail.com";
String servicePassword = "xxxxxxx";// Unser Gmail Passwort
Properties props = new Properties();
props.put("mail.smtp.user", serviceUsername);
props.put("mail.smtp.host", host);
props.put("mail.smtp.port", port);
props.put("mail.smtp.starttls.enable", "true");
props.put("mail.smtp.debug", "true");
props.put("mail.smtp.auth", "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");
// Ziel der E-Mail
String to = destinationEmail;
String from = "xxxxxxx@gmail.com";
// Erstellen einer javax.Session mit unseren Eigenschaften
Session session = Session.getInstance(props);
try {
Message message = new MimeMessage(session);
// Von: ist unser Service
message.setFrom(new InternetAddress(from));
// An: das angegebene Ziel
message.setRecipients(Message.RecipientType.TO,
InternetAddress.parse(to));
message.setSubject("Bestätigen Sie Ihr Konto");
// Anstatt einfachem Text sollte hier ein .html-Template hinzugefügt werden!
message.setText("Willkommen....... ");
Transport transport = session.getTransport("smtp");
transport.connect(host, port, serviceUsername, servicePassword);
Transport.send(message, message.getAllRecipients());
transport.close();
} catch (MessagingException e) {
throw new RuntimeException(e);
}
}
}
Ich weiß nicht, warum es immer sagt, dass das Passwort nicht angegeben ist? Hat das SSLSocketFactory etwas damit zu tun? Muss ich die getPasswordAuthenticion()-Methode irgendwo aufrufen, oder reicht es aus, die zweite Methode aus meinem verwalteten Bean aufzurufen?