javamail验证邮箱密码/发件时报错javax.mail.AuthenticationFailedException: STLS required but not supported
我们在开发一个陌生的程序时,很多时候,都是上网找demo,然后改改为自己所用,但有时demo里写的却不是支持所有情况的。
例如我在网上找的利用javamail发送邮件,我们是做一个类似网页端收发件的第三方邮箱,可以作为绑定其他邮箱的邮件系统。当用邮箱和密码绑定邮箱时,报错如下:
javax.mail.AuthenticationFailedException: STLS required but not supported
at com.sun.mail.pop3.POP3Store.protocolConnect(POP3Store.java:213)
at javax.mail.Service.connect(Service.java:388)
at javax.mail.Service.connect(Service.java:246)
at javax.mail.Service.connect(Service.java:267)
问题出现原因:在连接pop3协议时,STLS需要但不被支持;
解决办法:在连接pop3协议时,不要添加以下两个属性:
props.setProperty("mail.pop3.starttls.enable", encryptionTransmissionFlag);
props.setProperty("mail.pop3.starttls.required", encryptionTransmissionFlag);
例如如下代码,我的这两句是注释掉的。在我的项目里encryptionTransmissionFlag这个字段是指是否勾选“STARTTLS加密传输”这个选项。也就是说该邮箱的pop3协议,不支持“STARTTLS加密传输”。下面对这个字段进行解释如下,从foxmail上截的图。
if("pop3".equals(receiveServerType)) {
props.setProperty("mail.pop3.port", receiveServerPort); // 收件端口 勾选了SSL(即SSL加密)则为995否则为110
props.setProperty("mail.pop3.host", receiveServerAddress);// 收件pop3服务器 例如:pop.163.com
if("true".equals(receiveServerSslFlag)) {//收件服务器是否勾选了SSL
props.setProperty("mail.pop3.socketFactory.class","javax.net.ssl.SSLSocketFactory");
props.setProperty("mail.pop3.socketFactory.fallback", "false");
}
props.setProperty("mail.pop3.ssl.enable", receiveServerSslFlag);
props.setProperty("mail.pop3.auth", "true");
// props.setProperty("mail.pop3.starttls.enable", encryptionTransmissionFlag);
// props.setProperty("mail.pop3.starttls.required", encryptionTransmissionFlag);
}else {
props.setProperty("mail.imap.port", receiveServerPort); // 端口 993
props.setProperty("mail.imap.host", receiveServerAddress);// imap服务器
if("true".equals(receiveServerSslFlag)) {
props.setProperty("mail.imap.socketFactory.class","javax.net.ssl.SSLSocketFactory");
props.setProperty("mail.imap.socketFactory.fallback", "false");
}
props.setProperty("mail.imap.auth", "true");
props.setProperty("mail.imap.ssl.enable", receiveServerSslFlag);
props.setProperty("mail.imap.starttls.enable", encryptionTransmissionFlag);
props.setProperty("mail.imap.starttls.required", encryptionTransmissionFlag);
}
props.setProperty("mail.store.protocol",receiveServerType); // 收件协议 例如 pop3
props.setProperty("mail.transport.protocol", "smtp");//发件协议"smtp"
props.setProperty("mail.smtp.host", sendServerAddress);// smtp.qq.com
props.setProperty("mail.smtp.port", SendServerPort);// 465
props.setProperty("mail.smtp.auth", SendServerSslFlag);// "true"
props.setProperty("mail.debug", "true");// "true" 控制台打印发邮件日志
if("true".equals(SendServerSslFlag)) {
props.setProperty("mail.smtp.socketFactory.class", "javax.net.ssl.SSLSocketFactory");
props.setProperty("mail.smtp.socketFactory.fallback", "false");
}
encryptionTransmissionFlag字段代表的含义就是图中标红的复选框是否勾选。当encryptionTransmissionFlag=true时勾选,false时不勾选。