JAVA Mail和Office 365挂在连接上

时间:2018-06-11 13:36:12

标签: java office365 javamail

我们有一个很大程度上依赖JAVA Mail发送电子邮件的应用程序。我们按照下面的设置设置了连接超时属性(从Long值设置,这是否需要生效才能生效?):

props.put("mail.smtp.timeout",           1000L);
props.put("mail.smtp.connectiontimeout", 1000L);

一段时间后,应用程序停止运行并且永远不会从Office 365 smtp帐户恢复(仅适用于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 :(得分:1)

如果您阅读了documentation,其中包含:

  

SMTP协议提供程序支持以下属性   可以在JavaMail Session对象中设置。属性总是如此   设为字符串; Type列描述字符串的方式   解释。例如,使用

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

设置mail.smtp.port属性,类型为int。

属性实际上应该是字符串,但新版本的JavaMail也会接受它们作为整数,但不接受长期。

另请注意,您可以get rid of your Authenticator,因为您已将用户名和密码直接传递给connect方法。而且您不需要为主机和端口设置属性,因为您也可以直接传递它们。