如何通过IMAP和OAuth从hotmail接收电子邮件?

时间:2014-07-11 02:31:59

标签: java oauth-2.0 javamail hotmail

我希望通过IMAP从Hotmail接收电子邮件,但我必须通过OAuth进行身份验证。从Microsoft文档中,它支持http://msdn.microsoft.com/en-us/library/dn440163.aspx;

但我必须知道如何在java中使用它(通过Javamail)。我尝试使用谷歌代码示例(正确的电子邮件和access_toket),但失败了。

String email = "stony@hotmail.com";
String oauthToken = "XXXXXXXX";

initialize();

IMAPStore imapStore = connectToImap("imap-mail.outlook.com",
                                    993,
                                    email,
                                    oauthToken,
                                    true);
System.out.println("Successfully authenticated to IMAP.\n");


Folder folder =  imapStore.getDefaultFolder();
folder.open(Folder.READ_ONLY);  //****The linke throw exception****
for (Message msg : folder.getMessages()) {
    String subject = msg.getSubject();
    System.out.println(":" + subject);
}

系统控制台上打印的日志是

DEBUG: setDebug: JavaMail version 1.4
DEBUG: mail.imap.fetchsize: 16384
DEBUG: enable SASL
DEBUG: SASL mechanisms allowed: XOAUTH2
* OK Outlook.com IMAP4rev1 server version 17.4.0.0 ready (DUB451-IMAP183)
A0 CAPABILITY
* CAPABILITY IMAP4rev1 CHILDREN ID NAMESPACE UIDPLUS UNSELECT AUTH=PLAIN AUTH=XOAUTH2 SASL-IR
A0 OK CAPABILITY completed
IMAP DEBUG: AUTH: PLAIN
IMAP DEBUG: AUTH: XOAUTH2
DEBUG: protocolConnect login, host=imap-mail.outlook.com, user=mebeautyful@hotmail.com, password=<non-null>
IMAP SASL DEBUG: Mechanisms: XOAUTH2
IMAP SASL DEBUG: SASL client XOAUTH2
A1 AUTHENTICATE XOAUTH2
+ 
IMAP SASL DEBUG: challenge:  :
IMAP SASL DEBUG: callback length: 1
IMAP SASL DEBUG: callback 0: javax.security.auth.callback.NameCallback@61ead9ba
IMAP SASL DEBUG: response: user=mebeautyful@hotmail.comauth=Bearer 

DEBUG: connection available -- size: 1
A2 EXAMINE ""
A1 NO [AUTHENTICATIONFAILED] OAuth authentication failed.
A2 BAD Examine Command is not permitted in current state (NotAuthenticated)
A3 LOGOUT
* BYE Logout requested
Exception in thread "main" javax.mail.MessagingException: A2 BAD Examine Command is not permitted in current state (NotAuthenticated);
  nested exception is:
    com.sun.mail.iap.BadCommandException: A2 BAD Examine Command is not permitted in current state (NotAuthenticated)
    at com.sun.mail.imap.IMAPFolder.open(IMAPFolder.java:829)
    at com.google.code.samples.oauth2.OAuth2Authenticator.main(OAuth2Authenticator.java:155)
Caused by: com.sun.mail.iap.BadCommandException: A2 BAD Examine Command is not permitted in current state (NotAuthenticated)
    at com.sun.mail.iap.Protocol.handleResult(Protocol.java:296)
    at com.sun.mail.imap.protocol.IMAPProtocol.examine(IMAPProtocol.java:636)
    at com.sun.mail.imap.IMAPFolder.open(IMAPFolder.java:811)
    ... 1 more

2 个答案:

答案 0 :(得分:0)

我测试成功了!我验证了3件事,

  1. 我们可以使用谷歌代码示例收集到Outlook的IMAP。示例代码链接为https://code.google.com/p/google-mail-oauth2-tools/wiki/JavaSampleCode
  2. 必须使用范围wl.imap和wl.offline_access
  3. 在我的hotmail帐户中没有工作,我甚至无法获得access_token;但在我使用另一个真实账户之后,它就可以了。

答案 1 :(得分:0)

您使用的是旧版JavaMail。如果您使用latest版本OAuth2 support is built in