android阅读与java邮件api的交换电子邮件

问题描述:

我想从ms交换中读取我的电子邮件,我从这里使用java邮件api http://code.google.com/p/javamail-android/,并且我已经成功从我的Google帐户中提取电子邮件...交换问题是我拥有它本地,我没有公共证书和Android给我03-07 13:12:25.708: WARN/System.err(3886): javax.mail.MessagingException: Not trusted server certificate; android阅读与java邮件api的交换电子邮件

我怎样才能通过证书检查?

我见过Vynayak的例子在这里:Sending Email in Android using JavaMail API without using the default/built-in app

,他使用了一些的TrustManager类,我曾试图做出太多,但我不知道如何trustFactory类链接到IMAP性能。

到目前为止,我有这在我的活动:

Properties props = new Properties(); 
    props.setProperty("mail.store.protocol", "imaps"); 

    props.setProperty("mail.store.socketFactory.class", 
       "com.imap.DummySSLSocketFactory"); 


    // Prevents to fall into NOT-secure connection 
    props.setProperty("mail.pop3.socketFactory.fallback", "false"); 

    try { 
     Session session = Session.getDefaultInstance(props, null); 
     Store store = session.getStore("imaps"); 
     store.connect("mail.domain.com", "user", "pass"); 

     System.out.println(store); 

     Folder inbox = store.getFolder("Inbox"); 
     inbox.open(Folder.READ_ONLY); 
     Message messages[] = inbox.getMessages(); 
     for (Message message : messages) { 
      System.out.println(message); 
     } 
    } catch (NoSuchProviderException e) { 
     e.printStackTrace(); 
     System.exit(1); 
    } catch (MessagingException e) { 
     e.printStackTrace(); 
     System.exit(2); 
    } 

在这里,我知道,行props.setProperty("mail.store.socketFactory.class", "com.imap.DummySSLSocketFactory");没有正确执行,因为我不知道我该如何使用它机智IMAPS ..

而且DummyTrustManager:

package com.imap; 

import javax.net.ssl.X509TrustManager; 
import java.security.cert.CertificateException; 
import java.security.cert.X509Certificate; 

public class DummyTrustManager implements X509TrustManager { 

    public void checkClientTrusted(X509Certificate[] cert, String authType) throws CertificateException { 

     // everything is trusted 

    } 

    public void checkServerTrusted(X509Certificate[] cert, String authType) throws CertificateException { 

     // everything is trusted 

    } 

    public X509Certificate[] getAcceptedIssuers() { 

     return new X509Certificate[0]; 

    } 

} 

而且DummySoketSSLFactory:

package com.imap; 

    import java.io.IOException; 
    import java.net.InetAddress; 
    import java.net.Socket; 
    import javax.net.SocketFactory; 
    import javax.net.ssl.*; 

    public class DummySSLSocketFactory extends SSLSocketFactory { 

     private SSLSocketFactory factory; 

     public DummySSLSocketFactory() { 

      try { 

       SSLContext sslcontext = SSLContext.getInstance("TLS"); 

       sslcontext.init(null, 

            new TrustManager[] { new DummyTrustManager() }, 

            null); 

       factory = (SSLSocketFactory)sslcontext.getSocketFactory(); 

      } catch(Exception ex) { 

      } 

     } 

     public static SocketFactory getDefault() { 

      return new DummySSLSocketFactory(); 

     } 

     public Socket createSocket() throws IOException { 

      return factory.createSocket(); 

     } 

     public Socket createSocket(Socket socket, String s, int i, boolean flag) 

            throws IOException { 

      return factory.createSocket(socket, s, i, flag); 

     } 

     public Socket createSocket(InetAddress inaddr, int i, 

            InetAddress inaddr1, int j) throws IOException { 

      return factory.createSocket(inaddr, i, inaddr1, j); 

     } 

     public Socket createSocket(InetAddress inaddr, int i) 

            throws IOException { 

      return factory.createSocket(inaddr, i); 
} 

     public Socket createSocket(String s, int i, InetAddress inaddr, int j) 

            throws IOException { 

      return factory.createSocket(s, i, inaddr, j); 

     } 

     public Socket createSocket(String s, int i) throws IOException { 

      return factory.createSocket(s, i); 

     } 

     public String[] getDefaultCipherSuites() { 

      return factory.getDefaultCipherSuites(); 

     } 

     public String[] getSupportedCipherSuites() { 

      return factory.getSupportedCipherSuites(); 

     } 

    } 

伪类是从http://www.anddev.org/advanced-tutorials-f21/javamail-and-android-little-excursus-t3093.html

请帮我得到这个工作

+0

你能告诉我你是如何将你的谷歌账户中的邮件导入到应用程序中的吗? – Ronil 2011-03-15 13:29:15

+0

是的,你只需在上面的代码中放置com.gmail.com和你的用户名和密码:D – Cata 2011-03-16 07:53:17

最简单的解决方案是创建一个自签名证书。 Example here.

+0

嗨,感谢发布,我有一个来自微软CA的自签名证书,并且android似乎接受这样的证书有问题 – Cata 2011-03-07 13:12:31

+0

这是一个疯狂的问题,但是如果你指向有效的公共认证网站,它会抛出错误吗? – 2011-03-07 18:29:06

+0

嗨卢卡斯,不幸的是我没有公共服务器来测试,只有谷歌 – Cata 2011-03-08 06:35:09