2013-01-09 8 views
6

Ich versuche, einen einfachen IMAP/SMTP-Gmail-Client mit dem Token vom Android AccountManager anstelle von Benutzername und Passwort zu implementieren. Ich versuche, "mail" als authTokenType-Parameter für getAuthToken() zu verwenden.IMAP/SMTP-Authentifizierung mit AccountManager-Token

Google bietet dieses Beispiel für SMTP/IMAP mit oauth2 http://code.google.com/p/google-mail-oauth2-tools/source/browse/#svn%2Ftrunk%2Fjava%2Fcom%2Fgoogle%2Fcode%2Fsamples%2Foauth2 http://code.google.com/p/google-mail-oauth2-tools/wiki/JavaSampleCode

aber es ist für Java. In meinem Android-Projekt gibt es einige importieren (über SASL) fehlt. Um sie zu lösen Ich benutze diese Bibliothek http://code.google.com/p/asmack/

Das Beispiel kompilieren, aber ich merke, ein Problem zur Laufzeit

10-04 10:05:44.715: I/System.out(1226): DEBUG: setDebug: JavaMail version 1.4.1 
10-04 10:05:44.750: I/System.out(1226): DEBUG: mail.imap.fetchsize: 16384 
10-04 10:05:44.750: I/System.out(1226): DEBUG: enable SASL 
10-04 10:05:44.750: I/System.out(1226): DEBUG: SASL mechanisms allowed: XOAUTH2 
10-04 10:05:46.137: I/System.out(1226): * OK Gimap ready for requests from 84.221.66.29 o42if871216eef.60 
10-04 10:05:46.137: I/System.out(1226): A0 CAPABILITY 
10-04 10:05:46.805: I/System.out(1226): * CAPABILITY IMAP4rev1 UNSELECT IDLE NAMESPACE QUOTA ID XLIST CHILDREN X-GM-EXT-1 XYZZY SASL-IR AUTH=XOAUTH AUTH=XOAUTH2 
10-04 10:05:46.805: I/System.out(1226): A0 OK Thats all she wrote! o42if871216eef.60 
10-04 10:05:46.805: I/System.out(1226): IMAP DEBUG: AUTH: XOAUTH 
10-04 10:05:46.805: I/System.out(1226): IMAP DEBUG: AUTH: XOAUTH2 
10-04 10:05:46.813: I/System.out(1226): DEBUG: protocolConnect login, host=imap.gmail.com, [email protected], password=<non-null> 
10-04 10:05:46.813: I/dalvikvm(1226): Could not find method javax.security.sasl.Sasl.createSaslClient, referenced from method com.sun.mail.imap.protocol.IMAPSaslAuthenticator.authenticate 
10-04 10:05:46.813: W/dalvikvm(1226): VFY: unable to resolve static method 44358: Ljavax/security/sasl/Sasl;.createSaslClient ([Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/util/Map;Ljavax/security/auth/callback/CallbackHandler;)Ljavax/security/sasl/SaslClient; 
10-04 10:05:46.813: D/dalvikvm(1226): VFY: replacing opcode 0x77 at 0x0050 
10-04 10:05:46.813: W/dalvikvm(1226): VFY: unable to resolve exception class 5975 (Ljavax/security/sasl/SaslException;) 
10-04 10:05:46.813: W/dalvikvm(1226): VFY: unable to find exception handler at addr 0x83 
10-04 10:05:46.844: W/dalvikvm(1226): VFY: rejected Lcom/sun/mail/imap/protocol/IMAPSaslAuthenticator;.authenticate ([Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)Z 
10-04 10:05:46.844: W/dalvikvm(1226): VFY: rejecting opcode 0x0d at 0x0083 
10-04 10:05:46.844: W/dalvikvm(1226): VFY: rejected Lcom/sun/mail/imap/protocol/IMAPSaslAuthenticator;.authenticate ([Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)Z 
10-04 10:05:46.844: W/dalvikvm(1226): Verifier rejected class Lcom/sun/mail/imap/protocol/IMAPSaslAuthenticator; 
10-04 10:05:46.844: I/System.out(1226): IMAP DEBUG: Can't load SASL authenticator: java.lang.ClassNotFoundException: com.sun.mail.imap.protocol.IMAPSaslAuthenticator 
10-04 10:05:46.844: I/System.out(1226): A1 LOGIN [email protected] anonymous 
10-04 10:05:48.137: I/System.out(1226): A1 NO [AUTHENTICATIONFAILED] Invalid credentials (Failure) 
10-04 10:05:48.164: W/System.err(1226): javax.mail.AuthenticationFailedException: [AUTHENTICATIONFAILED] Invalid credentials (Failure) 
10-04 10:05:48.176: W/System.err(1226):   at com.sun.mail.imap.IMAPStore.protocolConnect(IMAPStore.java:566) 
10-04 10:05:48.176: W/System.err(1226):   at javax.mail.Service.connect(Service.java:288) 
10-04 10:05:48.176: W/System.err(1226):   at xxx.xxx.xxx.OAuth2Authenticator.connectToImap(OAuth2Authenticator.java:111) 
10-04 10:05:48.180: W/System.err(1226):   at xxx.xxx.xxx.OAuth2Authenticator.initialize(OAuth2Authenticator.java:60) 
10-04 10:05:48.180: W/System.err(1226):   at xxx.xxx.xxx.TR_Incoming.onTimeout(TR_Incoming.java:106) 
10-04 10:05:48.180: W/System.err(1226):   at xxx.xxx.xxx.AlarmThread$1.handleMessage(AlarmThread.java:80) 
10-04 10:05:48.180: W/System.err(1226):   at android.os.Handler.dispatchMessage(Handler.java:99) 
10-04 10:05:48.180: W/System.err(1226):   at android.os.Looper.loop(Looper.java:137) 
10-04 10:05:48.180: W/System.err(1226):   at xxx.xxx.xxx.AlarmThread.run(AlarmThread.java:94) 

es scheint, dass asmack verwendet org.apache.harmony.javax.security. * Statt javax.security . *

Wer ist mit diesem Problem konfrontiert? Google scheint diese Möglichkeit in ihrem Beispiel nicht zu berücksichtigen, aber ich denke, dass es für den Benutzer ein gemeinsames Merkmal sein sollte.

Danke.

+0

Das Problem entsteht aus der Tatsache, dass 'com.sun.mail.imap.protocol.IMAPSaslAuthenticator' Referenzen' javax.security.sasl' Klassen, die fehlen. Sie sollten möglicherweise die Quellen von Javamail erhalten, zum Beispiel [von hier] (http://repository.springsource.com/ivy/bundles/external/javax.mail/com.springsource.javax.mail/1.4.5/com. springsource.javax.mail-1.4.5.jar), und ändern Sie die Importe in 'IMAPSaslAuthenticator' in' org.apache.harmony.javax.security.sasl' Klassen, verfügbar in ['asmack] (http: // code. google.com/p/asmack/), wie bereits erwähnt. – Stan

Antwort

1

Aus dem Protokoll sieht es so aus, als hätten Sie java6- und java7-Dateien durcheinander gebracht. Können Sie Ihre Klassenpfaddetails teilen?

Die andere Möglichkeit ist, dass Sie nicht die richtigen Anmeldeinformationen haben, entweder Login oder Pwd ist falsch.

Ich habe versucht, was Sie haben, und es hat funktioniert, sollte geradlinig sein.

+0

Wir sprechen hier über das Android-System. – Mannaz

+0

Ist es möglich, dass er die falschen Mail-Jar-Dateien aufgenommen und in das Projekt aufgenommen hat? Die Klasse, die "nicht finden konnte, ist nur in Java7". Auch das Beispiel, das er betrachtet, ist höchstwahrscheinlich kein Android-Beispiel. Es ist ein Java-Beispiel. Ich würde vermuten, .. – Siddharth

+0

Ok, ich benutze jetzt https://github.com/ruiaraujo/javamail_android es ist in Ordnung – Pascal

4

Um die ASMACK Authenticator mit Javamail zu verwenden, habe ich eine gepatchte Version der Bibliothek finden Sie hier: http://www.mannaz.at/codebase/imap-ssl-mail-android/

Es basiert auf http://code.google.com/p/javamail-android/ aber unterstützt die ASMACK SASSL Authenticator.

Diese Klasse fehlt in der JAR-Datei. Fügen Sie es einfach in Ihren Quellcode:

package com.falott.ingresss.util; 
public class Log { 
    public static boolean loggingEnabled(){ 
     return false; 
    } 
} 
+0

Hallo, ich folgte den Anweisungen auf Ihrer Seite, aber ich bekomme diesen Fehler beim Aufruf von 'connectToImap': ' 08- 24 22: 22: 51.967: W/dalvikvm (31957): VFY: statische Methode kann nicht aufgelöst werden 4410: Lcom/falott/ingress/util/Log; .loggingEnabled() Z 08-24 22: 22: 51.967: W/dalvikvm (31957): VFY: statische Methode kann nicht aufgelöst werden 4410: Lcom/falott/ingress/util/Log; .loggingEnabled() Z' Irgendwelche Ideen? –

+0

Ja, ich habe vergessen, diese Referenz zu entfernen.Erstellen Sie einfach eine statische Dummy-Methode in einer Klasse unter diesem Paket und Sie sollten in Ordnung sein. – Mannaz

+0

Hallo, ich möchte die gepatchte Version mit der neuesten Java-Mail wiederherstellen (um einige GMail/IMAP Bugs zu beheben) Könntest du bitte (uns) wissen lassen wie es geht? – Pascal