如何解决以下问题:javax.mail.MessaginException:无法连接到SMTP主机:SMTP.gmail.com,端口:465;?

如何解决以下问题:javax.mail.MessaginException:无法连接到SMTP主机:SMTP.gmail.com,端口:465;?,java,android,email,smtp,jakarta-mail,Java,Android,Email,Smtp,Jakarta Mail,我试图增加通过Android应用程序向电子邮件发送订单的可能性。但是被卡住了。 我在谷歌账户中启用了不太安全的访问。起初,我用过。 最后,我尝试应用我在这里找到的其他答案的各种属性,但仍然没有用 以下是我的部分代码: Properties props = new Properties(); props.put("mail.smtp.user", Utils.EMAIL); props.put("mail.smtp.host"

我试图增加通过Android应用程序向电子邮件发送订单的可能性。但是被卡住了。 我在谷歌账户中启用了不太安全的访问。起初,我用过。 最后,我尝试应用我在这里找到的其他答案的各种属性,但仍然没有用

以下是我的部分代码:

Properties props = new Properties();

        props.put("mail.smtp.user", Utils.EMAIL);
        props.put("mail.smtp.host", "smtp.gmail.com");
        props.put("mail.smtp.port", "465");
        props.put("mail.smtp.starttls.enable","true");
        props.put("mail.smtp.debug", "true");
        props.put("mail.smtp.auth", "true");
        props.put("mail.smtp.socketFactory.port", "465");
        props.put("mail.smtp.socketFactory.class", "javax.net.ssl.SSLSocketFactory");
        props.put("mail.smtp.socketFactory.fallback", "false");


        mSession = Session.getInstance(props,
                new javax.mail.Authenticator() {
                    protected PasswordAuthentication getPasswordAuthentication() {
                        return new PasswordAuthentication(Utils.EMAIL, Utils.PASSWORD);
                    }
                });
        mSession.setDebug(true);

        MimeMessage mm = new MimeMessage(mSession);

        try {

            mm.setFrom(new InternetAddress(Utils.EMAIL));

            mm.addRecipient(Message.RecipientType.TO, new InternetAddress(toEmail));

            mm.setSubject(mSubject);

            mm.setText(mMessage);

            Transport transport = mSession.getTransport("smtps");
            transport.connect("smtp.gmail.com", Integer.valueOf("465"), Utils.EMAIL, Utils.PASSWORD);
            transport.sendMessage(mm, mm.getAllRecipients());
            transport.close();
            

        } catch (AddressException e) {
            e.printStackTrace();
        }  catch (MessagingException e) {
            e.printStackTrace();
        }
信息:

W/System.err: javax.mail.MessagingException: Could not connect to SMTP host: smtp.gmail.com, port: 465;
      nested exception is:
        javax.net.ssl.SSLHandshakeException: java.security.cert.CertPathValidatorException: Trust anchor for certification path not found.
W/System.err:     at com.sun.mail.smtp.SMTPTransport.openServer(SMTPTransport.java:1391)
        at com.sun.mail.smtp.SMTPTransport.protocolConnect(SMTPTransport.java:412)
        at javax.mail.Service.connect(Service.java:288)
        at com.example.daukenclub.MailAPI.JavaMailAPI.doInBackground(JavaMailAPI.java:97)
        at com.example.daukenclub.MailAPI.JavaMailAPI.doInBackground(JavaMailAPI.java:20)
        at android.os.AsyncTask$3.call(AsyncTask.java:378)
        at java.util.concurrent.FutureTask.run(FutureTask.java:266)
        at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:289)
W/System.err:     at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1167)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:641)
        at java.lang.Thread.run(Thread.java:919)
    Caused by: javax.net.ssl.SSLHandshakeException: java.security.cert.CertPathValidatorException: Trust anchor for certification path not found.
        at com.android.org.conscrypt.ConscryptFileDescriptorSocket.startHandshake(ConscryptFileDescriptorSocket.java:231)
W/System.err:     at com.android.org.conscrypt.ConscryptFileDescriptorSocket.waitForHandshake(ConscryptFileDescriptorSocket.java:476)
        at com.android.org.conscrypt.ConscryptFileDescriptorSocket.getInputStream(ConscryptFileDescriptorSocket.java:439)
        at com.sun.mail.smtp.SMTPTransport.initStreams(SMTPTransport.java:1449)
        at com.sun.mail.smtp.SMTPTransport.openServer(SMTPTransport.java:1366)
        ... 10 more
W/System.err: Caused by: java.security.cert.CertificateException: java.security.cert.CertPathValidatorException: Trust anchor for certification path not found.
        at com.android.org.conscrypt.TrustManagerImpl.verifyChain(TrustManagerImpl.java:674)
        at com.android.org.conscrypt.TrustManagerImpl.checkTrustedRecursive(TrustManagerImpl.java:551)
        at com.android.org.conscrypt.TrustManagerImpl.checkTrustedRecursive(TrustManagerImpl.java:617)
        at com.android.org.conscrypt.TrustManagerImpl.checkTrusted(TrustManagerImpl.java:507)
        at com.android.org.conscrypt.TrustManagerImpl.checkTrusted(TrustManagerImpl.java:426)
        at com.android.org.conscrypt.TrustManagerImpl.getTrustedChainForServer(TrustManagerImpl.java:354)
        at android.security.net.config.NetworkSecurityTrustManager.checkServerTrusted(NetworkSecurityTrustManager.java:94)
W/System.err:     at android.security.net.config.RootTrustManager.checkServerTrusted(RootTrustManager.java:89)
        at com.android.org.conscrypt.Platform.checkServerTrusted(Platform.java:224)
        at com.android.org.conscrypt.ConscryptFileDescriptorSocket.verifyCertificateChain(ConscryptFileDescriptorSocket.java:407)
        at com.android.org.conscrypt.NativeCrypto.SSL_do_handshake(Native Method)
        at com.android.org.conscrypt.NativeSsl.doHandshake(NativeSsl.java:387)
        at com.android.org.conscrypt.ConscryptFileDescriptorSocket.startHandshake(ConscryptFileDescriptorSocket.java:226)
        ... 14 more
    Caused by: java.security.cert.CertPathValidatorException: Trust anchor for certification path not found.
        ... 27 more

如果您能提供任何有用的建议,我将不胜感激。

我知道一个解决方案,但正在使用okHttp客户端。您需要一个sslSocketFactory工具

 val client = OkHttpClient.Builder()
        .sslSocketFactory(tlsTocketFactory, tlsTocketFactory.trustManager)
        .build()
这是TLSSocketFactory类

import java.io.IOException
import java.net.InetAddress
import java.net.Socket
import java.net.UnknownHostException
import java.security.KeyStore
import java.security.KeyStoreException
import java.security.NoSuchAlgorithmException
import java.util.*
import javax.net.ssl.*

class TLSSocketFactory : SSLSocketFactory() {
private val delegate: SSLSocketFactory
private lateinit var trustManagers: Array<TrustManager>

@Throws(KeyStoreException::class, NoSuchAlgorithmException::class)
private fun generateTrustManagers() {
    val trustManagerFactory =
        TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm())
    trustManagerFactory.init(null as KeyStore?)

    val trustManagers =
        trustManagerFactory.trustManagers
    check(!(trustManagers.size != 1 || trustManagers[0] !is X509TrustManager)) {
        ("Unexpected default trust managers:"
                + Arrays.toString(trustManagers))
    }

    this.trustManagers = trustManagers
}

override fun getDefaultCipherSuites(): Array<String> {
    return delegate.defaultCipherSuites
}

override fun getSupportedCipherSuites(): Array<String> {
    return delegate.supportedCipherSuites
}

@Throws(IOException::class)
override fun createSocket(): Socket {
    return enableTLSOnSocket(delegate.createSocket())
}

@Throws(IOException::class)
override fun createSocket(
    s: Socket,
    host: String,
    port: Int,
    autoClose: Boolean
): Socket {
    return enableTLSOnSocket(delegate.createSocket(s, host, port, autoClose))
}

@Throws(IOException::class, UnknownHostException::class)
override fun createSocket(host: String, port: Int): Socket {
    return enableTLSOnSocket(delegate.createSocket(host, port))
}

@Throws(IOException::class, UnknownHostException::class)
override fun createSocket(
    host: String,
    port: Int,
    localHost: InetAddress,
    localPort: Int
): Socket {
    return enableTLSOnSocket(delegate.createSocket(host, port, localHost, localPort))
}

@Throws(IOException::class)
override fun createSocket(host: InetAddress, port: Int): Socket {
    return enableTLSOnSocket(delegate.createSocket(host, port))
}

@Throws(IOException::class)
override fun createSocket(
    address: InetAddress,
    port: Int,
    localAddress: InetAddress,
    localPort: Int
): Socket {
    return enableTLSOnSocket(delegate.createSocket(address, port, localAddress, localPort))
}

private fun enableTLSOnSocket(socket: Socket): Socket {
    if (socket is SSLSocket) {
        socket.enabledProtocols = arrayOf(
            "TLSv1.1",
            "TLSv1.2"
        )
    }
    return socket
}

val trustManager: X509TrustManager?
    get() = trustManagers[0] as X509TrustManager

init {
    generateTrustManagers()
    val context = SSLContext.getInstance("TLS")
    context.init(null, trustManagers, null)
    delegate = context.socketFactory
}
}
import java.io.IOException
导入java.net.InetAddress
导入java.net.Socket
导入java.net.UnknownHostException
导入java.security.KeyStore
导入java.security.KeyStoreException
导入java.security.NoSuchAlgorithmException
导入java.util*
导入javax.net.ssl*
类TLSSocketFactory:SSLSocketFactory(){
私有val委托:SSLSocketFactory
私有lateinit var信任管理器:数组
@抛出(KeyStoreException::类,NoSuchAlgorithmException::类)
私人娱乐生成器eTrustManager(){
瓦尔信托管理工厂=
TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm())
trustManagerFactory.init(作为密钥库为null?)
瓦尔信托基金经理=
trustManagerFactory.TrustManager
选中(!(trustManagers.size!=1 | | trustManagers[0]!是X509TrustManager)){
(“意外的默认信任管理器:”
+Arrays.toString(信任管理器))
}
this.trustManagers=trustManagers
}
重写GetDefaultCipherSuite():数组{
返回delegate.defaultCipherSuite
}
重写GetSupportedCipherSuite():数组{
返回delegate.supportedCipherSuite
}
@抛出(IOException::类)
重写createSocket():套接字{
return enableTLSOnSocket(delegate.createSocket())
}
@抛出(IOException::类)
重写createSocket(
s:插座,
主持人:字符串,
端口:Int,
自动关闭:布尔值
):插座{
return enableTLSOnSocket(delegate.createSocket(s、主机、端口、自动关闭))
}
@抛出(IOException::class,UnknownHostException::class)
重写createSocket(主机:字符串,端口:Int):套接字{
return enableTLSOnSocket(委托.createSocket(主机,端口))
}
@抛出(IOException::class,UnknownHostException::class)
重写createSocket(
主持人:字符串,
端口:Int,
localHost:InetAddress,
本地端口:Int
):插座{
return enableTLSOnSocket(delegate.createSocket(主机、端口、本地主机、本地端口))
}
@抛出(IOException::类)
重写createSocket(主机:InetAddress,端口:Int):套接字{
return enableTLSOnSocket(委托.createSocket(主机,端口))
}
@抛出(IOException::类)
重写createSocket(
地址:,
端口:Int,
localAddress:InetAddress,
本地端口:Int
):插座{
return enableTLSOnSocket(delegate.createSocket(地址、端口、本地地址、本地端口))
}
私人娱乐使能SonSonSocket(socket:socket):socket{
if(插座为SSLSocket){
socket.enabledProtocols=arrayOf(
“TLSv1.1”,
“TLSv1.2”
)
}
返回插座
}
val trustManager:X509TrustManager?
get()=信任管理器[0]作为X509TrustManager
初始化{
GenerateTrustManager()
val context=SSLContext.getInstance(“TLS”)
init(null,trustManagers,null)
delegate=context.socketFactory
}
}

这是否回答了您的问题?很遗憾,没有。您的系统中是否安装了防病毒软件或防火墙?尝试禁用它是的。忘了提到我在Android studio的emulator上运行时看到了这条消息。