Android JavaMail IMAP应用商店未通过OAuth2.0身份验证连接到Gmail

Android JavaMail IMAP应用商店未通过OAuth2.0身份验证连接到Gmail,android,oauth-2.0,gmail,jakarta-mail,imap,Android,Oauth 2.0,Gmail,Jakarta Mail,Imap,我有一个android应用程序,可以用gmail检查和发送电子邮件。 由于需要打开/关闭对不太安全的应用程序的访问,我将其移动到OAuth2.0身份验证,因为这不是我的选项 它可以很好地进行身份验证,我可以获得令牌,并能够使用SMTPTransport发送电子邮件 但是,使用IMAP检查/接收电子邮件不起作用!它到达store.connect,然后稍等片刻,抛出服务器丢弃的异常连接 以下是代码: 因为它位于主线程上,所以我这样做是为了在onCreate方法中运行它: @Override publ

我有一个android应用程序,可以用gmail检查和发送电子邮件。 由于需要打开/关闭对不太安全的应用程序的访问,我将其移动到OAuth2.0身份验证,因为这不是我的选项

它可以很好地进行身份验证,我可以获得令牌,并能够使用SMTPTransport发送电子邮件

但是,使用IMAP检查/接收电子邮件不起作用!它到达store.connect,然后稍等片刻,抛出服务器丢弃的异常连接

以下是代码:

因为它位于主线程上,所以我这样做是为了在onCreate方法中运行它:

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    ...
    thread.start();//to run readMails();
    try {
        thread.join();
    } catch (InterruptedException e) {
        e.printStackTrace();
    }
    ....
}
Thread thread = new Thread(new Runnable(){
    @Override
    public void run() {
        try {
            readMails();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
});
public void readMails(){
    //it has been authenticated, so I am just getting token and user from authenticator
    String token=authPreferences.getToken();
    String user=authPreferences.getUser();

    System.out.println("Connecting to gmail with IMAP and OAUTH2.");

        String token=authPreferences.getToken();
        String user=authPreferences.getUser();

        Properties props = new Properties();
        props.put("mail.imaps.ssl.enable", "true");
        props.put("mail.imaps.sasl.enable", "true");
        props.put("mail.imaps.sasl.mechanisms", "XOAUTH2");
        props.put("mail.imaps.auth.login.disable", "true");
        props.put("mail.imaps.auth.plain.disable", "true");
        props.put("mail.debug.auth", "true");

try {            
        System.out.println("Creating session...");
        Session session = Session.getInstance(props);
        session.setDebug(true);
        System.out.println("Creating store...");
        Store mystore = session.getStore("imap");//s"
        System.out.println("Connecting store...");

        mystore.connect("imap.gmail.com", 993, user, token);
        //it does not get passed this - exception: connection dropped by server
        ...
}catch (Exception mex) {
            mex.printStackTrace();
            return;
        }
}
我尝试了JavaMail 1.5.2和1.5.4的不同版本-结果相同,我在验证时使用的范围是

以下是日志:

08-25 22:03:52.907: I/System.out(28508): Connecting to gmail with IMAP and OAUTH2.
08-25 22:03:57.608: I/System.out(28508): Creating session...
08-25 22:03:57.683: I/System.out(28508): DEBUG: setDebug: JavaMail version 1.5.4
08-25 22:03:57.683: I/System.out(28508): Creating store...
08-25 22:03:57.684: I/System.out(28508): DEBUG: getProvider() returning javax.mail.Provider[STORE,imap,com.sun.mail.imap.IMAPStore,Oracle,1.5.4]
08-25 22:03:57.685: W/art(28508): Before Android 4.1, method javax.mail.Session com.sun.mail.imap.IMAPStore.getSession() would have incorrectly overridden the package-private method in javax.mail.Service
08-25 22:03:57.688: I/System.out(28508): DEBUG IMAP: mail.imap.fetchsize: 16384
08-25 22:03:57.688: I/System.out(28508): DEBUG IMAP: mail.imap.ignorebodystructuresize: false
08-25 22:03:57.688: I/System.out(28508): DEBUG IMAP: mail.imap.statuscachetimeout: 1000
08-25 22:03:57.688: I/System.out(28508): DEBUG IMAP: mail.imap.appendbuffersize: -1
08-25 22:03:57.688: I/System.out(28508): DEBUG IMAP: mail.imap.minidletime: 10
08-25 22:03:57.689: I/System.out(28508): DEBUG IMAP: closeFoldersOnStoreFailure
08-25 22:03:57.689: I/System.out(28508): Connecting store...
08-25 22:03:59.011: I/System.out(28508): DEBUG IMAP: trying to connect to host "imap.gmail.com", port 993, isSSL false
08-25 22:04:14.994: W/System.err(28508): javax.mail.MessagingException: Connection dropped by server?;
08-25 22:04:14.994: W/System.err(28508):   nested exception is:
08-25 22:04:14.994: W/System.err(28508):    java.io.IOException: Connection dropped by server?
08-25 22:04:14.994: W/System.err(28508):    at com.sun.mail.imap.IMAPStore.protocolConnect(IMAPStore.java:733)
08-25 22:04:14.994: W/System.err(28508):    at javax.mail.Service.connect(Service.java:364)
08-25 22:04:14.995: W/System.err(28508):    at bg.android.onemovesender.OneMoveSenderActivity.readMails(OneMoveSenderActivity.java:960)
08-25 22:04:14.995: W/System.err(28508):    at bg.android.onemovesender.OneMoveSenderActivity$1.run(OneMoveSenderActivity.java:914)
08-25 22:04:14.995: W/System.err(28508):    at java.lang.Thread.run(Thread.java:818)
08-25 22:04:14.995: W/System.err(28508): Caused by: java.io.IOException: Connection dropped by server?
08-25 22:04:14.995: W/System.err(28508):    at com.sun.mail.iap.ResponseInputStream.readResponse(ResponseInputStream.java:119)
08-25 22:04:14.995: W/System.err(28508):    at com.sun.mail.iap.Response.<init>(Response.java:114)
08-25 22:04:14.995: W/System.err(28508):    at com.sun.mail.imap.protocol.IMAPResponse.<init>(IMAPResponse.java:60)
08-25 22:04:14.995: W/System.err(28508):    at com.sun.mail.imap.protocol.IMAPProtocol.readResponse(IMAPProtocol.java:348) 
08-25 22:04:14.995: W/System.err(28508):    at com.sun.mail.iap.Protocol.<init>(Protocol.java:126)
08-25 22:04:14.995: W/System.err(28508):    at com.sun.mail.imap.protocol.IMAPProtocol.<init>(IMAPProtocol.java:125)
08-25 22:04:14.995: W/System.err(28508):    at com.sun.mail.imap.IMAPStore.newIMAPProtocol(IMAPStore.java:754)
08-25 22:04:14.995: W/System.err(28508):    at com.sun.mail.imap.IMAPStore.protocolConnect(IMAPStore.java:696)
08-25 22:04:14.995: W/System.err(28508):    ... 4 more

任何建议都非常好。谢谢。

您正在为imaps协议设置属性,但您正在使用imap协议。将属性名称更改为mail.imap...

感谢您指出这一点。然而,现在我得到了E/AndroidRuntime14896:Suppressed:java.lang.ClassNotFoundException:javax.security.sasl.sasl,是否有可能实现?奇怪的行为:如果我一步一步地调试它,然后在store.connect。。。我得到W/System.err19788:原因:javax.net.ssl.SSLHandshakeException:连接已被对等方关闭,而不是上面未找到的类。我无法解释调试行为。SASL错误是因为Android与Java不兼容,因此没有完全实现Java规范。我相信有些人已经让SASL在Android上工作了,但我不知道怎么做。奇怪的是,Google mail因为不使用OAuth2而阻止应用程序,因为Android缺少SASL。因此,所有Android电子邮件应用程序都注定失败——没有IMAP。我想这就是为什么他们把标准的安卓邮件改成了GMail应用程序。这太不酷了。我只是创建了一个特殊版本的。试试看,如果它解决了你的问题,让我知道。