【问题标题】:javamail NTLM authentication using credentials of current user使用当前用户凭据的 javamail NTLM 身份验证
【发布时间】:2014-05-13 11:35:38
【问题描述】:

如何使用 JavaMail API 与 Exchange 服务器的 NTLM 身份验证,而无需指定用户名和密码,而是自动使用当前登录用户的凭据? (“单点登录”)

我的目的是让我的客户端程序(在我公司网络中的 Windows 计算机上运行)能够发送电子邮件,而无需指定凭据,并且由于安全问题而不必允许网络中的计算机中继。 (最后我想用 log4j 的 SmtpAppender 结合系统属性覆盖来做到这一点,但我在下面创建了 SSCCE 来调试问题。)

如果我指定用户名和与之对应的有效 Windows 密码,我就能成功使用 NTLM 身份验证发送电子邮件:

import java.util.Properties;

import javax.mail.Message;
import javax.mail.MessagingException;
import javax.mail.PasswordAuthentication;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;

public class MailTest {

    public static void main(String[] args) {
        String from = "myusername@mydomain.nl";
        String to = "anotherusername@mydomain.nl";

        Properties props = new Properties();
        props.put("mail.smtp.auth", "true");
        props.put("mail.smtp.starttls.enable", "true");
        props.put("mail.smtp.host", "myserver.mydomain");
        props.put("mail.debug", "true");

        props.put("mail.smtp.auth.mechanisms", "NTLM");
        props.put("mail.smtp.auth.ntlm.domain", "mydomain");

        final String username = "myusername";
        final String password = "mypassword";
        Session session =
                Session.getInstance(props, new javax.mail.Authenticator() {
                    @Override
                    protected PasswordAuthentication getPasswordAuthentication() {
                        return new PasswordAuthentication(username, password);
                    }
                });

        try {
            Message message = new MimeMessage(session);
            message.setFrom(new InternetAddress(from));
            message.setRecipients(Message.RecipientType.TO,
                    InternetAddress.parse(to));
            message.setSubject("Testing!");
            message.setText("Hello world!");
            Transport.send(message);

            System.out.println("Sent message successfully");

        } catch (MessagingException e) {
            throw new RuntimeException(e);
        }
    }
}

当我使用空白密码时,javax.mail.Authentication 失败 FailedException: 535 5.7.3 身份验证不成功。

当我将代码替换为简单地创建会话时:

Session session = Session.getInstance(props);

然后抛出以下异常,我可以从调试输出中看到没有尝试连接到服务器:

Exception in thread "main" java.lang.RuntimeException: javax.mail.Authentication
FailedException: failed to connect, no password specified?
        at MailTest.main(MailTest.java:51)
Caused by: javax.mail.AuthenticationFailedException: failed to connect, no passw
ord specified?
        at javax.mail.Service.connect(Service.java:329)
        at javax.mail.Service.connect(Service.java:176)
        at javax.mail.Service.connect(Service.java:125)
        at javax.mail.Transport.send0(Transport.java:194)
        at javax.mail.Transport.send(Transport.java:124)

【问题讨论】:

  • 我正在使用 JavaMail 1.4.7

标签: java single-sign-on jakarta-mail ntlm


【解决方案1】:

如果没有用户名和密码,我不确定是否有任何方法可以做到这一点。可能您可以编写一些特定于 Windows 的代码,这些代码可以从本地身份验证服务中检索用户名和密码,然后将其传递给 JavaMail。 JavaMail 本身当然没有办法做到这一点。

此外,您可能希望升级到 JavaMail 1.5.2,尽管它不会帮助您解决这个问题。

【讨论】:

  • 也感谢您更新 JavaMail 的建议。我没有注意到更新,因为我使用了带有 groupId javax.mail 的 maven,它似乎已更改为 com.sun.mail
猜你喜欢
  • 1970-01-01
  • 2011-05-19
  • 1970-01-01
  • 2011-08-07
  • 2021-12-19
  • 1970-01-01
  • 1970-01-01
  • 2018-04-29
  • 2016-07-05
相关资源
最近更新 更多