【问题标题】:Javamail IMAP OAUTH2/SASL ExceptionJavamail IMAP OAUTH2/SASL 异常
【发布时间】:2016-03-22 07:57:59
【问题描述】:

我目前正在开发 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 jakarta-mail imap sasl


    【解决方案1】:

    来自JavaMail for Android 文档:

    Android 不支持的标准 Java 功能之一是 SASL。 这个最新版本的 JavaMail 包括不需要 SASL 的内置 OAuth2 支持。

    这是OAuth2 Support 文档中启用它的示例:

    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);
    

    【讨论】:

    • 我用的是javamail 1.5.4,非常感谢!!效果很好!! :) :)
    猜你喜欢
    • 2018-02-20
    • 2017-03-16
    • 2017-01-17
    • 2014-04-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多