2010-07-21 17 views
7

Próbowałem napisać aplikację, która okresowo analizuje zawartość wiadomości w Gmailu. Przechodziłem przez często zadawane pytania dotyczące JavaMail i zapoznałem się z wieloma przykładami w pakiecie pobierania JavaMail, ale nie mogłem tego zrobić. Poniższy kod aktualnie powoduje następujący błąd Gmail:Czy są jakieś dobre krótkie przykłady kodu, które po prostu czytają nową wiadomość Gmaila?

Host is unresolved: imaps.gmail.com:993

Próbowałem również imap.gmail.com:143 ale otrzymujemy:

Host is unresolved: imap.gmail.com:143

Każda pomoc lub porady będą bardzo mile widziane. GMailReader jest klasa używam spróbować i powrócić wiadomości Gmail IMAP:

public class GMailReader extends javax.mail.Authenticator { 
    private String mailhost = "imaps.gmail.com"; 
    private String user; 
    private String password; 
    private Session session; 
    public GMailReader(String user, String password) { 
     this.user = user; 
     this.password = password; 
     Properties props = new Properties(); 
     props.setProperty("mail.transport.protocol", "imaps"); 
     props.setProperty("mail.imaps.host", mailhost); 
     props.put("mail.imaps.auth", "true"); 
     props.put("mail.imaps.port", "993"); 
     props.put("mail.imaps.socketFactory.port", "993"); 
     props.put("mail.imaps.socketFactory.class", 
        "javax.net.ssl.SSLSocketFactory"); 
     props.put("mail.imaps.socketFactory.fallback", "false"); 
     props.setProperty("mail.imaps.quitwait", "false"); 
     session = Session.getDefaultInstance(props, this); 
    } 
    public synchronized Message[] readMail() throws Exception { 
     try { 
      Store store = session.getStore("imaps"); 
      store.connect("imaps.gmail.com", user, password); 
      Folder folder = store.getFolder("INBOX"); 
      folder.open(Folder.READ_ONLY); 
      Message[] msgs = folder.getMessages(1, 10); 
      FetchProfile fp = new FetchProfile(); 
      fp.add(FetchProfile.Item.ENVELOPE); 
      folder.fetch(msgs, fp); 
      return msgs; 
     } catch (Exception e) { 
      Log.e("readMail", e.getMessage(), e); 
      return null; 
     } 
    } 
} 

Odpowiedz

5

znalazłem przykład here że był pomocny. Mój błąd polegał na używaniu "mail.transport.protocol" zamiast "mail.store.protocol".

+0

Host jest nierozwiązany: imaps.gmail.com. Jak mogę rozwiązać ten problem? –

+0

Nie ma to związku z pierwotnym pytaniem. Otwórz nowe pytanie, które zawiera Twój kod, co działa, co nie działa, komunikat o błędzie, itp. Podczas pisania wiadomości możesz znaleźć odpowiedź na pytania, które pojawiają się w odpowiedzi. – jacknad

2

widzę, że pojęcie GmailReader bardzo przydatne i dobrze zaprojektowane zgodnie pokojowe przykładzie GmailSender pokazał tutaj: Sending Email in Android using JavaMail API without using the default/built-in app

ale każdy news, od błędu poprosił poniżej? I wdrożenie propozycji JackN?

Pozdrawiam SKN

+0

Podobno zgodnie z dokumentem javamail: http://www.oracle.com/technetwork/java/faq-135477.html#gmail Aby połączyć się z Gmailem przy użyciu protokołu IMAP zamiast protokołu POP3, wystarczy zmienić nazwę hosta " pop.gmail.com "do" imap.gmail.com "i zmień nazwę protokołu" pop3s "na" imaps "w powyższych instrukcjach. – snakeman

4

dalej skorygowana wersja

public class GMailReader extends javax.mail.Authenticator { 
    private static final String TAG = "GMailReader"; 

    private String mailhost = "imap.gmail.com"; 
    private Session session; 
    private Store store; 

    public GMailReader(String user, String password) { 

     Properties props = System.getProperties(); 
     if (props == null){ 
     Log.e(TAG, "Properties are null !!"); 
     }else{ 
     props.setProperty("mail.store.protocol", "imaps");    

     Log.d(TAG, "Transport: "+props.getProperty("mail.transport.protocol")); 
     Log.d(TAG, "Store: "+props.getProperty("mail.store.protocol")); 
     Log.d(TAG, "Host: "+props.getProperty("mail.imap.host")); 
     Log.d(TAG, "Authentication: "+props.getProperty("mail.imap.auth")); 
     Log.d(TAG, "Port: "+props.getProperty("mail.imap.port")); 
     } 
    try { 
     session = Session.getDefaultInstance(props, null); 
     store = session.getStore("imaps"); 
     store.connect(mailhost, user, password); 
     Log.i(TAG, "Store: "+store.toString()); 
    } catch (NoSuchProviderException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } catch (MessagingException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 
} 

public synchronized Message[] readMail() throws Exception { 
    try { 
     Folder folder = store.getFolder("Inbox"); 
     folder.open(Folder.READ_ONLY); 

     /* TODO to rework 
     Message[] msgs = folder.getMessages(1, 10); 
     FetchProfile fp = new FetchProfile(); 
     fp.add(FetchProfile.Item.ENVELOPE); 
     folder.fetch(msgs, fp); 
     */ 
     Message[] msgs = folder.getMessages(); 
     return msgs; 
    } catch (Exception e) { 
     Log.e("readMail", e.getMessage(), e); 
     return null; 
    } 
} 
} 

Bye

2

Po ogromnej ilości prób, błędów i googlowania, wydanie snakeman w tej odpowiedzi dostarczyło praktycznego przykładu I potrzebne do czytania w Gmailu;

Jednak inne osoby powinny mieć świadomość (jeśli korzystasz z nowszych wersji zestawu SDK systemu Android) wymagań Manifest dotyczących uprawnień i potrzeby użycia asyncTask do przenoszenia potencjalnie długich zadań poza główny wątek interfejsu użytkownika, z których oba są wymienione w this SMTP example

Powinienem także wspomnieć, że jeśli, tak jak ja, zamierzasz także zaimplementować klasę wysyłania smtp, widziałem gdzieś dyskusję sugerującą, że sesja.getInstance powinna być używana zamiast session.getDefaultInstance.

Powiązane problemy