У меня есть веб-приложение, которое должно отправлять уведомления по электронной почте пользователям для конкретных задач.
У меня есть экран, на котором администратор сайта настраивает параметры почтового сервера, которые затем будут использоваться приложением для отправки электронной почты при необходимости.
Ниже приведена очень сокращенная версия имеющегося у нас кода:
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;
}
Это работало нормально, пока мы не развернули наше приложение в одной из наших клиентских сред. Наш клиент использует локальный сервер MS Exchange, который использует NTLM-аутентификацию
Здесь нам нужно указать адреса 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 в обычном формате, то есть s.sriram@mydomain.com
, я получу ошибку аутентификации при неудаче, как показано ниже:
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, а адрес отправителя и адреса указывается как MYDOMAIN\s.sriram
. Мне даже показали экран конфигурации электронной почты другого приложения, где была возможность явно выбрать NTLM в качестве типа аутентификации. Все остальные параметры были такими же, как я описал в моем фрагменте кода выше.
Есть ли способ установить тип аутентификации NTLM вместо SMTP?
Если нет, может кто-нибудь предложить выход из этой проблемы?