Exchange server 为什么JavaMail to Exchange抛出MessaginException 530 5.7.1客户端未经身份验证?

Exchange server 为什么JavaMail to Exchange抛出MessaginException 530 5.7.1客户端未经身份验证?,exchange-server,jakarta-mail,Exchange Server,Jakarta Mail,我已经对此进行了一段时间的研究,并尝试了几种不同的属性组合,不断地得到这个错误。我们能够成功地发送电子邮件与其他smtp服务器(和不同的属性)没有问题,但Exchange将无法工作 关于此主题的其他答案提到,您需要1.4.3版或更高版本的JavaMail,因为Exchange服务器需要NTLM。我正在使用JavaMail 1.4.7。其他答案说Exchange默认情况下不支持SMTP 以下是最新代码: // this is inside a Junit String emailTo = "me@

我已经对此进行了一段时间的研究,并尝试了几种不同的属性组合,不断地得到这个错误。我们能够成功地发送电子邮件与其他smtp服务器(和不同的属性)没有问题,但Exchange将无法工作

关于此主题的其他答案提到,您需要1.4.3版或更高版本的JavaMail,因为Exchange服务器需要NTLM。我正在使用JavaMail 1.4.7。其他答案说Exchange默认情况下不支持SMTP

以下是最新代码:

// this is inside a Junit
String emailTo = "me@gmail.com";
String emailFrom = "me@mycompany.com";
String message = "testing exchange";
String host = "smtp.office365.com";
String user = "obfuscated";
String password = "obfuscated";

StringBuilder body = new StringBuilder(message);

Properties props = new Properties();
props.put("mail.smtp.host", host);
props.put("mail.from", "me@mycompany.com");
props.put("mail.smtp.starttls.enable", "true");
props.put("mail.smtp.auth", "true");
props.put("mail.smtp.port", "587");
props.put("mail.debug", "true");

Authenticator authenticator = new Authenticator();
props.setProperty("mail.smtp.submitter", authenticator.getPasswordAuthentication().getUserName());

Session session = Session.getInstance(props, authenticator);

Message message = new MimeMessage(session);
try {
    message.setFrom(new InternetAddress(as_email_from));
    message.setRecipient(Message.RecipientType.TO, new InternetAddress(as_email_to));
    message.setSubject("Testing exchange server");                
    message.setContent(body.toString(), "text/html");
    message.setSentDate(new Date());

    Transport transport = session.getTransport("smtp");
    transport.connect(host, 587, smtpSettings.getUser(), smtpSettings.getPswd());
    transport.sendMessage(message, message.getAllRecipients());
    transport.close();

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

private class Authenticator extends javax.mail.Authenticator {
   private PasswordAuthentication authentication;
   public Authenticator() {
       String username = "myuser";
       String password = "mypass";
       authentication = new PasswordAuthentication(username, password);
   }
   protected PasswordAuthentication getPasswordAuthentication() {
       return authentication;
   }
}
下面是调试:

DEBUG: SMTPTransport connected to host "smtp.office365.com", port: 587

DEBUG SMTP SENT: EHLO Brian-PC
DEBUG SMTP RCVD: 250-BY2PR01CA020.outlook.office365.com Hello [207.250.96.62]
250-SIZE 78643200
250-PIPELINING
250-DSN
250-ENHANCEDSTATUSCODES
250-STARTTLS
250-AUTH
250-8BITMIME
250-BINARYMIME
250 CHUNKING

DEBUG SMTP Found extension "SIZE", arg "78643200"
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 "AUTH", arg ""
DEBUG SMTP Found extension "8BITMIME", arg ""
DEBUG SMTP Found extension "BINARYMIME", arg ""
DEBUG SMTP Found extension "CHUNKING", arg ""
DEBUG SMTP: Attempt to authenticate
DEBUG SMTP: use8bit false
DEBUG SMTP SENT: MAIL FROM:<me@mycompany.com>
DEBUG SMTP RCVD: 530 5.7.1 Client was not authenticated
DEBUG:SMTPTransport已连接到主机“smtp.office365.com”,端口:587
已发送调试SMTP:EHLO Brian PC
调试SMTP RCVD:250-BY2PR01CA020.outlook.office365.com您好[207.250.96.62]
250号78643200
250-流水线
250-DSN
250-增强状态码
250-STARTTLS
250-AUTH
250-8比特
250-BINARYMIME
250分块
调试SMTP找到扩展名“SIZE”,arg“78643200”
调试SMTP找到扩展名“管道”,arg“”
调试SMTP找到扩展名“DSN”,参数“”
调试SMTP找到扩展名“ENHANCEDSTATUSCODES”,arg“”
调试SMTP找到扩展名“STARTTLS”,arg“”
调试SMTP找到扩展名“AUTH”,arg“”
调试SMTP找到扩展名“8BITMIME”,arg“”
调试SMTP找到扩展名“BINARYMIME”,arg“”
调试SMTP找到扩展名“分块”,参数“”
调试SMTP:尝试进行身份验证
调试SMTP:use8bit false
调试SMTP已发送:邮件来自:
调试SMTP RCVD:530 5.7.1客户端未通过身份验证

根据调试输出,我相信您实际上没有使用JavaMail 1.4.7。检查您的类路径、服务器上的lib目录等。

根据调试输出,我相信您实际上没有使用JavaMail 1.4.7。检查类路径、服务器上的库目录等。

检查Exchange服务器是否需要启用TLS,如果需要,请通过设置此属性启用TLS

mail.smtp.starttls.enable=true

这解决了我的问题。

检查Exchange服务器是否需要启用TLS,如果需要,请通过设置此属性启用TLS

mail.smtp.starttls.enable=true

这解决了我的问题。

调试输出中告诉您的是什么?协议跟踪的格式。在较新的版本中更改了格式。此外,最新版本将在开始时打印版本号。谢谢,这确实是问题所在。我现在可以通过Exchange服务器发送电子邮件。我确实在调试开始时看到了1.4.7版本的打印。太棒了!您可能想考虑升级到JavaMail 1.5.1,调试输出中的内容告诉您,协议跟踪的格式。在较新的版本中更改了格式。此外,最新版本将在开始时打印版本号。谢谢,这确实是问题所在。我现在可以通过Exchange服务器发送电子邮件。我确实在调试开始时看到了1.4.7版本的打印。太棒了!您可能需要考虑升级到JavaMail 1.5.1。