Javamail无法将套接字转换为TLS GMail
我正在尝试通过Gmail SMTP服务器使用JavaMail发送电子邮件。然而,这是一个代码Javamail无法将套接字转换为TLS GMail,java,email,gmail,jakarta-mail,Java,Email,Gmail,Jakarta Mail,我正在尝试通过Gmail SMTP服务器使用JavaMail发送电子邮件。然而,这是一个代码 final String username = "mygmail@gmail.com"; final String password = "mygmailpassword"; Properties props = new Properties(); props.put("mail.smtp.auth", true); props.put("mail.smtp.start
final String username = "mygmail@gmail.com";
final String password = "mygmailpassword";
Properties props = new Properties();
props.put("mail.smtp.auth", true);
props.put("mail.smtp.starttls.enable", true);
props.put("mail.smtp.host", "smtp.gmail.com");
props.put("mail.smtp.port", "587");
Session session = Session.getInstance(props,
new javax.mail.Authenticator() {
protected PasswordAuthentication getPasswordAuthentication() {
return new PasswordAuthentication(username, password);
}
});
try {
Message message = new MimeMessage(session);
message.setFrom(new InternetAddress("no-reply@gmail.com"));
message.setRecipients(Message.RecipientType.TO,
InternetAddress.parse("test@gmail.com"));
message.setSubject("Testing Subject");
message.setText("Dear Mail Crawler,"
+ "\n\n No spam to my email, please!");
Transport.send(message);
System.out.println("Done");
} catch (MessagingException e) {
throw new RuntimeException(e);
}
返回此错误的错误消息
Could not convert socket to TLS;
完整的堆栈跟踪
Exception in thread "main" java.lang.RuntimeException: javax.mail.MessagingException: Could not convert socket to TLS;
nested exception is:
javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
at Test.main(Test.java:43)
Caused by: javax.mail.MessagingException: Could not convert socket to TLS;
nested exception is:
javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
at com.sun.mail.smtp.SMTPTransport.startTLS(SMTPTransport.java:1907)
at com.sun.mail.smtp.SMTPTransport.protocolConnect(SMTPTransport.java:666)
at javax.mail.Service.connect(Service.java:317)
at javax.mail.Service.connect(Service.java:176)
at javax.mail.Service.connect(Service.java:125)
at javax.mail.Transport.send0(Transport.java:194)
at javax.mail.Transport.send(Transport.java:124)
at Test.main(Test.java:38)
Caused by: javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
at com.sun.net.ssl.internal.ssl.Alerts.getSSLException(Alerts.java:174)
at com.sun.net.ssl.internal.ssl.SSLSocketImpl.fatal(SSLSocketImpl.java:1649)
at com.sun.net.ssl.internal.ssl.Handshaker.fatalSE(Handshaker.java:241)
at com.sun.net.ssl.internal.ssl.Handshaker.fatalSE(Handshaker.java:235)
at com.sun.net.ssl.internal.ssl.ClientHandshaker.serverCertificate(ClientHandshaker.java:1206)
at com.sun.net.ssl.internal.ssl.ClientHandshaker.processMessage(ClientHandshaker.java:136)
at com.sun.net.ssl.internal.ssl.Handshaker.processLoop(Handshaker.java:593)
at com.sun.net.ssl.internal.ssl.Handshaker.process_record(Handshaker.java:529)
at com.sun.net.ssl.internal.ssl.SSLSocketImpl.readRecord(SSLSocketImpl.java:893)
at com.sun.net.ssl.internal.ssl.SSLSocketImpl.performInitialHandshake(SSLSocketImpl.java:1138)
at com.sun.net.ssl.internal.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1165)
at com.sun.net.ssl.internal.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1149)
at com.sun.mail.util.SocketFetcher.configureSSLSocket(SocketFetcher.java:549)
at com.sun.mail.util.SocketFetcher.startTLS(SocketFetcher.java:486)
at com.sun.mail.smtp.SMTPTransport.startTLS(SMTPTransport.java:1902)
... 7 more
Caused by: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
at sun.security.validator.PKIXValidator.doBuild(PKIXValidator.java:323)
at sun.security.validator.PKIXValidator.engineValidate(PKIXValidator.java:217)
at sun.security.validator.Validator.validate(Validator.java:218)
at com.sun.net.ssl.internal.ssl.X509TrustManagerImpl.validate(X509TrustManagerImpl.java:126)
at com.sun.net.ssl.internal.ssl.X509TrustManagerImpl.checkServerTrusted(X509TrustManagerImpl.java:209)
at com.sun.net.ssl.internal.ssl.X509TrustManagerImpl.checkServerTrusted(X509TrustManagerImpl.java:249)
at com.sun.net.ssl.internal.ssl.ClientHandshaker.serverCertificate(ClientHandshaker.java:1185)
... 17 more
Caused by: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
at sun.security.provider.certpath.SunCertPathBuilder.engineBuild(SunCertPathBuilder.java:174)
at java.security.cert.CertPathBuilder.build(CertPathBuilder.java:238)
at sun.security.validator.PKIXValidator.doBuild(PKIXValidator.java:318)
... 23 more
如前所述,尝试使用JavaMail附带的smtpsend程序。如果以同样的方式失败,则表明您的JDK配置或网络配置有问题。确保您的防病毒程序没有干扰,并确保在防火墙中添加一个排除项。我禁用了avast antivirus 10分钟并使其正常工作。如果您的上下文是android应用程序,
props.put("mail.smtp.ssl.trust", "smtp.gmail.com");
然后确保您的android设备时间设置为当前日期和时间。
基本的例外是
“SSL证书未通过身份验证。”以下是工作解决方案bro。这是有保证的 1) 首先,打开您想发送邮件的gmail帐户,就像您的情况一样“”xyz@gmail.com" 2) 打开下面的链接 3) 单击“转到我帐户中的“不太安全的应用”部分。”选项 4) 然后打开它 5) 就这样(: 这是我的密码
import javax.mail.*;
import javax.mail.internet.*;
import java.util.*;
public class SendEmail {
final String senderEmailID = "Sender Email id";
final String senderPassword = "Sender Pass word";
final String emailSMTPserver = "smtp.gmail.com";
final String emailServerPort = "465";
String receiverEmailID = null;
static String emailSubject = "Test Mail";
static String emailBody = ":)";
public SendEmail(String receiverEmailID, String emailSubject, String emailBody)
{
this.receiverEmailID=receiverEmailID;
this.emailSubject=emailSubject;
this.emailBody=emailBody;
Properties props = new Properties();
props.put("mail.smtp.user",senderEmailID);
props.put("mail.smtp.host", emailSMTPserver);
props.put("mail.smtp.port", emailServerPort);
props.put("mail.smtp.starttls.enable", "true");
props.put("mail.smtp.auth", "true");
props.put("mail.smtp.socketFactory.port", emailServerPort);
props.put("mail.smtp.socketFactory.class","javax.net.ssl.SSLSocketFactory");
props.put("mail.smtp.socketFactory.fallback", "false");
SecurityManager security = System.getSecurityManager();
try
{
Authenticator auth = new SMTPAuthenticator();
Session session = Session.getInstance(props, auth);
MimeMessage msg = new MimeMessage(session);
msg.setText(emailBody);
msg.setSubject(emailSubject);
msg.setFrom(new InternetAddress(senderEmailID));
msg.addRecipient(Message.RecipientType.TO,
new InternetAddress(receiverEmailID));
Transport.send(msg);
System.out.println("Message send Successfully:)");
}
catch (Exception mex)
{
mex.printStackTrace();
}
}
public class SMTPAuthenticator extends javax.mail.Authenticator
{
public PasswordAuthentication getPasswordAuthentication()
{
return new PasswordAuthentication(senderEmailID, senderPassword);
}
}
public static void main(String[] args) {
SendEmail mailSender;
mailSender = new SendEmail("Receiver Email id","Testing Code 2 example","Testing Code Body yess");
}
}
帮助我解决这个问题的是将我安装的jre配置为jre 1.8,在此之前我已经尝试了所有方法 Eclipse中的步骤:Windows>preferences>java>installed JRE>jre1.8.0
如果设置为jdk,则切换到jre(最新java版本默认设置为jre)。卡洛斯的第一个答案对我有用:
session.getProperties().put("mail.smtp.ssl.trust", "smtp.gmail.com");
我已经测试了下面的属性,并为我完美地工作:
session.getProperties().put("mail.smtp.starttls.enable", "true");
这两个属性单独解决了这类问题,但我保证两者都使用。尝试将端口更改为465
mail.smtp.socketFactory.port=465
mail.smtp.port=465
在我的例子中,通过删除行解决了问题
prop.put("mail.smtp.starttls.enable", "true");
这可能是因为电子邮件服务器上的某些ssl配置错误,我不确定。电子邮件服务器管理员从不承认这一点,总是责怪主机提供商:)如果应用程序不支持SMTP主机使用的TLS版本,也可能是这样
例如,当您的应用程序(或使用较旧的javax.mail JAR的java程序)仅支持TLSv1.1时,尝试配置使用TLSv1.2的SMTP服务器而无需回退。在一整天的搜索之后,我禁用了Avast 10分钟,禁用了Windows防火墙(很重要),一切都开始工作了 这是我的错误:
Mail server connection failed; nested exception is javax.mail.MessagingException: Could not convert socket to TLS; nested exception is: javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target. Failed messages: javax.mail.MessagingException: Could not convert socket to TLS; nested exception is: javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
以下是如何通过向SMTP端口587(或应用程序使用的任何端口)添加排除来解决Avast 19.8.2393中的问题:
###### I am using a Google App Password which I generated in my Gmail Security settings ######
spring.mail.host = smtp.gmail.com
spring.mail.port = 587
spring.mail.protocol = smtp
spring.mail.username = gmail account
spring.mail.password = password
spring.mail.properties.mail.smtp.auth=true
spring.mail.properties.mail.smtp.starttls.enable=true
spring.mail.properties.mail.smtp.connectiontimeout=5000
spring.mail.properties.mail.smtp.timeout=5000
spring.mail.properties.mail.smtp.writetimeout=5000
上面的application.properties对我来说太棒了:
spring.mail.properties.mail.smtp.starttls.enable=true
spring.mail.properties.mail.smtp.starttls.required=true
spring.mail.properties.mail.smtp.auth=true
spring.mail.properties.mail.smtp.ssl.trust=smtp.gmail.com
检查JavaMail库的版本(mail.jar或javax.mail.jar)。也许您需要一个更新的。
从这里下载最新版本:是的,它在本地主机上对我有效:
props.put("mail.smtp.ssl.trust", "smtp.gmail.com");
该错误仅在本地主机上引发,因此您也应该在远程服务器上尝试。通常,上面提到的代码片段在没有
ssl的情况下运行良好。trust
property当发送电子邮件的默认ssl协议设置为TLSv1并且smtp服务器不再支持此协议时,我遇到了类似的问题。
诀窍是使用更新的协议:
mail.smtp.ssl.protocols=TLSv1.2请提供完整的堆栈跟踪。您的确切代码在我的machine@Laabidi我已经发布了。它仍然没有,我怎么知道我的JDK配置或网络配置是否有问题?什么仍然没有什么?如果smtpsend以同样的方式失败,这就是为什么你知道问题不是使用您的代码,但使用其他东西,最有可能是您的JDK配置或网络配置。如果您的计算机上运行防火墙或防病毒软件,请在运行测试时尝试禁用。您使用的是哪个版本的JDK?请尝试重新安装JDK,看看是否有帮助。您能否详细说明为什么/如何认为此建议的解决方案我来解决这个问题?这个问题很神奇,但答案可以更好地扩展更多细节,如@Denomales所说。不过这是一个很好的提示。我猜这个道具告诉你程序盲目信任ssl连接是否有正确的证书?来自javamail docs-
mail.smtp.ssl.trust
如果设置了,还有一个套接字f尚未指定actory,启用MailSSLSocketFactory的使用。如果设置为“*”,则所有主机都受信任。如果设置为以空格分隔的主机列表,则这些主机受信任。否则,信任取决于服务器提供的证书。对于我props.put(“mail.smtp.ssl.trust”,“*”)
trick@AryaPourtabatabaie,不。他应该依靠操作系统来自动解决问题。很可能,实际上很可能,他有配置问题。他正在规避设置的保护措施。我是这个问题的受害者,我给出的是我自己的解决方案,真的说。阿瓦斯特在制造问题。塔克斯·布迪萨在我这里,Avast是我的Spring应用程序的问题AVG版本18.1.3044(使用Windows 10)。解决方案:进入名为“Web和电子邮件”的AVG部分并禁用“电子邮件保护”“Avast也是我的问题。当使用spring时,可以在这里找到纯javamail属性:在我的例子中,它是相同的但不同的防病毒软件。谢谢,这帮了我很大的忙谢谢你,这是我的窍门;)是的,就是这样,回答得很好