JAVA Mail и Office 365 зависают при подключении - PullRequest
0 голосов
/ 11 июня 2018

У нас есть приложение, которое в значительной степени использует 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();
        }
    }
}

1 Ответ

0 голосов
/ 11 июня 2018

Если вы прочитали документацию , в которой говорится:

Поставщик протокола SMTP поддерживает следующие свойства, которые могут быть установлены в объекте сеанса JavaMail.Свойства всегда задаются как строки;столбец Тип описывает, как строка интерпретируется.Например, используйте

    props.put("mail.smtp.port", "888");

, чтобы установить свойство mail.smtp.port, имеющее тип int.

свойства на самом деле должны быть Strings, но более новые версии JavaMailтакже будет принимать их как целые числа, но не как длинные.

Кроме того, обратите внимание, что вы можете избавиться от вашего Authenticator , так как вы передаете имя пользователя и пароль напрямую в метод connect.И вам не нужно устанавливать свойства для хоста и порта, так как вы также передаете их напрямую.

...