Почта TLS SMTP Java выдает исключение SSLHandShakeException
Я пытаюсь отправить почту с помощью SMTP, который установлен в качестве SMTP-сервера по умолчанию с 25 587 портами и TLS. MS Exchange 2010. Все данные авторизации верны, потому что я могу войти через веб-интерфейс почты. Приведенный ниже код работает с SMTP-сервером Gmail, но когда я использую свой SMTP-сервер, он выдает ошибку с сертификатами:
javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: сбой построения пути PKIX: sun.security.provider.certpath.SunCertPathBuilderException: невозможно найти действительный путь сертификации для запрошенной цели
public static void SendMailTLS(String to, String subject, String body) throws Exception{
try {
java.util.Properties props = new java.util.Properties();
props.put("mail.smtp.host", "sample");
props.put("mail.smtp.port", "587");
props.put("mail.smtp.starttls.enable", "true");
props.put("mail.smtp.auth", "true");
props.put("mail.smtp.connectiontimeout", "10000");
final String EmailUser = "sample";
final String EmailPassword = "sample";
Session session = Session.getInstance(props, new javax.mail.Authenticator() {
protected PasswordAuthentication getPasswordAuthentication() {
return new PasswordAuthentication(
EmailUser,EmailPassword);
}
}); session.setDebug(true);
InternetAddress fromAddress = new InternetAddress("sample",
"sample");
InternetAddress toAddress = new InternetAddress("sample",
"sample");
Message msg = new MimeMessage(session);
msg.setFrom(fromAddress);
msg.addRecipient(Message.RecipientType.TO,toAddress);
msg.setSubject(subject);
msg.setText(body);
Transport transport = session.getTransport("smtp");
transport.connect();
transport.sendMessage(msg, msg.getAllRecipients());
} catch (MessagingException e) {e.printStackTrace();}
}
Я делаю что-то неправильно?
1 ответ
Это сообщение об ошибке означает, что ваш сервер с именем "sample" (сервер MS Exchange 2010) использует сертификат, которому не доверяет среда выполнения Java. Возможно, вы используете самозаверяющий сертификат. Поэтому вам нужно импортировать этот сертификат в хранилище сертификатов Java Runtime с помощью keytool.