2013-01-09 62 views
6

我正在嘗試使用從Android的AccountManager接收到的令牌來代替使用用戶名和密碼來實現簡單的IMAP/SMTP gmail客戶端。 我試圖使用「郵件」作爲authTokenType參數getAuthToken()。使用AccountManager令牌進行IMAP/SMTP驗證

谷歌提供SMTP/IMAP的這個例子用的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

,但它是爲Java。 在我的Android項目中使用它有一些導入(關於SASL)缺失。爲了解決這些問題我使用這個庫http://code.google.com/p/asmack/

的例子編譯,但我注意到,在運行時出現問題

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) 

似乎asmack使用org.apache.harmony.javax.security。*而不是javax.security 。*

有人遇到過這個問題嗎? Google在他們的例子中似乎沒有考慮這種可能性,但我認爲它應該是用戶的共同特徵。

謝謝。

+0

問題的事實,這是缺少'com.sun.mail.imap.protocol.IMAPSaslAuthenticator'引用'javax.security.sasl'類出現。您應該可能獲得javamail的源代碼,例如[from here](http://repository.springsource.com/ivy/bundles/external/javax.mail/com.springsource.javax.mail/1.4.5/com)。 springsource.javax.mail-1.4.5.jar),並將'IMAPSaslAuthenticator'中的導入更改爲''asmack'](http://代碼)中提供的'org.apache.harmony.javax.security.sasl'類。 google.com/p/asmack/),如前所述。 – Stan

回答

1

從日誌中,它看起來像你有java6和java7文件混合起來。你能分享你的類路徑細節嗎?

另一種可能性是您沒有正確的憑證,無論是登錄還是密碼都不正確。

我已經嘗試過你所擁有的,它已經工作了,應該是直截了當的。

+0

我們在這裏談論android系統。 – Mannaz

+0

他有可能拿起錯誤的郵件jar文件並將其包含在項目中嗎? 「無法找到的類僅在java7中」。此外,他正在看的例子,最有可能不是Android工作的例子。它是一個java工作的例子。我會懷疑...... – Siddharth

+0

好吧,我現在使用https://github.com/ruiaraujo/javamail_android這沒關係 – Pascal

4

爲了使用ASMACK認證者用JavaMail我創建可在這裏圖書館的一個補丁版本:http://www.mannaz.at/codebase/imap-ssl-mail-android/

它是基於http://code.google.com/p/javamail-android/但支持ASMACK SASSL認證。

該類從JAR文件中丟失。只需將它添加到你的源代碼:

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

嗨,我按照你的指示,但我調用'connectToImap'時出現這個錯誤: '08- 24 22:22:51.967:W/dalvikvm(31957):VFY:無法解析靜態方法4410:Lcom/falott/ingresss/util/Log; .loggingEnabled()Z 08-24 22:22:51.967:W/dalvikvm(31957):VFY:無法解析靜態方法4410:Lcom/falott/ingresss/util/Log; .loggingEnabled()Z' 任何想法? –

+0

是的,我忘了刪除那個引用。只需在該包下的類中創建一個靜態虛擬方法,你應該沒問題。 – Mannaz

+0

嗨,我想用最新的java郵件重新構建修補版本(修復一些GMail/IMAP錯誤),請讓我(我們)知道該怎麼做? – Pascal

相關問題