Android читать обмен электронной почтой с java mail api

Я хочу читать свои электронные письма с ms exchange, я использую Java mail 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;

Как я могу пройти проверку сертификата?

Я видел пример Vynayak здесь: Отправка электронной почты в Android с помощью JavaMail API без использования стандартного/встроенного приложения

что он использует какой-то класс 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];

  }

} 

И DummySoketSSLFFactory:

  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

Пожалуйста, помогите мне получить эту работу


person Cata    schedule 07.03.2011    source источник
comment
Можете ли вы сказать мне, как вы импортировали почту из своей учетной записи Google в приложение?   -  person Ronil    schedule 15.03.2011
comment
Да, вы просто указываете com.gmail.com и свое имя пользователя и пароль в приведенном выше коде :D   -  person Cata    schedule 16.03.2011


Ответы (1)


Самое простое решение — создать самоподписывающий сертификат. Пример здесь.

person Lucas B    schedule 07.03.2011
comment
Привет, спасибо за публикацию, у меня есть самоподписанный сертификат от ЦС Microsoft, и у Android, похоже, проблемы с приемом таких сертификатов. - person Cata; 07.03.2011
comment
Какой-то сумасшедший вопрос, но выдает ли он ошибку, если вы указываете на действительный общедоступный сертифицированный сайт? - person Lucas B; 07.03.2011
comment
Привет Лукас, к сожалению, у меня нет общедоступного сервера для тестирования, только Google - person Cata; 08.03.2011