【问题标题】:android read exchange emails with java mail apiandroid 使用 java mail api 读取交换电子邮件
【发布时间】:2011-07-10 07:37:30
【问题描述】:

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

如何通过证书检查?

我从这里看到了 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

请帮我完成这项工作

【问题讨论】:

  • 你能告诉我你是如何将邮件从你的谷歌帐户导入到应用程序中的吗?
  • 是的,您只需将 com.gmail.com 以及您的用户名和密码放在上面的代码中即可:D

标签: android email exchange-server jakarta-mail


【解决方案1】:

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

【讨论】:

  • 嗨,感谢您的发帖,我有一个来自 microsoft CA 的自签名证书,而 android 似乎在接受此类证书时遇到问题
  • 有点疯狂的问题,但是如果你指向一个有效的公共认证网站,它会抛出错误吗?
  • 嗨卢卡斯,很遗憾我没有公共服务器可以测试,只有谷歌
猜你喜欢
  • 2012-02-21
  • 1970-01-01
  • 2023-04-08
  • 2015-05-13
  • 1970-01-01
  • 2014-06-10
  • 2020-04-19
  • 2011-04-05
  • 1970-01-01
相关资源
最近更新 更多