Android JavaMail IMAP应用商店未通过OAuth2.0身份验证连接到Gmail
我有一个android应用程序,可以用gmail检查和发送电子邮件。 由于需要打开/关闭对不太安全的应用程序的访问,我将其移动到OAuth2.0身份验证,因为这不是我的选项 它可以很好地进行身份验证,我可以获得令牌,并能够使用SMTPTransport发送电子邮件 但是,使用IMAP检查/接收电子邮件不起作用!它到达store.connect,然后稍等片刻,抛出服务器丢弃的异常连接 以下是代码: 因为它位于主线程上,所以我这样做是为了在onCreate方法中运行它: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
@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应用程序。这太不酷了。我只是创建了一个特殊版本的。试试看,如果它解决了你的问题,让我知道。