好,所以我正在开发一个插件,该插件必须自动向他人发送电子邮件。我知道office-js无权这样做,并且我已经开始使用EWS托管API。我已经实现了SSO令牌,并且获得了:
mMainView = inflater.inflate(R.layout.fragment_request, container, false);
mRequestList = (RecyclerView) mMainView.findViewById(R.id.request_list);
mAuth = FirebaseAuth.getInstance();
mCurrent_user_id = mAuth.getCurrentUser().getUid(); //at this line
mRequestDatabase = FirebaseDatabase.getInstance().getReference().child("Friend_req").child(mCurrent_user_id);
mRequestDatabase.keepSynced(true);
mUsersDatabase = FirebaseDatabase.getInstance().getReference().child("Users");
mUsersDatabase.keepSynced(true);
获得令牌后,我将对拥有EWS托管API的服务器进行请求调用,并尝试发送包含以下代码的电子邮件:
Office.context.auth.getAccessTokenAsync()
当我致电ExchangeService exService = new ExchangeService();
exService.Url = new Uri(ewsUrl);
ExchangeCredentials credentials = new OAuthCredentials(ssoToken);
exService.Credentials = credentials;
EmailMessage emailMessage = new EmailMessage(exService);
时,它会引发401错误。
如果我确实使用emailMessage.SendAndSaveCopy();
而不是WebCredentials(user, pass)
,它将起作用。我不明白为什么(我在Azure Portal上也设置了权限)
答案 0 :(得分:0)
您必须通过https://apps.dev.microsoft.com创建的必须创建的SSO(单点登录)应用程序。在这里创建融合应用程序-允许被许可方使用其Outlook.com帐户或组织帐户(较新的方式)登录。
但是EWS没有使用它。 EWS使用的是较早的创建应用程序的身份验证方法,这是您需要通过Azure门户-通过AAD应用程序注册进行的操作。有关EWS身份验证的更多文档,请访问:https://docs.microsoft.com/en-us/exchange/client-developer/exchange-web-services/authentication-and-ews-in-exchange
因此,基本上,您检索到的OAuth访问令牌可用于查询Microsoft Graph(作为示例),但是您不能使用它来调用EWS。
此创建的一个非常重要的区别是EWS(顾名思义,Exchange Web Services)仅是组织帐户。您不能为Outlook.com用户使用该API。
makeEwsRequestAsync
方法。这将要求您使用JavaScript编写SOAP,但它可以工作。答案 1 :(得分:0)
还必须将ExchangeServer.ImpersonatedUserId
属性设置为您要发送的用户的地址。