2016-05-03 222 views
0

我使用的范围:mail.send,mail.readwrite,mail.read,offline_access,openid,电子邮件和配置文件(尽管我相当有信心我不需要所有这些 - >目标是阅读收件箱和发送电子邮件,同时还会收到电子邮件和姓名(如果存在)。发送电子邮件OAUTH2 SMTP Outlook Java

我然后连接到SMTP服务器用下面的代码:

OAuth2Authenticator.connectToSmtp("smtp-mail.outlook.com", 
      587, 
      user.getOutlookUid(), 
      accessToken, 
      true); 

实际连接到服务器的代码如下:

public static SMTPTransport connectToSmtp(String host, int port, String userEmail, String oauthToken, boolean debug) 
    throws Exception { 

Properties props = new Properties(); 
props.put("mail.smtp.starttls.enable", "true"); 
props.put("mail.smtp.starttls.required", "true"); 
props.put("mail.smtp.sasl.enable", "true"); 
props.put("mail.smtp.sasl.mechanisms", "XOAUTH2"); 
props.put("mail.smtp.sasl.mechanisms.oauth2.oauthToken", oauthToken); 
Session session = Session.getInstance(props); 
session.setDebug(debug); 


URLName unusedUrlName = null; 
SMTPTransport transport = new SMTPTransport(session, unusedUrlName); 
// If the password is non-null, SMTP tries to do AUTH LOGIN. 
String password = ""; 
transport.connect(host, port, userEmail, password); 

return transport; 

}

好吧,现在我可能会遇到最令人沮丧的部分...我已经使用“connectToSMTP”方法连接到Gmail,并且工作完美。

OAuth2Authenticator.connectToSmtp("smtp.gmail.com", 
      587, 
      user.getGoogleUid(), 
      accessToken, 
      true); 

所以最终我的问题是“我做错了什么?”或“我可以通过Outlook更新哪些内容以便发送电子邮件”?我已经看到Outlook有一个REST API,但那是计划B. Outlook与Gmail有什么不同吗?

有些事情我已经考虑:

  1. 范围没有要求足够的访问(所以我可能我的要求太高了)
  2. 的access_token储存不当或编码以某种方式(试图从对其进行解码base_64没有提供任何内容)。我能够使用我的refresh_token来更新access_token,以便告诉我我可能正确地存储它们。
  3. 我试着为密码传递null。也传递了实际的密码和WORKED,但我有access_token和refresh_token,所以我不应该要求他们的显式密码。这对于用户来说也是危险而粗略的。
  4. 我尝试使用“openssl s_client -crlf -starttls smtp -connect smtp-mail.outlook.com:587”手动连接到smtp服务器,但它似乎认为我的access_token错误“535 5.0.0 OAuth失败:代码-2147184118“采用二进制补码并转换为十六进制时的数字是0x8004920a。帮助搜索,但无济于事。
  5. 我已经做了大量的搜索,现在将继续发布到处。它为Gmail提供了大量资源,但如前所述,我已经在Gmail中使用它。 Outlook有些不同之处。此外,我遇到过很多关于电子邮件客户端上的电子邮件转发的帖子......我正在半创建一个电子邮件客户端,所以通过outlook.com设置不能帮助我。

我的一个好友的另一个问题是我的访问令牌非常长,对手动smtp服务器声称的内容做出了贡献。它是1188个字符长。这就像'EwB4Aul3BAAUo4xeBIbHjhBxWOFekj4Xy2 ... x9stHxi2K/VFggE ='(显然我隐藏了大部分角色)。

任何人提供建议或发现我的问题,先发制人感谢您。特别是为什么我可以传递电子邮件密码并失败,但使用oauth access_token失败。

回答

0

尝试使用“pop3:// user:password @ host:port/INBOX”。从收件箱中取回电子邮件, 更多信息可以查到https://javamail.java.net/docs/api/com/sun/mail/pop3/package-summary.html

+0

问他们明确的密码是一个糟糕的用户体验。我应该可以发送只有{email,access_token}的电子邮件。您是否知道我可以使用OAuth2.0令牌通过SMTP或其他非REST协议发送电子邮件的方式。 –

+0

将JavaMail配置为仅使用SASL XOAUTH2机制。 – user2433281

+0

问题是我无法连接。该代码甚至没有得到我发送电子邮件的部分。这是一个很好的见解,一旦我建立了一个强大的SMTP连接(对于Outlook),我会进行调查。 –

0

希望这会有所帮助:https://technet.microsoft.com/en-ca/dn44016。属性props = new Properties(); props.put(“mail.imap.ssl.enable”,“true”); //需要Gmail props.put(“mail.imap.auth.mechanisms”,“XOAUTH2”); Session session = Session.getInstance(props); Store store = session.getStore(“imap”); store.connect(“imap.gmail.com”,用户名,oauth2_access_token);

+0

谢谢你的回应。我可以通过SMTP和IMAP连接到Gmail。 Outlook有一些不同之处。现在特别针对SMTP,一旦我可以收到电子邮件发送工作,我会研究IMAP。 –