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



我想通过IMAP接收Hotmail的电子邮件,但我必须通过OAuth进行身份验证。从微软文档中,它支持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

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

    我们可以使用google的代码样本来收集outlook的IMAP。示例代码链接为https://code.google.com/p/google-mail-oauth2-tools/wiki/JavaSampleCode
  1. 必须使用作用域wl。imap和w_offline_access
  2. 在我的hotmail帐户不工作,我甚至不能得到一个access_token;但在我使用了另一个真实账户后,它工作了。

您使用的是旧版本的JavaMail。如果您使用的是最新版本,则内置了OAuth2支持。

相关内容

  • 没有找到相关文章

最新更新