我想知道如何从java程序发送邮件。我写的java邮件程序没有什么问题。但我不知道 SMTP 端口 465,即使我使用 g 邮件服务器端口 465。 我想知道我的计算机是否需要启用任何选项。 请让我一步步知道需要什么 我正在使用 Windows 7 并想使用 Gmail 服务器..
您的努力将非常值得感激。
请告诉我以下内容有任何错误吗?
Exception in thread "main" java.lang.RuntimeException: javax.mail.MessagingException: Could not connect to SMTP host: smtp.gmail.com, port: 465;
nested exception is:
javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: PKIX path validation failed: java.security.cert.CertPathValidatorException: timestamp check failed
at mail1.SendMailSSL.main(SendMailSSL.java:44)
Caused by: javax.mail.MessagingException: Could not connect to SMTP host: smtp.gmail.com, port: 465;
nested exception is:
javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: PKIX path validation failed: java.security.cert.CertPathValidatorException: timestamp check failed
at com.sun.mail.smtp.SMTPTransport.openServer(SMTPTransport.java:1706)
at com.sun.mail.smtp.SMTPTransport.protocolConnect(SMTPTransport.java:525)
at javax.mail.Service.connect(Service.java:310)
at javax.mail.Service.connect(Service.java:169)
at javax.mail.Service.connect(Service.java:118)
at javax.mail.Transport.send0(Transport.java:188)
at javax.mail.Transport.send(Transport.java:118)
at mail1.SendMailSSL.main(SendMailSSL.java:39)
Caused by: javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: PKIX path validation failed: java.security.cert.CertPathValidatorException: timestamp check failed
at com.sun.net.ssl.internal.ssl.Alerts.getSSLException(Alerts.java:174)
at com.sun.net.ssl.internal.ssl.SSLSocketImpl.fatal(SSLSocketImpl.java:1611)
at com.sun.net.ssl.internal.ssl.Handshaker.fatalSE(Handshaker.java:187)
at com.sun.net.ssl.internal.ssl.Handshaker.fatalSE(Handshaker.java:181)
at com.sun.net.ssl.internal.ssl.ClientHandshaker.serverCertificate(ClientHandshaker.java:1035)
at com.sun.net.ssl.internal.ssl.ClientHandshaker.processMessage(ClientHandshaker.java:124)
at com.sun.net.ssl.internal.ssl.Handshaker.processLoop(Handshaker.java:516)
at com.sun.net.ssl.internal.ssl.Handshaker.process_record(Handshaker.java:454)
at com.sun.net.ssl.internal.ssl.SSLSocketImpl.readRecord(SSLSocketImpl.java:884)
at com.sun.net.ssl.internal.ssl.SSLSocketImpl.performInitialHandshake(SSLSocketImpl.java:1112)
at com.sun.net.ssl.internal.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1139)
at com.sun.net.ssl.internal.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1123)
at com.sun.mail.util.SocketFetcher.configureSSLSocket(SocketFetcher.java:503)
at com.sun.mail.util.SocketFetcher.getSocket(SocketFetcher.java:234)
at com.sun.mail.smtp.SMTPTransport.openServer(SMTPTransport.java:1672)
这个解决方案非常适合我。您需要将 GMail smtp 服务器证书导入到您的信任库中
使用openssl命令获取Gmail smtp服务器证书
“s_client -连接 smtp.gmail.com:465”
将“-----BEGIN CERTIFICATE-----”和“-----END CERTIFICATE-----”之间的输出(包括该前缀/后缀)保存到文件“gmail.cert”中
将此证书文件导入到您的密钥库中(对于 Linux,需要 sudo)
keytool -import -alias smtp.gmail.com -keystore "%JAVA_HOME%/jre/lib/security/cacerts" -file gmail.cert
重新启动您的 Java 应用程序以传播更改
致谢:http://notepad2.blogspot.com/2012/04/import-gmail-certificate-into-java.html
OpenSSL 可以在这里下载:http://gnuwin32.sourceforge.net/packages/openssl.htm
尝试使用命令
telnet smtp.gmail.com 465
看看是否可以连接。 这应该会告诉您是否正在连接。 还可以尝试端口 587(提交/StartTLS),它应该提供可见的标头。
Windows 7 上默认不安装 Telnet。您应该能够使用命令
pkgmgr /iu:"TelnetClient"
从命令行安装它。
连接后,您将需要使用 gmail ID 和密码进行身份验证才能发送邮件。 您的代码似乎尚未连接。
通过将调试选项添加到获取会话时传递的任何道具中来查找其他线索。 我想你会看到你实际上正在连接到 gmail 的后端,因为你的异常是在 send() 期间而不是在 connect() 期间,这意味着你使用的主机/端口/id/psw 可能都是正确的(除非有某种类型)发生惰性连接)。
props.put("mail.debug", "" + true); // Enable debug mode
Session session = Session.getInstance(props, new javax.mail.Authenticator() {
@Override
protected PasswordAuthentication getPasswordAuthentication() {
return new PasswordAuthentication(smtpId, psw);
}
});
您的调试输出应类似于:
DEBUG SMTP: useEhlo true, useAuth true
DEBUG SMTP: useEhlo true, useAuth true
DEBUG SMTP: trying to connect to host "smtp.gmail.com", port 465, isSSL true
9 220 mx.google.com ESMTP cpxgxgxgxgxgxgb.3
DEBUG SMTP: connected to host "smtp.gmail.com", port: 465
您是否使用 SSLSocket,像这样?
SSLSocket s = (SSLSocket) ((SSLSocketFactory)
SSLSocketFactory.getDefault()).
createSocket(InetAddress.getByName("smtp.gmail.com"), 465);
在我的情况下,应用程序要求我信任证书
SSL:
信任:smtp.gmail.com