2013-01-09 33 views
6

Tôi đang cố gắng triển khai ứng dụng khách gmail IMAP/SMTP đơn giản bằng mã nhận được từ AccountManager của Android thay vì sử dụng tên người dùng và mật khẩu. Tôi đang cố gắng sử dụng "thư" dưới dạng tham số authTokenType để getAuthToken().Xác thực IMAP/SMTP với mã thông báo AccountManager

Google cung cấp ví dụ này của SMTP/IMAP với 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

nhưng nó là dành cho java. Sử dụng nó trong dự án Android của tôi có một số nhập (về SASL) mất tích. Để giải quyết chúng tôi sử dụng thư viện này http://code.google.com/p/asmack/

Ví dụ biên dịch nhưng tôi nhận thấy một vấn đề trong thời gian chạy

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) 

có vẻ như asmack sử dụng org.apache.harmony.javax.security. * Thay vì javax.security . *

Bất kỳ ai đã gặp sự cố này? Google dường như không xem xét khả năng này trong ví dụ của họ, nhưng tôi nghĩ rằng nó phải là một tính năng phổ biến cho người dùng.

Cảm ơn.

+0

vấn đề nảy sinh từ thực tế rằng 'com.sun.mail.imap.protocol.IMAPSaslAuthenticator' tài liệu tham khảo 'lớp javax.security.sasl' mà đang thiếu. Bạn có thể lấy các nguồn của javamail, ví dụ, [từ đây] (http://repository.springsource.com/ivy/bundles/external/javax.mail/com.springsource.javax.mail/1.4.5/com. springource.javax.mail-1.4.5.jar) và thay đổi nhập khẩu trong 'IMAPSaslAuthenticator' thành các lớp' org.apache.harmony.javax.security.sasl', có sẵn trong ['asmack'] (http: // code. google.com/p/asmack/), như đã được ghi nhận rồi. – Stan

Trả lời

1

Từ nhật ký, có vẻ như bạn đã trộn lẫn các tệp java6 và java7. Bạn có thể chia sẻ chi tiết classpath của bạn.

Khả năng khác là bạn không có thông tin xác thực phù hợp, đăng nhập hoặc pwd không chính xác.

Tôi đã thử những gì bạn có, và nó đã làm việc, nên được thẳng về phía trước.

+0

Chúng tôi đang nói về hệ thống Android ở đây. – Mannaz

+0

Có thể anh ta đã nhặt nhầm các tệp jar thư và đưa nó vào dự án không? Lớp học "không thể tìm thấy, chỉ có trong java7". Ngoài ra ví dụ ông đang xem xét, có lẽ hầu hết không phải là ví dụ làm việc android. Một ví dụ làm việc java của nó. Tôi sẽ nghi ngờ .. – Siddharth

+0

Ok, bây giờ tôi sử dụng https://github.com/ruiaraujo/javamail_android là ok – Pascal

4

Để sử dụng Authenticator với JavaMail ASMACK Tôi tạo ra một phiên bản vá của thư viện có sẵn ở đây: http://www.mannaz.at/codebase/imap-ssl-mail-android/

Nó dựa trên http://code.google.com/p/javamail-android/ nhưng hỗ trợ xác thực ASMACK SASSL.

Lớp này bị thiếu trong tệp JAR. Chỉ cần thêm nó vào mã nguồn của bạn:

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

Xin chào, tôi đã làm theo hướng dẫn bên cạnh bạn, nhưng tôi gặp lỗi này khi gọi 'connectToImap': ' 08- 24 22: 22: 51.967: W/dalvikvm (31957): VFY: không thể giải quyết phương pháp tĩnh 4410: Lcom/falott/enterresss/util/Log; .loggingEnabled() Z 08-24 22: 22: 51.967: W/dalvikvm (31957): VFY: không thể giải quyết phương pháp tĩnh 4410: Lcom/falott/enterresss/util/Log; .loggingEnabled() Z' Bất kỳ ý tưởng nào? –

+0

Có, tôi quên xóa tham chiếu đó.Chỉ cần tạo một phương thức giả tĩnh trong một lớp trong gói đó và bạn sẽ ổn. – Mannaz

+0

Xin chào, tôi muốn xây dựng lại phiên bản được vá bằng thư java mới nhất (để khắc phục một số lỗi Gmail/IMAP), bạn có thể vui lòng cho tôi (chúng tôi) biết cách thực hiện không? – Pascal

Các vấn đề liên quan