我们有一个很大程度上依赖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();
}
}
}
答案 0 :(得分:1)
如果您阅读了documentation,其中包含:
SMTP协议提供程序支持以下属性 可以在JavaMail Session对象中设置。属性总是如此 设为字符串; Type列描述字符串的方式 解释。例如,使用
props.put("mail.smtp.port", "888");
设置mail.smtp.port属性,类型为int。
属性实际上应该是字符串,但新版本的JavaMail也会接受它们作为整数,但不接受长期。
另请注意,您可以get rid of your Authenticator,因为您已将用户名和密码直接传递给connect方法。而且您不需要为主机和端口设置属性,因为您也可以直接传递它们。