java 無法發送郵件問題 java 發送qq郵件 報錯:java mail Received fatal alert: handshake_failure (使用ssl)
javax.mail.MessagingException: Could not connect to SMTP host: smtp.qq.com, port: 465;
nested exception is:
javax.net.ssl.SSLHandshakeException: Received fatal alert: handshake_failure
at com.sun.mail.smtp.SMTPTransport.openServer(SMTPTransport.java:1934)
at com.sun.mail.smtp.SMTPTransport.protocolConnect(SMTPTransport.java:638)
at javax.mail.Service.connect(Service.java:295)
at javax.mail.Service.connect(Service.java:176)
at com.gzbugu.common.tools.ext.StringUtil.main(StringUtil.java:524)
Caused by: javax.net.ssl.SSLHandshakeException: Received fatal alert: handshake_failure
at sun.security.ssl.Alerts.getSSLException(Unknown Source)
at sun.security.ssl.Alerts.getSSLException(Unknown Source)
at sun.security.ssl.SSLSocketImpl.recvAlert(Unknown Source)
at sun.security.ssl.SSLSocketImpl.readRecord(Unknown Source)
at sun.security.ssl.SSLSocketImpl.performInitialHandshake(Unknown Source)
at sun.security.ssl.SSLSocketImpl.startHandshake(Unknown Source)
at sun.security.ssl.SSLSocketImpl.startHandshake(Unknown Source)
at com.sun.mail.util.SocketFetcher.configureSSLSocket(SocketFetcher.java:507)
at com.sun.mail.util.SocketFetcher.getSocket(SocketFetcher.java:238)
at com.sun.mail.smtp.SMTPTransport.openServer(SMTPTransport.java:1900)
... 4 more
找了半天終於解決了:
換掉本地jdk(安裝目錄jre\lib\security里的local_policy.jar,US_export_policy.jar)里面有一個jce的包,安全性機制導致的訪問https會報錯。
如本人安裝的jdk需要替換的地方:1. C:\Program Files\Java\jdk1.8.0_102\jre\lib\security 2. C:\Program Files\Java\jre1.8.0_102\lib\security
下載地址: http://www.oracle.com/technetwork/java/javase/downloads/jce-7-download-432124.html
目錄 %JAVA_HOME%\jre\lib\security里的local_policy.jar,US_export_policy.jar
源碼:
public static void main(String[] args) {
try {
//這里使用的是qq郵箱發送
String email="xxxxxxx@qq.com";
String pwd="cgXXXXwqfaakcjgf";//非QQ郵箱密碼;是qq郵箱安全碼
String toemail="xxxxxx@qq.com";//接收的郵箱
Properties props = new Properties();
// 開啟debug調試
props.setProperty("mail.debug", "true");
// 發送服務器需要身份驗證
props.setProperty("mail.smtp.auth", "true");
// 設置郵件服務器主機名
props.setProperty("mail.host", "smtp.qq.com");
// 發送郵件協議名稱
props.setProperty("mail.transport.protocol", "smtp");
props.put("mail.smtp.socketFactory.port", "465");
props.put("mail.smtp.port", "465");
props.put("mail.smtp.socketFactory.class", "javax.net.ssl.SSLSocketFactory");
MailSSLSocketFactory sf = new MailSSLSocketFactory();
sf.setTrustAllHosts(true);
props.put("mail.smtp.ssl.enable", "true");
props.put("mail.smtp.ssl.socketFactory", sf);
Session session = Session.getInstance(props);
session.setDebug(true);
Message msg = new MimeMessage(session);
msg.setSubject("http://www.cnblogs.com/qgc88");
StringBuilder builder = new StringBuilder();
builder.append("http://www.cnblogs.com/qgc88 " );
builder.append("http://www.cnblogs.com/qgc88");
builder.append("\n時間 " + new Date());
msg.setText(builder.toString());
msg.setFrom(new InternetAddress(email));//"**發送人的郵箱地址**"
Transport transport = session.getTransport();
transport.connect("smtp.qq.com", email, pwd);
transport.sendMessage(msg, new Address[] { new InternetAddress(toemail) });//"**接收人的郵箱地址**"
transport.close();
} catch (Exception e) {
e.printStackTrace();
}
}