【问题标题】:Outlook JS Add-in: EWS Calls using Ajax and Callback TokenOutlook JS 加载项:使用 Ajax 和回调令牌的 EWS 调用
【发布时间】:2019-06-08 21:26:00
【问题描述】:

Office JS API 对回调有 1 Mb 的限制,我的要求之一是将现有电子邮件(被用户指定为垃圾邮件)作为附件转发给第三方。我有大量代码来处理邮件操作,使用 makeEwsRequestAsync,在这种情况下,SOAP 可以很好地返回 MIME 内容以创建和发送电子邮件,但当回调返回大于 1 Mb 时则不行。

为了绕过 1 Mb 的限制,建议其他人使用回调令牌、项目 ID 和 EWS URL 直接进行 EWS 调用。我可以轻松获得这些组件,并且我拥有适用于通常 makeEwsRequestAsync 方法的 SOAP。

我没有的是如何使用我拥有的元素来调用 EWS 调用。

作为示例,我使用以下内容获取 EWS URL 和项目 ID:

    _mailbox = Office.context.mailbox;
    _ewsUrl = _mailbox.ewsUrl;

    var item = _mailbox.item;
    _itemId = item.itemId;

我用它来获取回调令牌:

    mailViaEws.Authenticate = function Start() {
        getCallbackToken(setCallbackToken);
    };

    function getCallbackToken(callback) {
        var options = {
            isRest: false
        };
        Office.context.mailbox.getCallbackTokenAsync(options, callback);
    }

    function setCallbackToken(asyncResult) {
        if (asyncResult.status === "succeeded") {
            _callbackToken = asyncResult.value;
        } else {
            app.showNotification(_appName, asyncResult.error.message);
        }
    }

SOAP 如下,用辅助方法包装 SOAP:

        var soapToCreateItem =
            '<soap:Body>' +
            '   <m:CreateItem MessageDisposition="SendAndSaveCopy"' +
            '       xmlns="http://schemas.microsoft.com/exchange/services/2006/messages" ' +
            '       xmlns:t="http://schemas.microsoft.com/exchange/services/2006/types">' +
            '       <m:Items>' +
            '        <t:Message>' +
            '           <t:Subject>' + _subject + '</t:Subject>' +
            '           <t:Body BodyType="Text">' + _bodyText + '</t:Body>' +
            '           <t:ToRecipients>' + _adddressesSoap + '</t:ToRecipients>' +
            '        </t:Message>' +
            '       </m:Items>' +
            '    </m:CreateItem>' +
            '  </soap:Body>';

        var soapToCreateItemData = getSoapBoadyEnvelope(soapToCreateItem);

我进行了广泛的搜索,虽然我找到了使用中间服务在 C# 中调用 EWS 托管 API 的代码,但我正在尝试直接调用 EWS。任何帮助将不胜感激。

【问题讨论】:

  • 嗨,你解决了这个问题吗?我有完全相同的需求:(
  • 当时,我所在的公司还没有与 MS Azure / O365 集成,所以使用 Graph API 不是一个选项,但我最终确实写了一个对 Graph 有效的 API。
  • 但是您是否设法向 ewsurl 发送了一个肥皂请求并以 base64 eml 形式返回电子邮件?

标签: javascript outlook office365 exchangewebservices outlook-addin


【解决方案1】:

您的邮箱 (_mailbox = Office.context.mailbox;) 对象有一个方法 makeEwsRequestAsync,您可以使用该方法对 EWS 进行 SOAP 调用。 请注意,您不需要明确提供访问令牌。

Here 是更多信息。

【讨论】:

  • 我已经这样做了,但是当返回大于 1 MB 时,该方法将失败。我有一个广泛的图书馆——在我的帖子中提到——在这里:gist.github.com/JamesIgoe/05e53af69ef5eabfc3fa38d176f19925
  • 您能否提供与此限制相关的文档?
  • 两个地方:docs.microsoft.com/en-us/outlook/add-ins/…,以及与 MS 支持人员的直接对话。限制是下游和上游。
  • 一般来说,您选择解决问题的方法对我来说有点奇怪。这个问题可以通过交换规则轻松解决。无论如何,使用您的方法,由于下载整个垃圾邮件并发送它,您将在客户端上产生开销。您可以查看this 作为解决方案。
  • 我了解限制,并且不下载 MIME 内容并直接工作效率更高,但显然,这就是我想要做的。您的建议使用 Graph API,这不是一个选项,就像我的雇主在 prem Exchange 上那样。
【解决方案2】:

您从 getCallbackTokenAsync 获得的回调令牌仅适用于 5 分钟,并且仅适用于 GetAttachment 和 GetItem EWS 操作,这在 https://docs.microsoft.com/en-us/office/dev/add-ins/reference/objectmodel/requirement-set-1.5/office.context.mailbox 中有记录,因此您的 CreateItem 请求在此上下文中不起作用。如果只是垃圾邮件报告,消息是否需要来自用户?只需使用 EWS 的服务帐户执行发送部分,甚至只需通过 SMTP 发送即可。

【讨论】:

  • 这很有趣,尤其是 SMTP 选项,我可以研究一下,但是你有一个你认为特别好的例子的链接吗?此外,在研究这一点时,我还遇到了创建自己的服务以使用托管 API 的选项,但要在 C# 中进行,但这对于边缘情况来说似乎有点多。我也没有像我想要的那样研究 REST API。
  • 在您的中间件中,您只需添加 SMTP 或 EWS 代码即可发送消息,这取决于您的代码在哪里运行以及它从应用程序池等获得的权限或您输入的凭据. 对于 SMTP Mimekit 应该也可以使用 CDOSys 如果你有一个旧的操作系统
猜你喜欢
  • 1970-01-01
  • 2018-05-19
  • 2018-04-20
  • 2016-02-21
  • 1970-01-01
  • 2019-05-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多