java - MS Exchange Server NTLM 身份验证问题 501 5.1.7 地址无效
问题描述
我有一个 Web 应用程序,它需要向用户发送电子邮件通知以完成特定任务。
我有一个屏幕,站点管理员可以在其中配置邮件服务器设置,然后应用程序将使用这些设置在需要时发送电子邮件。
以下是我们拥有的代码的高度删节版本:
public static boolean sendEmail(String toAddress, String fromAddress, String userName, String userPassword,String smtpHost, String portNumber, String emailSubject,String emailBody) {
// Recipient's email ID needs to be mentioned.
String to = toAddress;
// Sender's email ID needs to be mentioned
String from = fromAddress;//change accordingly
final String username = userName;//change accordingly
final String password = userPassword;//change accordingly
// Assuming you are sending email through relay.jangosmtp.net
String host = smtpHost;
Properties props = new Properties();
props.put("mail.smtp.auth", "true");
props.put("mail.smtp.socketFactory.fallback", "false");
props.put("mail.smtp.starttls.enable", "true");
props.put("mail.smtp.socketFactory.port", portNumber);
props.put("mail.smtp.host", host);
props.put("mail.smtp.port", portNumber);
//For NTLM
props.setProperty("mail.imap.auth.ntlm.domain","");
// Get the Session object.
SMTPAuthenticator authenticator = new SMTPAuthenticator(username, password);
props.put("mail.smtp.submitter", authenticator.getPasswordAuthentication().getUserName());
Session session = Session.getInstance(props, authenticator);
try {
// Create a default MimeMessage object.
Message message = new MimeMessage(session);
// Set From: header field of the header.
message.setFrom(new InternetAddress(from));
// Set To: header field of the header.
message.setRecipients(Message.RecipientType.TO,
InternetAddress.parse(to));
// Set Subject: header field
message.setSubject(emailSubject);
// Now set the actual message
message.setText(emailBody);
// Send message
Transport.send(message);
System.out.println("Sent message successfully....");
} catch (MessagingException e) {
throw new RuntimeException(e);
}
return true;
}
它工作得很好,直到我们将我们的应用程序部署在我们的一个客户端环境中。我们的客户使用使用NTLM 身份验证的本地 MS Exchange 服务器
在这里,我们需要指定 from 和 to 地址,MYDOMAIN\s.sriram
而不是s.sriram@mydomain.com
上面的代码在这种情况下不起作用,会抛出以下异常:
Exception in thread "main" java.lang.RuntimeException: com.sun.mail.smtp.SMTPSendFailedException: 501 5.1.7 Invalid address
;
nested exception is:
com.sun.mail.smtp.SMTPSenderFailedException: 501 5.1.7 Invalid address
at com.ycs.tenjin.mail.EmailUtil.sendEmail(EmailUtil.java:86)
at com.ycs.tenjin.mail.EmailUtil.main(EmailUtil.java:19)
Caused by: com.sun.mail.smtp.SMTPSendFailedException: 501 5.1.7 Invalid address
;
nested exception is:
com.sun.mail.smtp.SMTPSenderFailedException: 501 5.1.7 Invalid address
at com.sun.mail.smtp.SMTPTransport.issueSendCommand(SMTPTransport.java:2108)
at com.sun.mail.smtp.SMTPTransport.mailFrom(SMTPTransport.java:1609)
at com.sun.mail.smtp.SMTPTransport.sendMessage(SMTPTransport.java:1117)
at javax.mail.Transport.send0(Transport.java:195)
at javax.mail.Transport.send(Transport.java:124)
at com.ycs.tenjin.mail.EmailUtil.sendEmail(EmailUtil.java:80)
... 1 more
Caused by: com.sun.mail.smtp.SMTPSenderFailedException: 501 5.1.7 Invalid address
at com.sun.mail.smtp.SMTPTransport.mailFrom(SMTPTransport.java:1616)
... 5 more
但是,如果我尝试将 from 和 to 地址设置为常规格式,即 ie s.sriram@mydomain.com
,则会收到 Authentication unsuccessful 错误,如下所示:
Exception in thread "main" java.lang.RuntimeException: javax.mail.AuthenticationFailedException: 535 5.7.3 Authentication unsuccessful
at com.ycs.tenjin.mail.EmailUtil.sendEmail(EmailUtil.java:85)
at com.ycs.tenjin.mail.EmailUtil.main(EmailUtil.java:19)
Caused by: javax.mail.AuthenticationFailedException: 535 5.7.3 Authentication unsuccessful
at com.sun.mail.smtp.SMTPTransport$Authenticator.authenticate(SMTPTransport.java:826)
at com.sun.mail.smtp.SMTPTransport.authenticate(SMTPTransport.java:761)
at com.sun.mail.smtp.SMTPTransport.protocolConnect(SMTPTransport.java:685)
at javax.mail.Service.connect(Service.java:317)
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)
at com.ycs.tenjin.mail.EmailUtil.sendEmail(EmailUtil.java:79)
... 1 more
无论哪种方式,这都行不通。
现在,客户告诉我,他有另一个应用程序,他已经能够成功地配置和发送电子邮件,使用相同的 MS Exchange 服务器,并且指定的 from & to 地址如MYDOMAIN\s.sriram
. 我什至看到了另一个应用程序的电子邮件配置屏幕,其中有一个选项可以明确选择NTLM作为身份验证类型。所有其他参数与我在上面的代码片段中描述的相同。
有没有办法我们可以将身份验证类型设置为 NTLM 而不是 SMTP?
如果没有,任何人都可以提出解决这个问题的方法吗?
解决方案
推荐阅读
- javascript - 如何使用其他数组的内容制作新数组或数组?
- amazon-web-services - 如何使用邮递员获取 Amazon SNS 电子邮件通知的响应?
- php - Laravel Blade:我的刀片文件中未呈现 HTML 标签
- c++ - 'null' 和 'NULL' 是一样的吗?
- google-cloud-platform - 在 bigquery UDF 中使用 SQL
- symfony4 - 如何在 Symfony4 上使用带小数的 ICU 选择?
- git - 如何将私人组织的 Git 存储库与公共 GitHub 同步?
- mysql - 如何按值获取分组列计数
- heap-memory - 带有python的Nifi ExecuteScript:OOM异常
- c - 结构填充和性能损失