Javamail IMAP OAUTH2SASL 异常

问题描述 投票:0回答:2

我目前正在开发一个IMAP Messenger,我试图从内置的账户管理器中获取用户的google用户名和授权令牌,当我的商店试图连接时,一直收到基于SASL的错误。

这是我目前的代码。

private class logIn extends AsyncTask<String,Void,String>{
    ProgressDialog progressDialog;
    @Override
    protected String doInBackground(String... params){
        // Get Username && Auth Token
        AccountManager accountManager=AccountManager.get(getActivity());
        Account[] accounts=accountManager.getAccountsByType("com.google");
        if(accounts[0].name.toLowerCase().endsWith("gmail.com")){
            username=accounts[0].name.toLowerCase();
            System.out.println(username);
            accountManager.getAuthToken(accounts[0],"oauth2:https://mail.google.com/",null,getActivity(),new onPasswordAcquired(),null);
        }
        // Start Store Session
        if(password!=null){
            Properties props = new Properties();
            props.put("mail.imap.ssl.enable","true");
            props.put("mail.imap.sasl.enable","true");
            props.put("mail.imap.sasl.mechanisms","XOAUTH2");
            props.put("mail.imap.auth.login.disable","true");
            props.put("mail.imap.auth.plain.disable","true");
            try{
                Session session=Session.getDefaultInstance(props,new Gmail_Authenticator(username,password));
                session.setDebug(true);
                store=session.getStore("imap");
                store.connect("imap.gmail.com",username,password);
            }catch(MessagingException e){e.printStackTrace();}
            if(store!=null && store.isConnected()){loadmsg=true;}
        }
        return "Executed";
    }

这是我得到的错误信息

12-16 18:56:22.836 10711-11216/com.example.wq.myapp E/AndroidRuntime: FATAL EXCEPTION: AsyncTask #2
12-16 18:56:22.836 10711-11216/com.example.wq.myapp E/AndroidRuntime: Process: com.example.wq.myapp, PID: 10711
12-16 18:56:22.836 10711-11216/com.example.wq.myapp E/AndroidRuntime: java.lang.RuntimeException: An error occured while executing doInBackground()
12-16 18:56:22.836 10711-11216/com.example.wq.myapp E/AndroidRuntime:     at android.os.AsyncTask$3.done(AsyncTask.java:304)
12-16 18:56:22.836 10711-11216/com.example.wq.myapp E/AndroidRuntime:     at java.util.concurrent.FutureTask.finishCompletion(FutureTask.java:355)
12-16 18:56:22.836 10711-11216/com.example.wq.myapp E/AndroidRuntime:     at java.util.concurrent.FutureTask.setException(FutureTask.java:222)
12-16 18:56:22.836 10711-11216/com.example.wq.myapp E/AndroidRuntime:     at java.util.concurrent.FutureTask.run(FutureTask.java:242)
12-16 18:56:22.836 10711-11216/com.example.wq.myapp E/AndroidRuntime:     at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:231)
12-16 18:56:22.836 10711-11216/com.example.wq.myapp E/AndroidRuntime:     at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112)
12-16 18:56:22.836 10711-11216/com.example.wq.myapp E/AndroidRuntime:     at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587)
12-16 18:56:22.836 10711-11216/com.example.wq.myapp E/AndroidRuntime:     at java.lang.Thread.run(Thread.java:818)
12-16 18:56:22.836 10711-11216/com.example.wq.myapp E/AndroidRuntime:  Caused by: java.lang.NoClassDefFoundError: Failed resolution of: Ljavax/security/sasl/Sasl;
12-16 18:56:22.836 10711-11216/com.example.wq.myapp E/AndroidRuntime:     at com.sun.mail.imap.protocol.IMAPSaslAuthenticator.authenticate(IMAPSaslAuthenticator.java:143)
12-16 18:56:22.836 10711-11216/com.example.wq.myapp E/AndroidRuntime:     at com.sun.mail.imap.protocol.IMAPProtocol.sasllogin(IMAPProtocol.java:846)
12-16 18:56:22.836 10711-11216/com.example.wq.myapp E/AndroidRuntime:     at com.sun.mail.imap.IMAPStore.login(IMAPStore.java:805)
12-16 18:56:22.836 10711-11216/com.example.wq.myapp E/AndroidRuntime:     at com.sun.mail.imap.IMAPStore.protocolConnect(IMAPStore.java:703)
12-16 18:56:22.836 10711-11216/com.example.wq.myapp E/AndroidRuntime:     at javax.mail.Service.connect(Service.java:364)
12-16 18:56:22.836 10711-11216/com.example.wq.myapp E/AndroidRuntime:     at javax.mail.Service.connect(Service.java:245)
12-16 18:56:22.836 10711-11216/com.example.wq.myapp E/AndroidRuntime:     at com.example.wq.myapp.GmailMessagesFrag$logIn.doInBackground(GmailMessagesFrag.java:418)
12-16 18:56:22.836 10711-11216/com.example.wq.myapp E/AndroidRuntime:     at com.example.wq.myapp.GmailMessagesFrag$logIn.doInBackground(GmailMessagesFrag.java:394)
12-16 18:56:22.836 10711-11216/com.example.wq.myapp E/AndroidRuntime:     at android.os.AsyncTask$2.call(AsyncTask.java:292)
12-16 18:56:22.836 10711-11216/com.example.wq.myapp E/AndroidRuntime:     at java.util.concurrent.FutureTask.run(FutureTask.java:237)
12-16 18:56:22.836 10711-11216/com.example.wq.myapp E/AndroidRuntime:     at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:231) 
12-16 18:56:22.836 10711-11216/com.example.wq.myapp E/AndroidRuntime:     at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112) 
12-16 18:56:22.836 10711-11216/com.example.wq.myapp E/AndroidRuntime:     at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587) 
12-16 18:56:22.836 10711-11216/com.example.wq.myapp E/AndroidRuntime:     at java.lang.Thread.run(Thread.java:818) 
12-16 18:56:22.836 10711-11216/com.example.wq.myapp E/AndroidRuntime:  Caused by: java.lang.ClassNotFoundException: Didn't find class "javax.security.sasl.Sasl" on path: DexPathList[[zip file "/data/app/com.example.wq.myapp-2/base.apk"],nativeLibraryDirectories=[/vendor/lib64, /system/lib64]]
12-16 18:56:22.836 10711-11216/com.example.wq.myapp E/AndroidRuntime:     at dalvik.system.BaseDexClassLoader.findClass(BaseDexClassLoader.java:56)
12-16 18:56:22.836 10711-11216/com.example.wq.myapp E/AndroidRuntime:     at java.lang.ClassLoader.loadClass(ClassLoader.java:511)
12-16 18:56:22.836 10711-11216/com.example.wq.myapp E/AndroidRuntime:     at java.lang.ClassLoader.loadClass(ClassLoader.java:469)
12-16 18:56:22.836 10711-11216/com.example.wq.myapp E/AndroidRuntime:     at com.sun.mail.imap.protocol.IMAPSaslAuthenticator.authenticate(IMAPSaslAuthenticator.java:143) 
12-16 18:56:22.836 10711-11216/com.example.wq.myapp E/AndroidRuntime:     at com.sun.mail.imap.protocol.IMAPProtocol.sasllogin(IMAPProtocol.java:846) 
12-16 18:56:22.836 10711-11216/com.example.wq.myapp E/AndroidRuntime:     at com.sun.mail.imap.IMAPStore.login(IMAPStore.java:805) 
12-16 18:56:22.836 10711-11216/com.example.wq.myapp E/AndroidRuntime:     at com.sun.mail.imap.IMAPStore.protocolConnect(IMAPStore.java:703) 
12-16 18:56:22.836 10711-11216/com.example.wq.myapp E/AndroidRuntime:     at javax.mail.Service.connect(Service.java:364) 
12-16 18:56:22.836 10711-11216/com.example.wq.myapp E/AndroidRuntime:     at javax.mail.Service.connect(Service.java:245) 
12-16 18:56:22.836 10711-11216/com.example.wq.myapp E/AndroidRuntime:     at com.example.wq.myapp.GmailMessagesFrag$logIn.doInBackground(GmailMessagesFrag.java:418) 
12-16 18:56:22.836 10711-11216/com.example.wq.myapp E/AndroidRuntime:     at com.example.wq.myapp.GmailMessagesFrag$logIn.doInBackground(GmailMessagesFrag.java:394) 
12-16 18:56:22.836 10711-11216/com.example.wq.myapp E/AndroidRuntime:     at android.os.AsyncTask$2.call(AsyncTask.java:292) 
12-16 18:56:22.836 10711-11216/com.example.wq.myapp E/AndroidRuntime:     at java.util.concurrent.FutureTask.run(FutureTask.java:237) 
12-16 18:56:22.836 10711-11216/com.example.wq.myapp E/AndroidRuntime:     at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:231) 
12-16 18:56:22.836 10711-11216/com.example.wq.myapp E/AndroidRuntime:     at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112) 
12-16 18:56:22.836 10711-11216/com.example.wq.myapp E/AndroidRuntime:     at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587) 
12-16 18:56:22.836 10711-11216/com.example.wq.myapp E/AndroidRuntime:     at java.lang.Thread.run(Thread.java:818) 
12-16 18:56:22.836 10711-11216/com.example.wq.myapp E/AndroidRuntime:   Suppressed: java.lang.ClassNotFoundException: javax.security.sasl.Sasl
12-16 18:56:22.836 10711-11216/com.example.wq.myapp E/AndroidRuntime:     at java.lang.Class.classForName(Native Method)
12-16 18:56:22.836 10711-11216/com.example.wq.myapp E/AndroidRuntime:     at java.lang.BootClassLoader.findClass(ClassLoader.java:781)
12-16 18:56:22.836 10711-11216/com.example.wq.myapp E/AndroidRuntime:     at java.lang.BootClassLoader.loadClass(ClassLoader.java:841)
12-16 18:56:22.836 10711-11216/com.example.wq.myapp E/AndroidRuntime:     at java.lang.ClassLoader.loadClass(ClassLoader.java:504)
12-16 18:56:22.836 10711-11216/com.example.wq.myapp E/AndroidRuntime:           ... 15 more
12-16 18:56:22.836 10711-11216/com.example.wq.myapp E/AndroidRuntime:  Caused by: java.lang.NoClassDefFoundError: Class not found using the boot class loader; no stack available

我试着添加了一些包含 "javax.security "类的库 但得到的错误信息是:

ill-advised or mistaken usage of a core class (java.* or javax.*)
...
Error:Execution failed for task ':app:preDexDebug'.
> com.android.ide.common.process.ProcessException: org.gradle.process.internal.ExecException: Process 'command 'C:\Program Files\Java\jdk1.7.0_79\bin\java.exe'' finished with non-zero exit value 1

任何帮助都将是非常感激的 因为我已经在这个问题上挣扎了一个星期了。

java android javamail imap sasl
2个回答
2
投票

JavaMail for Android docs。

安卓系统不支持的标准Java功能之一是SASL。 最新版本的JavaMail包括内置的OAuth2支持,不需要SASL。

这里是来自的例子 OAuth2支持 文件来启用它。

Properties props = new Properties();
props.put("mail.imap.ssl.enable", "true"); // required for Gmail
props.put("mail.imap.auth.mechanisms", "XOAUTH2");
Session session = Session.getInstance(props);
Store store = session.getStore("imap");
store.connect("imap.gmail.com", username, oauth2_access_token);
© www.soinside.com 2019 - 2024. All rights reserved.