4 Stimmen

Senden einer E-Mail von einem Java Stateless EJB (Java EE-6)

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?

9voto

Mike Baranczak Punkte 8043

Ich weiß nicht, warum dein Code nicht funktioniert, aber du solltest dir vielleicht das hier ansehen:

http://spitballer.blogspot.com/2010/02/sending-email-via-glassfish-v3.html

Es zeigt eine alternative Methode zur Konfiguration von E-Mails in Java EE, die meiner Meinung nach viel besser funktioniert. Die Verbindungsdetails sind auf Container-Ebene konfiguriert, genauso wie eine containerverwaltete Datenbankverbindung.

1voto

Edwin Buck Punkte 67237

Lesen Sie mehr über SPF und DKIM.

Es ist schwer zu wissen, was hier schief läuft, da Ihr Code nur 1/2 der benötigten Informationen enthält. Das eigentliche Problem ist wahrscheinlich, dass Ihr Code nicht zu Ihrer Umgebung passt, und SPF und DKIM sind oft der Grund dafür, dass die Verbindung zu einem öffentlichen SMTP-Server und das Senden einer E-Mail nicht funktioniert.

Nachdem Sie zumindest ein wenig über SPF und DKIM gelesen haben, werden Sie wissen, ob es ein Problem in Ihrem Fall ist oder nicht.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X