使用当前用户的凭据进行 javamail NTLM 身份验证

2024-04-28

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

我的目的是让我的客户端程序(在我公司网络中的 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 = "[email protected] /cdn-cgi/l/email-protection";
        String to = "[email protected] /cdn-cgi/l/email-protection";

        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)

我不确定是否有任何方法可以在没有用户名和密码的情况下执行此操作。也许您可以编写一些特定于 Windows 的代码,可以从本地身份验证服务检索用户名和密码,然后将其传递到 JavaMail。 JavaMail 本身当然没有办法做到这一点。

另外,您可能想要升级到 JavaMail 1.5.2,尽管它不能帮助您解决此问题。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用当前用户的凭据进行 javamail NTLM 身份验证 的相关文章

随机推荐

  • 当 UIImagePickerController 卸载我的控制器时如何避免数据丢失?

    我正在使用 UIImagePickerController 从相机拍照 但是 我发现我的调用控制器 显示在 UIImagePickercontroller 之前显示的控制器 随机被卸载 我记录了 viewDidUnload 它确实被调用了
  • python 字典中没有值

    是否可以检查 dict 中的无值 dict a None b 12345 c None My code for k v in d items if d k None print good else print Bad 执行上面的代码片段后打
  • 切换到 zsh 会破坏命令行中的轨道

    我最近刚刚转而使用 zsh 和 oh my zsh 但在使用 Rails 命令行工具时遇到了问题 以下是我执行的步骤以及收到的错误 我运行了github页面提供的curl命令 curl L https github com robbyrus
  • 处理连接重置错误

    我有一个关于在 Python3 中处理 ConnectionResetError 的问题 当我使用 urllib request Request 函数时 通常会发生这种情况 我想知道如果我们遇到这样的错误是否可以重做请求 例如 def ge
  • 在 Presto 中将 array(double) 转换为 varchar

    我正在尝试将 Array double 转换为 Presto 中的 varchar 样本值 99 0 98 0 99 0 95 0 99 0 88 0 90 0 79 0 90 0 56 0 90 0 90 0 92 0 90 0 93 0
  • XPath 语法错误:谓词无效

    我有一个像这样的 XML 文件 cat sample xml
  • 如何管理提交者的层次结构(如 Linux 内核开发)

    我是一个拥有 GitHub 存储库的项目的提交者 我有一个开发人员小组 他们无法读取或提交该存储库 我想设置一个他们可以提交的 git 服务器 它是 GitHub 存储库的克隆 当他们提交时 我会对其进行审查 有时进行编辑 然后推送到 Gi
  • 如何解释这个正则表达式 /[\W_]/g

    我的代码是 var result2 result replace W g replace replace 该代码有效 我得到了我需要完成的工作 但我不明白正则表达式如何 W g有效 但我找不到任何我理解的文档 g这是一个全局正则表达式 因此
  • Node JS 如何将图像和请求数据一起 POST 到另一个服务器/api

    我正在尝试将图像从 Node JS 应用程序发布到另一个 REST API 我在 Mongo DB 中有图像 作为二进制数组数据 由 Node JS 读取 然后应该发布到另一个 API 我面临的问题是如何将请求数据与图像一起发送 我有这个原
  • 在远程 Tomcat 上自动部署 Java 应用程序

    我希望能够自动将 Java 应用程序部署到 tomcat 服务器 现在的情况 正在 Eclipse 中开发 Java 项目 Tomcat 服务器在另一台机器上运行 提供该项目的 WAR 文件 我的目标 可以轻松编译项目并将其部署到远程 To
  • Excel.Application.SelectionChange 仅触发一次

    我只收到第一个事件通知 之后什么也没有发生 有任何想法吗 UPD 我发现了一件奇怪的事情 我的事件处理程序代码如下所示 var cell range Cells 1 1 var rangeName cell Address false fa
  • OnBackPressed 没有被调用?

    我已经覆盖了OnBackPressed在我的活动中运行 但它没有被调用 在其他活动中 它运行良好 这是我的方法 Override public void onBackPressed Log e back 1 UserPage getstat
  • 防止 sqlplus 截断列名,无需单独的列格式

    默认情况下 sqlplus 将列名截断为基础数据类型的长度 我们数据库中的许多列名称都以表名称为前缀 因此在截断时看起来相同 我需要在锁定的生产环境中向远程 DBA 指定 select 查询 并拖回假脱机结果以进行诊断 列太多 无法指定各个
  • 如何在 Swift 中正确测试 Core Data

    已经有很多关于此的主题 但我还没有找到适用于 Swift Xcode 6 2 的解决方案 为了在 Swift 中测试 Core Data 支持的类 我生成了新的托管对象上下文 然后将其注入到我的类中 Given let testManage
  • 从实例驻留在固定格式(数据库、MMF)的基类派生...如何安全?

    Note 我正在寻找有关正确搜索词的任何建议来阅读此类问题 对象关系映射 http en wikipedia org wiki Object relational mapping我想到了一个可以找到一些好的现有技术的地方 但我还没有看到任何
  • CALayer 不显示

    这是我第一次尝试使用 CALayer 构建成功并且没有报告错误 所以我认为我一定做了一些明显错误的事情 但该图层根本不显示 void viewDidLoad Get Reliant Magenta in amazingly verbose
  • 正则表达式:忽略大小写

    如何使以下正则表达式忽略大小写 它应该匹配所有正确的字符 但忽略它们是小写还是大写 G a b 假设你想要whole正则表达式忽略大小写 你应该寻找i flag http www regular expressions info modif
  • Windows 8 的 mvvmlight 中缺少 EventToCommand 行为 - 解决方法?

    问题确实说明了一切 我正在使用 MVVM Light 用 XAML C 编写一个 Windows 8 应用程序 我注意到 EventToCommand 功能尚未实现 有人可以建议对此有任何解决方法吗 thanks 您现在可以使用 Event
  • 使用带有二进制存档的 boost 序列化时出错

    我在读取时收到以下错误boost archive binary iarchive进入我的变量 test serialization 9285 0x11c62fdc0 malloc can t allocate region mach vm
  • 使用当前用户的凭据进行 javamail NTLM 身份验证

    如何将 JavaMail API 与 NTLM 身份验证结合使用到 Exchange 服务器 而无需指定用户名和密码 而是自动使用当前登录用户的凭据 单点登录 我的目的是让我的客户端程序 在我公司网络中的 Windows 计算机上运行 能够