У нас есть приложение, которое в значительной степени использует JAVA Mail для отправки сообщений электронной почты.Мы установили свойства тайм-аута подключения, как указано ниже (из длинных значений, требуются ли целые числа, чтобы это влияло?):
props.put("mail.smtp.timeout", 1000L);
props.put("mail.smtp.connectiontimeout", 1000L);
Через некоторое время приложение останавливается и никогда не восстанавливается из smtp-файла Office 365.учетная запись (происходит только с Office 365).Мы включили режим отладки в почте JAVA, и строка, в которой он не работает, приведена ниже:
DEBUG: setDebug: JavaMail version 1.4.5
DEBUG: getProvider() returning javax.mail.Provider[TRANSPORT,smtp,com.sun.mail.smtp.SMTPTransport,Sun Microsystems, Inc]
DEBUG SMTP: useEhlo true, useAuth true
DEBUG SMTP: trying to connect to host "smtp-mail.outlook.com", port 587, isSSL false
Тайм-ауты сокетов, по-видимому, не работают, когда эта точка достигнута, приложение останавливается.Ниже приведен бесконечный цикл, который продолжает подключаться к почтовому серверу, а затем в конечном итоге застревает.
public static void main(String[] args){
String smtpServer = "smtp-mail.outlook.com";
String username = "test@domain.com";
String password = "password";
int portNumber = 587;
Long socketTimeout = 10000L;
Properties props = new Properties();
props.put("mail.smtp.ssl.trust", "*");
props.put("mail.smtp.host", "smtp-mail.outlook.com");
props.put("mail.smtp.auth", "true");
props.put("mail.smtp.port", portNumber);
props.put("mail.smtp.timeout", socketTimeout);
props.put("mail.smtp.connectiontimeout", socketTimeout);
props.put("mail.smtp.starttls.enable", "true");
Authenticator authenticator = new Authenticator() {
protected PasswordAuthentication getPasswordAuthentication() {
return new PasswordAuthentication(username, password);
}
};
while(true){
Session sess = Session.getInstance(props, authenticator);
sess.setDebug(true);
try {
Transport t = sess.getTransport("smtp");
t.connect(smtpServer, portNumber, username, password);
t.close();
}catch (Exception e) {
e.printStackTrace();
}
}
}