Отправка электронной почты из Java EJB без сохранения состояния (Java EE-6) - PullRequest
4 голосов
/ 08 марта 2011

Я хочу отправить электронное письмо с использованием EJB, но единственное, что я получаю взамен в этом исключении:

java.lang.RuntimeException: javax.mail.AuthenticationFailedException: failed to connect, no password specified?

Вот так выглядит мой EJB:

@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) {
    // OUR EMAIL SETTINGS
    String host = "smtp.gmail.com";// Gmail
    int port = 465;
    String serviceUsername = "xxxxxxx@gmail.com";
    String servicePassword = "xxxxxxx";// Our Gmail password

    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");

    // Destination of the email
    String to = destinationEmail;
    String from = "xxxxxxx@gmail.com";

    // Creating a javax.Session with the our properties
    Session session = Session.getInstance(props);

    try {
        Message message = new MimeMessage(session);
        // From: is our service
        message.setFrom(new InternetAddress(from));
        // To: destination given
        message.setRecipients(Message.RecipientType.TO,
                InternetAddress.parse(to));
        message.setSubject("Comfirm your account");
        // Instead of simple text, a .html template should be added here!
        message.setText("Welcome....... ");

        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);
    }

}

}

Я не знаю, почему все время говорят, что пароль не указан? SSLSocketFactory как-то связан с этим? Нужно ли мне где-нибудь вызывать метод getPasswordAuthenticion () или все, что мне нужно, - это вызвать второй метод из моего управляемого компонента?

Ответы [ 2 ]

9 голосов
/ 08 марта 2011

Я не знаю, почему ваш код не работает, но вы можете взглянуть на это:

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

Здесь показан альтернативный способ настройки электронной почты.в Java EE, который, я думаю, работает намного лучше.Сведения о соединении настраиваются на уровне контейнера, так же как и соединение с базой данных, управляемое контейнером.

1 голос
/ 08 марта 2011

Читайте о SPF и DKIM.

Трудно понять, что здесь происходит, так как ваш код составляет только половину необходимой информации. Реальная проблема, вероятно, заключается в том, что ваш код не соответствует вашей среде, а SPF и DKIM часто являются причиной того, что подключение к любому общедоступному SMTP-серверу и отправка электронной почты не работают.

По крайней мере, прочитав немного о SPF и DKIM, вы сможете узнать, является ли это проблемой в вашем случае, или это не проблема в вашем случае.

...