我正在尝试从我的java发送电子邮件,但无法连接到我的主机 . 这是我的代码:
public class sendEmail implements Runnable{
@Override
public void run(){
try{
final String username = "user", password = "pass", from = "from@mail.com", to = "to@mail.com";
Properties props = new Properties();
props.setProperty("mail.smtp.user", username);
props.setProperty("mail.smtp.host", "mail.host.com");
props.setProperty("mail.smtp.ssl.enable", "true");
props.setProperty("mail.smtp.port", "465");
props.setProperty("mail.smtp.starttls.enable", "true");
props.setProperty("mail.smtp.debug", "true");
props.setProperty("mail.smtp.auth", "true");
props.setProperty("mail.smtp.socketFactory.port", "465");
props.setProperty("mail.smtp.socketFactory.class", "javax.net.ssl.SSLSocketFactory");
props.setProperty("mail.smtp.socketFactory.fallback", "false");
Authenticator auth = new SMTPAuthenticator();
Session session = Session.getInstance(props, auth);
session.setDebug(true);
Message msg = new MimeMessage(session);
try{
msg.setSubject("Test SMTP");
msg.setFrom(new InternetAddress(from));
msg.setRecipients(Message.RecipientType.TO, InternetAddress.parse(to));
Transport transport = session.getTransport("smtp");
transport.connect("mail.itbuntuksemua.com", username, password);
transport.sendMessage(msg, msg.getAllRecipients());
transport.close();
System.out.println("Done");
}catch(MessagingException | NumberFormatException | HeadlessException ex){
ex.printStackTrace();
}
}catch(UnknownHostException | NumberFormatException ex){
ex.printStackTrace();
}
}
}
在这里我的 SMTPAuthenticator()
代码:
private class SMTPAuthenticator extends javax.mail.Authenticator {
@Override
public PasswordAuthentication getPasswordAuthentication() {
String username = "user";
String password = "pass";
return new PasswordAuthentication(username, password);
}
}
在这里,我的报告错误:
DEBUG:setDebug:JavaMail版本1.4.7 DEBUG:getProvider()返回javax.mail.Provider [TRANSPORT,smtp,com.sun.mail.smtp.SMTPTransport,Oracle] DEBUG SMTP:useEhlo true,useAuth true DEBUG SMTP:尝试连接到主机“mail.host.com”,端口465,isSSL是真的javax.mail.MessagingException:无法连接到SMTP主机:mail.host.com,端口:465;嵌套异常是:javax.net.ssl.SSLHandshakeException:sun.security.validator.ValidatorException:PKIX路径构建失败:sun.security.provider.certpath.SunCertPathBuilderException:无法在com.sun.mail找到请求目标的有效证书路径.smtp.SMTPTransport.openServer(SMTPTransport.java:1961)位于javax的javax.mail.Service.connect(Service.java:295)的com.sun.mail.smtp.SMTPTransport.protocolConnect(SMTPTransport.java:654) . mail.Service.connect(Service.java:176)at scam.ccChecker $ sendEmail.run(ccChecker.java:186)at java.lang.Thread.run(Thread.java:745)引起:javax.net.ssl .SSLHandshakeException:sun.security.validator.ValidatorException:PKIX路径构建失败:sun.security.provider.certpath.SunCertPathBuilderException:无法在sun.security.ssl.Alerts.getSSLException中找到所请求目标的有效证书路径(Alerts.java: 192)sun.security.ssl.SSLSocketImpl.fatal(SSLSocketImpl.java:1937)at sun.security.ssl.Handshaker.fatalSE(Handshaker.java) :302)at sun.security.ssl.Handshaker.fatalSE(Handshaker.java:296)at sun.security.ssl.ClientHandshaker.serverCertificate(ClientHandshaker.java:1478)at sun.security.ssl.ClientHandshaker.processMessage(ClientHandshaker . java:212)at sun.security.ssl.Handshaker.processLoop(Handshaker.java:957)at sun.security.ssl.Handshaker.process_record(Handshaker.java:892)at sun.security.ssl.SSLSocketImpl.readRecord(SSLSocketImpl .java:1050)sun.security.ssl.SSLSocketImpl.performInitialHandshake(SSLSocketImpl.java:1363)at sun.security.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1391)at sun.security.ssl.SSLSocketImpl.startHandshake( SSLSocketImpl.java:1375)com.sun.mail.util.SocketFetcher.configureSSLSocket(SocketFetcher.java:549)com.sun.mail.util.SocketFetcher.createSocket(SocketFetcher.java:354)com.sun.mail .util.SocketFetcher.getSocket(SocketFetcher.java:211)at com.sun.mail.smtp.SMTPTransport.openServer(SMTPTransport.java:1927)... 5更多引起:sun.security.validator.Valid atorException:PKIX路径构建失败:sun.security.provider.certpath.SunCertPathBuilderException:无法在sun.security.validator上的sun.security.validator.PKIXValidator.doBuild(PKIXValidator.java:387)找到所请求目标的有效证书路径 . 位于sun.security.ssl.X509TrustManagerImpl.validate(X509TrustManagerImpl.java:324)sun.security.ssl的sun.security.validator.Validator.validate(Validator.java:260)的PKIXValidator.engineValidate(PKIXValidator.java:292) .X509TrustManagerImpl.checkTrusted(X509TrustManagerImpl.java:229)at sun.security.ssl.X509TrustManagerImpl.checkServerTrusted(X509TrustManagerImpl.java:124)at sun.security.ssl.ClientHandshaker.serverCertificate(ClientHandshaker.java:1460)... 16更多引起:sun.security.provider.certpath.SunCertPathBuilderException:无法在sun.security.provider.certpath的sun.security.provider.certpath.SunCertPathBuilder.build(SunCertPathBuilder.java:145)找到所请求目标的有效证书路径 . SunCertPathBuilde r.engineBuild(SunCertPathBuilder.java:131)at java.security.cert.CertPathBuilder.build(CertPathBuilder.java:280)at sun.security.validator.PKIXValidator.doBuild(PKIXValidator.java:382)... 22更多
有人能帮我吗? :(
2 回答
也许您可以尝试设置证书,以访问SMTP端口 . 像这样的东西:
您可能想尝试下载证书,使用keytool安装它,然后将它们设置为系统变量 . 这是如何做:
转到firefox浏览器中的URL,单击HTTPS证书链(URL地址旁边) . 单击
"more info" > "security" > "show certificate" > "details" > "export.."
. 选取名称并选择文件类型example.der
. 现在您拥有了keystore文件,您必须将其添加到JVM中找到文件
$JAVA_HOME/jre/lib/security/cacerts
使用以下内容将
example.der
文件导入cacerts
文件:默认密钥库密码为'
changeit
'您可以查看使用此命令显示证书指纹所做的更改 .
更多说明可在此处找到:https://stackoverflow.com/a/36427118/1696153