我使用的范围: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有什么不同吗?
有些事情我已经考虑:
- 范围没有要求足够的访问(所以我可能我的要求太高了)
- 的access_token储存不当或编码以某种方式(试图从对其进行解码base_64没有提供任何内容)。我能够使用我的refresh_token来更新access_token,以便告诉我我可能正确地存储它们。
- 我试着为密码传递null。也传递了实际的密码和WORKED,但我有access_token和refresh_token,所以我不应该要求他们的显式密码。这对于用户来说也是危险而粗略的。
- 我尝试使用“openssl s_client -crlf -starttls smtp -connect smtp-mail.outlook.com:587”手动连接到smtp服务器,但它似乎认为我的access_token错误“535 5.0.0 OAuth失败:代码-2147184118“采用二进制补码并转换为十六进制时的数字是0x8004920a。帮助搜索,但无济于事。
- 我已经做了大量的搜索,现在将继续发布到处。它为Gmail提供了大量资源,但如前所述,我已经在Gmail中使用它。 Outlook有些不同之处。此外,我遇到过很多关于电子邮件客户端上的电子邮件转发的帖子......我正在半创建一个电子邮件客户端,所以通过outlook.com设置不能帮助我。
我的一个好友的另一个问题是我的访问令牌非常长,对手动smtp服务器声称的内容做出了贡献。它是1188个字符长。这就像'EwB4Aul3BAAUo4xeBIbHjhBxWOFekj4Xy2 ... x9stHxi2K/VFggE ='(显然我隐藏了大部分角色)。
任何人提供建议或发现我的问题,先发制人感谢您。特别是为什么我可以传递电子邮件密码并失败,但使用oauth access_token失败。
问他们明确的密码是一个糟糕的用户体验。我应该可以发送只有{email,access_token}的电子邮件。您是否知道我可以使用OAuth2.0令牌通过SMTP或其他非REST协议发送电子邮件的方式。 –
将JavaMail配置为仅使用SASL XOAUTH2机制。 – user2433281
问题是我无法连接。该代码甚至没有得到我发送电子邮件的部分。这是一个很好的见解,一旦我建立了一个强大的SMTP连接(对于Outlook),我会进行调查。 –