带有javamail的SSL不起作用

带有javamail的SSL不起作用,java,ssl,smtp,gmail,jakarta-mail,Java,Ssl,Smtp,Gmail,Jakarta Mail,尝试用TSL连接gmail时,我遇到了一些错误MSG。代码如下: import java.util.*; import java.util.logging.*; import javax.mail.*; import javax.mail.internet.*; public class MailHandler extends Handler { public void publish(LogRecord record) { try { String host

尝试用TSL连接gmail时,我遇到了一些错误MSG。代码如下:

import java.util.*;
import java.util.logging.*;
import javax.mail.*;
import javax.mail.internet.*;

public class MailHandler extends Handler {
    public void publish(LogRecord record) {
    try {
        String host = "smtp.gmail.com";
        int port = 587;
        String username = "cookie@gmail.com";
        String password = "cookiepassword";

        Properties props = new Properties();
        props.put("mail.smtp.auth", "true");
        props.put("mail.smtp.starttls.enable", "true");
        //props.setProperty("mail.smtp.ssl.trust", "smtpserver");
        props.put("mail.debug", "true");

        Session session = Session.getInstance(props);

        Message message = new MimeMessage(session);
        message.setFrom(new InternetAddress("cookie@gmail.com"));
        message.setRecipients(Message.RecipientType.TO,InternetAddress.parse("cookie@gmail.com"));
        message.setSubject(record.getMessage());
        message.setText("Auto");

        Transport transport = session.getTransport("smtp");
        transport.connect(host, port, username, password);

        Transport.send(message);
    } catch (MessagingException ex) {
        Logger.getLogger(MailHandler.class.getName()).log(Level.SEVERE, null, ex);
    }
  }
    @Override
    public void close() {}
    @Override
    public void flush() {}
}
我明白了

run:
DEBUG: JavaMail version 1.4.4
DEBUG: successfully loaded resource: /META-INF/javamail.default.providers
DEBUG: Tables of loaded providers
DEBUG: Providers Listed By Class Name: {com.sun.mail.smtp.SMTPSSLTransport=javax.mail.Provider[TRANSPORT,smtps,com.sun.mail.smtp.SMTPSSLTransport,Sun Microsystems, Inc], com.sun.mail.smtp.SMTPTransport=javax.mail.Provider[TRANSPORT,smtp,com.sun.mail.smtp.SMTPTransport,Sun Microsystems, Inc], com.sun.mail.imap.IMAPSSLStore=javax.mail.Provider[STORE,imaps,com.sun.mail.imap.IMAPSSLStore,Sun Microsystems, Inc], com.sun.mail.pop3.POP3SSLStore=javax.mail.Provider[STORE,pop3s,com.sun.mail.pop3.POP3SSLStore,Sun Microsystems, Inc], com.sun.mail.imap.IMAPStore=javax.mail.Provider[STORE,imap,com.sun.mail.imap.IMAPStore,Sun Microsystems, Inc], com.sun.mail.pop3.POP3Store=javax.mail.Provider[STORE,pop3,com.sun.mail.pop3.POP3Store,Sun Microsystems, Inc]}
DEBUG: Providers Listed By Protocol: {imaps=javax.mail.Provider[STORE,imaps,com.sun.mail.imap.IMAPSSLStore,Sun Microsystems, Inc], imap=javax.mail.Provider[STORE,imap,com.sun.mail.imap.IMAPStore,Sun Microsystems, Inc], smtps=javax.mail.Provider[TRANSPORT,smtps,com.sun.mail.smtp.SMTPSSLTransport,Sun Microsystems, Inc], pop3=javax.mail.Provider[STORE,pop3,com.sun.mail.pop3.POP3Store,Sun Microsystems, Inc], pop3s=javax.mail.Provider[STORE,pop3s,com.sun.mail.pop3.POP3SSLStore,Sun Microsystems, Inc], smtp=javax.mail.Provider[TRANSPORT,smtp,com.sun.mail.smtp.SMTPTransport,Sun Microsystems, Inc]}
DEBUG: successfully loaded resource: /META-INF/javamail.default.address.map
DEBUG: getProvider() returning javax.mail.Provider[TRANSPORT,smtp,com.sun.mail.smtp.SMTPTransport,Sun Microsystems, Inc]
DEBUG SMTP: useEhlo true, useAuth true
DEBUG SMTP: trying to connect to host "smtp.gmail.com", port 587, isSSL false
220 mx.google.com ESMTP b5sm13118062wbh.4
DEBUG SMTP: connected to host "smtp.gmail.com", port: 587

EHLO FloWorkLinux
250-mx.google.com at your service, [95.146.161.196]
250-SIZE 35882577
250-8BITMIME
250-STARTTLS
250 ENHANCEDSTATUSCODES
DEBUG SMTP: Found extension "SIZE", arg "35882577"
DEBUG SMTP: Found extension "8BITMIME", arg ""
DEBUG SMTP: Found extension "STARTTLS", arg ""
DEBUG SMTP: Found extension "ENHANCEDSTATUSCODES", arg ""
STARTTLS
220 2.0.0 Ready to start TLS
09-Dec-2011 17:05:32 smsalertor.MailHandler publish
SEVERE: null
javax.mail.MessagingException: Could not convert socket to TLS;
  nested exception is:
    java.net.SocketException: java.security.NoSuchAlgorithmException: Error constructing implementation (algorithm: Default, provider: SunJSSE, class: sun.security.ssl.DefaultSSLContextImpl)
    at com.sun.mail.smtp.SMTPTransport.startTLS(SMTPTransport.java:1880)
    at com.sun.mail.smtp.SMTPTransport.protocolConnect(SMTPTransport.java:648)
    at javax.mail.Service.connect(Service.java:295)
    at smsalertor.MailHandler.publish(MailHandler.java:33)
    at smsalertor.SMSAlertor.main(SMSAlertor.java:107)
Caused by: java.net.SocketException: java.security.NoSuchAlgorithmException: Error constructing implementation (algorithm: Default, provider: SunJSSE, class: sun.security.ssl.DefaultSSLContextImpl)
    at javax.net.ssl.DefaultSSLSocketFactory.throwException(SSLSocketFactory.java:196)
    at javax.net.ssl.DefaultSSLSocketFactory.createSocket(SSLSocketFactory.java:216)
    at com.sun.mail.util.SocketFetcher.startTLS(SocketFetcher.java:432)
    at com.sun.mail.smtp.SMTPTransport.startTLS(SMTPTransport.java:1875)
    ... 4 more
Caused by: java.security.NoSuchAlgorithmException: Error constructing implementation (algorithm: Default, provider: SunJSSE, class: sun.security.ssl.DefaultSSLContextImpl)
    at java.security.Provider$Service.newInstance(Provider.java:1262)
    at sun.security.jca.GetInstance.getInstance(GetInstance.java:236)
    at sun.security.jca.GetInstance.getInstance(GetInstance.java:164)
    at javax.net.ssl.SSLContext.getInstance(SSLContext.java:142)
    at javax.net.ssl.SSLContext.getDefault(SSLContext.java:85)
    at javax.net.ssl.SSLSocketFactory.getDefault(SSLSocketFactory.java:119)
    at com.sun.mail.util.SocketFetcher.startTLS(SocketFetcher.java:427)
    ... 5 more
Caused by: java.io.EOFException
    at java.io.DataInputStream.readInt(DataInputStream.java:392)
    at sun.security.provider.JavaKeyStore.engineLoad(JavaKeyStore.java:645)
    at sun.security.provider.JavaKeyStore$JKS.engineLoad(JavaKeyStore.java:55)
    at java.security.KeyStore.load(KeyStore.java:1201)
    at sun.security.ssl.TrustManagerFactoryImpl.getCacertsKeyStore(TrustManagerFactoryImpl.java:221)
    at sun.security.ssl.DefaultSSLContextImpl.getDefaultTrustManager(DefaultSSLContextImpl.java:87)
    at sun.security.ssl.DefaultSSLContextImpl.<init>(DefaultSSLContextImpl.java:57)
    at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
    at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:57)
    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
    at java.lang.reflect.Constructor.newInstance(Constructor.java:532)
    at java.lang.Class.newInstance0(Class.java:372)
    at java.lang.Class.newInstance(Class.java:325)
    at java.security.Provider$Service.newInstance(Provider.java:1238)
    ... 11 more
BUILD SUCCESSFUL (total time: 10 seconds)
有人见过这个吗

编辑:

谈论如何将10分钟的复制粘贴教程变成一整天的头痛。我仍然没有解决这个问题,但是,我已经读了越来越多的书。显然,我需要一个公共ssl签名库来与之进行比较。这应该是沿着
/usr/lib/jvm/java-6-sun-1.6.0.26/jre/lib/security
的路径进行的。使用
sudo-update-alternations--config java
我将其指向
/usr/lib/jvm/java-6-sun/jre/bin/java
,它反过来指向该文件夹,但是,还有一个
/usr/lib/jvm/default-java
符号链接不受此影响,当前指向
java-6-openjdk
,如果我查看该文件夹,它丢失了安全证书。而这正是NetBeans所使用的。哦,快乐

根据建议,我确实安装了libbcprov java,它将我的安全文件夹放在了openjdk中(在与sunjdk混了一段时间之后,它现在大概已经安装好了,但谁知道在哪里,因为它没有出现在
/usr/lib/jvm/
中)


这仍然会产生相同的错误消息。因此我把它移到了Windows上,试着编译,结果发现上面的代码不是很好用(对我们来说没关系,因为非工作位在SSL位之后)(嘿,谢谢所有不正确的教程,真是一团糟)。无论如何,终于找到了解决方案(尽管其中有相当多的冗余,虽然不是TLS而是SSL,但嘿,…)。在任何情况下,所有的工作都很好和顺利,所以回到Ubuntu和叮咚,同样的错误消息如上所述。显然,密钥库周围似乎存在问题。我仍然不知道如何修复它(当前错误是上面提到的第一个错误)。

我没有看到它,但异常情况表明您没有将smtp服务器证书放入您的
trustedca
文件,或者此文件不可用。

我最近修复了此区域中可能与您的问题相关的错误。试试最新的快照版本。

嗯,原来sun jdk刚刚安装在jre之上。美好的因此,我的java-6-sun-1.6.0.26现在是一个jdk。随便哪个。适合我


无论如何,将
/usr/lib/jvm/default java
重新发布到我新升级的sun jdk文件夹中,将NetBeans从openjdk切换到sun jdk,并让它运行起来。

根据keytool、truststore、cacerst等,尝试数百种想法花了好几天时间。 但最后我必须简单地设置mail.smtp.ssl.trust属性:

props.setProperty(“mail.smtp.ssl.trust”、“smtpserver”)

更改

  props.put("mail.smtp.auth", "true");
  props.put("mail.smtp.starttls.enable", "true");


然后程序正确运行

最终解决。我尽一切努力在exchange服务器上获得身份验证,但没有成功。使用以下代码:

Properties props = (Properties)System.getProperties().clone();
props.put("mail.smtp.host", host);
props.setProperty("mail.smtp.port", "587");
props.put("mail.smtp.auth", true);

//Bypass the SSL authentication
props.put("mail.smtp.ssl.enable", false);
props.put("mail.smtp.starttls.enable", false);
不! 根据 imap值也类似。 所有值都必须在for中以字符串形式给出(这也是属性的“性质”),例如,对于int为123的“123”或对于boolean true的“true”。 例外情况: javax.mail.MessagineException:java.security.NoSuchAlgorithmException:Error con 结构化实现(算法:默认,提供程序:SunJSSE,类:sun.secu ssl.SSLContextImpl$DefaultSSLContext) 基于“旧”窗口(如vista、XP)上不受支持的TLS(请参阅MS博客)。 我取消了对javax.mail.jar包的共享,并跟踪到导致此奇怪异常的行:它位于源SocketFetcher.java(package com.sun.mail.util;)中,正好位于该行的方法createSocket() mailssslsocketfactory msf=新的mailssslsocketfactory(); 当我查看这个mailssocketfactory.java时,它说:

    public MailSSLSocketFactory() throws GeneralSecurityException {
      this("TLS");
    }

是的,这就是为什么。。。我不认为我需要这样做,毕竟,电子邮件客户端似乎马上就能工作。。。我该怎么做?嗯,这很容易,但你必须明白,你在做什么。查看keytool doc:我们的想法是通过
keytool
cmd将证书导入$JRE_HOME\lib\security\cacerts文件。您能否更具体地了解错误的原因?它与需要服务器身份检查时SSL协议的处理方式有关。旧代码适用于某些服务器,但不适用于其他服务器。固定版本更为正确。但听起来你的问题毕竟是证书问题,Ubuntu安装JDK的方式让问题变得复杂。您可能还对有关证书的JavaMail常见问题解答条目感兴趣。有一个死链接,请查找详细信息。注意:即使您使用SMTPS(即在单独端口上使用SSL/TLS的SMTP,而不是在同一端口上使用
STARTTLS
)的SMTP),您也可能正在使用TLS(即IETF中SSL的后续版本)。这不是SSL和TLS之间的区别。(由于某些原因,您使用的不同之处在于某些工具(如MS Outlook)所使用的,但这并不正确。)我认为这不正确:请参阅。它说“属性总是被设置为字符串;类型列描述了字符串的解释方式。”文档清楚地表明,即使继承了哈希表并且具有
put
,也强烈反对使用它来设置属性对。关闭SSL并不能解决与SSL相关的问题!这只是关闭绕过安全层的主机的证书检查。这不是问题的真正解决方案。。。
Properties props = (Properties)System.getProperties().clone();
props.put("mail.smtp.host", host);
props.setProperty("mail.smtp.port", "587");
props.put("mail.smtp.auth", true);

//Bypass the SSL authentication
props.put("mail.smtp.ssl.enable", false);
props.put("mail.smtp.starttls.enable", false);
    public MailSSLSocketFactory() throws GeneralSecurityException {
      this("TLS");
    }