JAVAMAIL:AUTH NTLM 失败

2024-01-28

我尝试使用微软交换服务器在本地网络中用java发送电子邮件

这是我的代码:

import java.io.UnsupportedEncodingException;
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.AddressException;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;


public class Main {


        public static void main(String[] args) {

            final String username = "[email protected] /cdn-cgi/l/email-protection";
            final String password = "password";

            Properties props = new Properties();
            props.put("mail.smtp.auth", "true");
            props.put("mail.debug", "true");
            props.put("mail.smtp.host", "exchange_host.MyDomain.com");
            props.put("mail.smtp.port", "25");
            props.put("mail.smtp.auth.mechanisms","NTLM");
            props.put("mail.smtp.auth.ntlm.domain","MyDomain");


            Session session = Session.getInstance(props,new MyAuthenticator(username,password));

            try {

                Message message = new MimeMessage(session);
                message.setFrom(new InternetAddress("[email protected] /cdn-cgi/l/email-protection"));
                message.setRecipients(Message.RecipientType.TO,
                    InternetAddress.parse("recipent_adresse"));
                message.setSubject("Testing Subject");
                message.setText("Dear Mail Crawler,"
                    + "\n\n No spam to my email, please!");

                Transport.send(message);

                System.out.println("Done");

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

这是我的验证器类:

import javax.mail.Authenticator;
import javax.mail.PasswordAuthentication;

public class MyAuthenticator extends Authenticator {

     String user;
     String pw;
     public MyAuthenticator (String username, String password)
     {
        super();
        this.user = username;
        this.pw = password;
     }
    public PasswordAuthentication getPasswordAuthentication()
    {
       return new PasswordAuthentication(user, pw);
    }

}

我使用 NTLM 机制,但收到此错误:

DEBUG: JavaMail version 1.4.7
DEBUG: successfully loaded resource: /META-INF/javamail.default.providers
DEBUG: Tables of loaded providers
DEBUG: Providers Listed By Class Name: {com.sun.mail.smtp.SMTPSSLTransport=javax.mail.Provider[TRANSPORT,smtps,com.sun.mail.smtp.SMTPSSLTransport,Oracle], com.sun.mail.smtp.SMTPTransport=javax.mail.Provider[TRANSPORT,smtp,com.sun.mail.smtp.SMTPTransport,Oracle], com.sun.mail.imap.IMAPSSLStore=javax.mail.Provider[STORE,imaps,com.sun.mail.imap.IMAPSSLStore,Oracle], com.sun.mail.pop3.POP3SSLStore=javax.mail.Provider[STORE,pop3s,com.sun.mail.pop3.POP3SSLStore,Oracle], com.sun.mail.imap.IMAPStore=javax.mail.Provider[STORE,imap,com.sun.mail.imap.IMAPStore,Oracle], com.sun.mail.pop3.POP3Store=javax.mail.Provider[STORE,pop3,com.sun.mail.pop3.POP3Store,Oracle]}
DEBUG: Providers Listed By Protocol: {imaps=javax.mail.Provider[STORE,imaps,com.sun.mail.imap.IMAPSSLStore,Oracle], imap=javax.mail.Provider[STORE,imap,com.sun.mail.imap.IMAPStore,Oracle], smtps=javax.mail.Provider[TRANSPORT,smtps,com.sun.mail.smtp.SMTPSSLTransport,Oracle], pop3=javax.mail.Provider[STORE,pop3,com.sun.mail.pop3.POP3Store,Oracle], pop3s=javax.mail.Provider[STORE,pop3s,com.sun.mail.pop3.POP3SSLStore,Oracle], smtp=javax.mail.Provider[TRANSPORT,smtp,com.sun.mail.smtp.SMTPTransport,Oracle]}
DEBUG: successfully loaded resource: /META-INF/javamail.default.address.map
DEBUG: getProvider() returning javax.mail.Provider[TRANSPORT,smtp,com.sun.mail.smtp.SMTPTransport,Oracle]
DEBUG SMTP: useEhlo true, useAuth true
DEBUG SMTP: useEhlo true, useAuth true
DEBUG SMTP: trying to connect to host "echange_server.MyDomain.com", port 25, isSSL false
220 echange_server.MyDomain.com Microsoft ESMTP MAIL Service ready at Mon, 30 Sep 2013 09:01:08 +0100
DEBUG SMTP: connected to host "echange_server.MyDomain.com", port: 25

EHLO host.MyDomain.com
250-echange_server.MyDomain.com Hello [xx.xx.xx.xx]
250-SIZE
250-PIPELINING
250-DSN
250-ENHANCEDSTATUSCODES
250-STARTTLS
250-X-ANONYMOUSTLS
250-AUTH NTLM
250-X-EXPS GSSAPI NTLM
250-8BITMIME
250-BINARYMIME
250-CHUNKING
250-XEXCH50
250-XRDST
250 XSHADOW
DEBUG SMTP: Found extension "SIZE", arg ""
DEBUG SMTP: Found extension "PIPELINING", arg ""
DEBUG SMTP: Found extension "DSN", arg ""
DEBUG SMTP: Found extension "ENHANCEDSTATUSCODES", arg ""
DEBUG SMTP: Found extension "STARTTLS", arg ""
DEBUG SMTP: Found extension "X-ANONYMOUSTLS", arg ""
DEBUG SMTP: Found extension "AUTH", arg "NTLM"
DEBUG SMTP: Found extension "X-EXPS", arg "GSSAPI NTLM"
DEBUG SMTP: Found extension "8BITMIME", arg ""
DEBUG SMTP: Found extension "BINARYMIME", arg ""
DEBUG SMTP: Found extension "CHUNKING", arg ""
DEBUG SMTP: Found extension "XEXCH50", arg ""
DEBUG SMTP: Found extension "XRDST", arg ""
DEBUG SMTP: Found extension "XSHADOW", arg ""
DEBUG SMTP: Attempt to authenticate using mechanisms: NTLM
DEBUG SMTP: AUTH NTLM failed

Exception in thread "main" java.lang.RuntimeException: javax.mail.AuthenticationFailedException: 250-exchange_host.MyDomain.com Hello [xx.xx.xx.xx]

    at testPakcage.Main.main(Main.java:51)
Caused by: javax.mail.AuthenticationFailedException: 250-exchange_host.MyDomain.com Hello [xx.xx.xx.xx]

请帮助我,我花了几天时间寻找解决方案,但我什么也没找到


我可以通过 NTLM 连接到我们的 Exchange 2010 服务器。

NTLM 使用您的 Windows 登录名和密码进行身份验证,而不是您的电子邮件地址和密码。

我做了以下更改:

1) 用户名​​应该是 Windows 登录名,而不是电子邮件地址。 NTLM 使用您的 Windows 凭据进行身份验证。

2) mail.smtp.auth.ntlm.domain 应该是您的 Windows 域 - 即如果您通常使用“MYDOMAIN\id12345”作为用户名登录到 Windows 计算机,则斜杠之前的部分。

更新的代码如下:

public class Main {
  public static void main(String[] args) {

    // *** CHANGED ***
    final String username = "id12345"; // ID you log into Windows with
    final String password = "MyWindowsPassword";

    Properties props = new Properties();
    props.put("mail.smtp.auth", "true");
    props.put("mail.debug", "true");

    props.put("mail.smtp.host", "exchangeserver.mydomain.com");
    props.put("mail.smtp.port", "25");
    props.put("mail.smtp.auth.mechanisms","NTLM");

    // *** CHANGED ***
    props.put("mail.smtp.auth.ntlm.domain","WINDOMAIN"); // Domain you log into Windows with


    Session session = Session.getInstance(props,new MyAuthenticator(username,password));

    try {

        Message message = new MimeMessage(session);
        message.setFrom(new InternetAddress("[email protected] /cdn-cgi/l/email-protection"));
        message.setRecipients(Message.RecipientType.TO,
                InternetAddress.parse("[email protected] /cdn-cgi/l/email-protection"));
        message.setSubject("Test email");
        message.setText("TEST EMAIL");

        Transport.send(message);

        System.out.println("Done");

    } catch (MessagingException e) {
        e.printStackTrace();
    }
  }


  public static class MyAuthenticator extends Authenticator {

    String user;
    String pw;
    public MyAuthenticator (String username, String password)
    {
        super();
        this.user = username;
        this.pw = password;
    }
    public PasswordAuthentication getPasswordAuthentication()
    {
        return new PasswordAuthentication(user, pw);
    }
  }
}

无论如何,您原来的帖子帮助我解决了我已经持续了几天的连接问题。

最后一点,您可能需要禁用/更改防病毒设置以允许通过端口 25 进行访问。

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

JAVAMAIL:AUTH NTLM 失败 的相关文章

  • 获取文件的锁

    我想在对特定文件开始 threo read 时获取文件上的锁定 以便其他应用程序无法读取已锁定的文件并希望在线程终止时释放锁定文件 您可以获得一个FileLock https docs oracle com javase 8 docs ap
  • 当路径的点超出视野时,Android Canvas 不会绘制路径

    我在绘制路径时遇到了 Android Canvas 的一些问题 我的情况是 我有一个相对布局工作 如地图视图 不使用 google api 或类似的东西 我必须在该视图上绘制一条路径 canvas drawPath polyPath bor
  • Base36 编码字符串?

    我一直在网上查找 但找不到解决此问题的方法 在 Python Ruby 或 Java 中 如何对以下字符串进行 Base 36 编码 nOrG9Eh0uyeilM8Nnu5pTywj3935kW 5 Ruby 以 36 为基数 s unpa
  • 如何使用 JAVA 代码以编程方式捕获线程转储?

    我想通过 java 代码生成线程转储 我尝试使用 ThreadMXBean 为此 但我没有以正确的格式获得线程转储 因为我们正在使用jstack命令 请任何人提供一些帮助 他们是否有其他方式获取线程转储 使用任何其他 API 我想要的线程转
  • 删除优先级队列的尾部元素

    如何删除优先级队列的尾部元素 我正在尝试使用优先级队列实现波束搜索 一旦优先级队列已满 我想删除最后一个元素 优先级最低的元素 Thanks 没有简单的方法 将元素从原始元素复制到新元素 最后一个除外 PriorityQueue remov
  • 您建议使用哪种压缩(GZIP 是最流行的)servlet 过滤器?

    我正在寻找一个用于大容量网络应用程序的 GZIP servlet 过滤器 我不想使用容器特定的选项 要求 能够压缩响应负载 XML Faster 已在大批量应用的生产中得到验证 应适当设置适当内容编码 跨容器移植 可选择解压缩请求 谢谢 我
  • Spring数据中的本机查询连接

    我有课 Entity public class User Id Long id String name ManyToMany List
  • Android蓝牙java.io.IOException:bt套接字已关闭,读取返回:-1

    我正在尝试编写一个代码 仅连接到运行 Android 5 0 KitKat 的设备上的 目前 唯一配对的设备 无论我尝试了多少方法 我仍然会收到此错误 这是我尝试过的最后一个代码 它似乎完成了我看到人们报告为成功的所有事情 有人能指出我做错
  • 是否可以从 servlet 内部以编程方式设置请求上下文路径?

    这是一个特殊情况 我陷入了处理 企业 网络应用程序的困境 企业应用程序正在调用request getContext 并将其与另一个字符串进行比较 我发现我可以使用 getServletContext getContextPath 获取 se
  • 如何使用正则表达式验证 1-99 范围?

    我需要验证一些用户输入 以确保输入的数字在 1 99 范围内 含 这些必须是整数 Integer 值 允许前面加 0 但可选 有效值 1 01 10 99 09 无效值 0 007 100 10 5 010 到目前为止 我已经制定了以下正则
  • 寻找局部最小值

    下面的代码正确地找到了数组的局部最大值 但未能找到局部最小值 我已经进行了网络搜索 以找到找到最小值的最佳方法 并且根据这些搜索 我认为我正在使用下面的正确方法 但是 在几天的时间里多次检查每一行之后 下面的代码中有一些我仍然没有看到的错误
  • 如何通过 Android 按钮单击运行单独的应用程序

    我尝试在 Android 应用程序中添加两个按钮 以从单独的两个应用程序订单系统和库存系统中选择一个应用程序 如图所示 我已将这两个应用程序实现为两个单独的 Android 项目 当我尝试运行此应用程序时 它会出现直到正确选择窗口 但是当按
  • 避免 Java 中的重复导入:继承导入?

    有没有办法 继承 导入 Example 常见枚举 public enum Constant ONE TWO THREE 使用此枚举的基类 public class Base protected void register Constant
  • 使用Java绘制维恩图

    我正在尝试根据给定的布尔方程绘制维恩图 例如 a AND b AND c我想在 Android 手机上执行此操作 因此我需要找到一种使用 Java 来执行此操作的方法 我找到了一个完美的小部件 它可以完成我在这方面寻找的一切布尔代数计算器
  • 如何从 Ant 启动聚合 jetty-server JAR?

    背景 免责声明 I have veryJava 经验很少 我们之前在 Ant 构建期间使用了 Jetty 6 的包装版本来处理按需静态内容 JS CSS 图像 HTML 因此我们可以使用 PhantomJS 针对 HTTP 托管环境运行单元
  • JMS 中的 MessageListener 和 Consumer 有什么区别?

    我是新来的JMS 据我了解Consumers能够从队列 主题中挑选消息 那么为什么你需要一个MessageListener因为Consumers会知道他们什么时候收到消息吗 这样的实际用途是什么MessageListener 编辑 来自Me
  • ECDH使用Android KeyStore生成私钥

    我正在尝试使用 Android KeyStore Provider 生成的私有文件在 Android 中实现 ECDH public byte ecdh PublicKey otherPubKey throws Exception try
  • Java 的 PriorityQueue 与最小堆有何不同?

    他们为什么命名PriorityQueue如果你不能插入优先级 它看起来与堆非常相似 有什么区别吗 如果没有区别那为什么叫它PriorityQueue而不是堆 默认的PriorityQueue是用Min Heap实现的 即栈顶元素是堆中最小的
  • 基于 Spring Boot 的测试中的上下文层次结构

    我的 Spring Boot 应用程序是这样启动的 new SpringApplicationBuilder sources ParentCtxConfig class child ChildFirstCtxConfig class sib
  • 即使调整大小,如何获得屏幕的精确中间位置

    好的 这个问题有两部分 当我做一个JFrame 并在其上画一些东西 即使我将宽度设置为 400 并使其在一个项目击中它时 当然 允许项目宽度 它会反弹回来 但由于某种原因 它总是偏离屏幕约 10 个像素 有没有办法解决这个问题 或者我只需要

随机推荐

  • 箭头键键入大写字母而不是移动光标

    我已经使用 homebrew 安装了最新的 vim 还从 google code 主页安装了 mac vim 在 mac vim 中一切正常 但是当我在 mac 的terminal app 中运行 vim 并进入插入模式时 我会得到 A B
  • 在文件和文件夹的名称中递归地填充 0

    我有一个文件夹 其中包含有关某个特定主题的视频讲座 它的结构如下 1 fol 1 file mp4 2 file mp4 3 file mp4 2 fol 10 file mp4 4 file mp4 5 file mp4 6 file m
  • 谷歌图表重绘/缩放窗口大小

    如何在窗口调整大小时重绘 调整谷歌折线图的大小 为了仅在窗口调整大小完成时重绘并避免多次触发 我认为最好创建一个事件 create trigger to resizeEnd event window resize function if t
  • Kestrel MaxRequestBodySize 上传文件超出限制

    我确实遇到了红隼的一个奇怪的问题 我无法上传超过 kestrel MaxRequestBodySize 的多个文件 预期的行为是抛出BadHttpRequestException当我尝试阅读时this Request Form Files
  • 使用 bash 脚本比较两个文件并打印详细的差异报告

    我在 Unix 系统上有 2 个大文件 每个文件有数千行和大约 80 列 我已根据一组唯一键对文件进行排序 以便我们始终比较相同的行 为了便于理解 我在这里只给出 3 行和 7 列 File 1 d report ref date 2021
  • Angular-Material 设置了只有月份和年份的日期选择器

    我正在使用角度 1 5 9 和角度材料设计 1 1 1 我想添加一个仅包含月份和年份的日期选择器 没有日期 它用于结帐表单中的信用卡到期字段 您可以设置md mode month 下面的工作演示
  • 在opencv上检测非闭合轮廓

    我正在做自动卡检测的计算机视觉项目 我需要将卡片与背景分开 我已经应用了精明的边缘检测 使用自动参数设置 opencv中Canny操作自动计算低阈值和高阈值 https stackoverflow com questions 4292249
  • 将 EJB 作为实例变量注入 servlet 是否安全?

    我们都知道 在 Web 层中 可能只存在给定 Servlet 的单个实例来服务多个请求 这可能会导致实例变量中的线程问题 我的问题是 使用 EJB 注释将 EJB 作为实例变量注入到 servlet 中是否安全 我最初的直觉是否定的 因为假
  • 规范化音频,如何将浮点数组转换为字节数组?

    大家好 我正在播放音频文件 我把它读作byte 然后我需要通过将值放入 1 1 范围内来标准化音频 然后我想将每个浮点值放入byte i 数组然后把它byte 返回到正在播放的音频播放器 我试过这个 byte data ar ReadDat
  • 本地网络上的可靠组播

    我正在使用 C 和 Qt 实现一个消息系统 经过深思熟虑 我确定多播或多播风格的技术最能解决我的问题 然而 我了解到UDP的不可靠性并认为这是不可接受的 我的要求如下 消息将以二进制序列化形式发送 从网络上的任何给定节点 我必须能够向其他节
  • 对于这个 Java ByteBuffer 的行为有解释吗?

    我需要将数值转换为字节数组 例如 要将 long 转换为字节数组 我有以下方法 public static byte longToBytes long l ByteBuffer buff ByteBuffer allocate 8 buff
  • 如何在c# RSA中使用私钥加密并使用公钥解密

    我找到了几种可以使用 Net RSA Provider 使用公钥加密消息并使用私钥解密的解决方案 但我想要的是用私钥加密并用公钥解密 我想将公钥存储在我的应用程序中 并使用私钥在我的开发计算机上加密许可证 将其发送到应用程序并让信息使用公钥
  • 如何再次覆盖/重用 Hadoop 作业的现有输出路径

    当我每天运行 Hadoop 作业时 我想覆盖 重用现有的输出目录 实际上输出目录将存储每天作业运行结果的汇总输出 如果我指定相同的输出目录 则会出现错误 输出目录已存在 如何绕过这个验证 在运行作业之前删除目录怎么样 您可以通过 shell
  • iPhone SDK - 如何以编程方式使用动画滚动 UITableView?

    如何使用动画将 UITableView 滚动到特定位置 目前我正在使用此代码跳转到一个位置 tableController gt viewDidLoad self tableView reloadData NSIndexPath index
  • Android Examer Monkey 开始随机播放音频文件

    我正在运行锻炼猴子来测试我的 Android 应用程序 作为我的应用程序的一部分 我播放给出单词发音的媒体文件 我已将这些文件放在 Android 音乐播放器无法读取的目录中 然而 锻炼猴子抛出了一些事件序列 这些事件序列似乎激活了音乐播放
  • 使用 gmail api 访问委托邮件文件夹

    假设有 电子邮件受保护 cdn cgi l email protection and 电子邮件受保护 cdn cgi l email protection Alice 已将她的帐户委托给 Bob 当我向 Bob 进行身份验证并尝试使用 RE
  • 针对 XP 的 Visual Studio 2012 编译 - 无效 win32 - v110_xp

    我有 Visual Studio 2012 update 4 和 Windows SDK 7 1 我选择 Visual Studio 2012 Windows XP v110 xp 工具包 并将包含目录更改为使用 WindowsSdkDir
  • 无法通过反射设置器设置字段值

    在使用 hibernate 和 MySQL 的 spring mvc 应用程序中 我收到一个错误 该错误似乎表明Name实体找不到设置器id的财产BaseEntity的超类Patient实体 我该如何解决这个错误 这是错误消息 Caused
  • 是否有必要为每个用例都包含登录信息?

    我将设计一个具有登录功能的系统 登录后 登录的用户可以执行几项操作 因此是否需要包括login用例由那几个用例组成 在大多数情况下 它只会让你的图表变得混乱 登录既不复杂 也不会给您带来太多附加值作为用例 在包含用例和描述的文本文档中 包含
  • JAVAMAIL:AUTH NTLM 失败

    我尝试使用微软交换服务器在本地网络中用java发送电子邮件 这是我的代码 import java io UnsupportedEncodingException import java util Properties import java