Javamail无法将套接字转换为TLS GMail

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

我正在尝试通过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.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中的问题:

  • 开放式前卫

  • 点击“设置”

  • 单击“疑难解答”,然后单击“打开旧设置”

  • 再次单击“疑难解答”,向下滚动至“重定向设置”,并删除应用程序使用的端口
  • 就我而言,我刚刚从SMTP端口删除了587

    现在我可以使用Avast,也可以打开Windows防火墙(无需为防火墙添加额外的排除)

    以下是我的应用程序。属性电子邮件属性:

    ###### 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属性:在我的例子中,它是相同的但不同的防病毒软件。谢谢,这帮了我很大的忙谢谢你,这是我的窍门;)是的,就是这样,回答得很好