【问题标题】:Sending email from a java stateless EJB (Java EE-6)从 Java 无状态 EJB (Java EE-6) 发送电子邮件
【发布时间】:2011-07-11 05:54:28
【问题描述】:

我想使用 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() 方法,还是只需要从我的托管 bean 调用第二种方法?

【问题讨论】:

  • 您使用的是 GlassFish 之类的应用服务器吗?

标签: java jakarta-ee glassfish ejb-3.0 jakarta-mail


【解决方案1】:

阅读 SPF 和 DKIM。

很难知道这里出了什么问题,因为您的代码只有所需信息的 1/2。真正的问题可能是您的代码不适合您的环境,而 SPF 和 DKIM 通常是连接到任何公共 SMTP 服务器并无法发送电子邮件的原因。

至少在阅读一些关于 SPF 和 DKIM 的信息后,您将能够知道这是否是您的问题,或者这不是您的问题。

【讨论】:

    【解决方案2】:

    我不知道您的代码为什么不起作用,但您可能想看看这个:

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

    它展示了在 Java EE 中配置电子邮件的另一种方法,我认为这种方法效果更好。连接详细信息在容器级别配置,就像容器管理的数据库连接一样。

    【讨论】:

    • 第二。当我询问应用程序服务器时,这就是我的想法。这绝对是要走的路。
    • 这是一个很好的答案 :) 我只用了 10 分钟就做到了,现在我的应用程序正在使用 gmail 帐户发送电子邮件,哇,我很惊讶它是多么容易:) 我喜欢 glassfish 呵呵...谢谢你们。
    猜你喜欢
    • 2016-03-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-03
    • 2023-03-27
    • 2012-01-26
    • 2016-03-20
    • 1970-01-01
    相关资源
    最近更新 更多