从邮件正文中检索 URL 的最佳方式

best way to retrieve URLs from a mail body

以下行使 Mac 客户端上的加载项无响应。如果我们删除此行并直接执行函数 someFunction,则加载项在 mac 客户端上绝对可以正常工作。

Office.context.mailbox.item.body.getAsync("html", someFunction);

我们使用 body.getAsync() 因为我们需要通过处理 html 和那些包含特定 ID 的 url 来提取邮件正文中的所有 URL。

尝试使用以下但未提供预期的 URL。

var links = Office.context.mailbox.item.getEntities().urls;

我也在尝试以下

Office.initialize = function (reason) {
    $(document).ready(function () {
        app.initialize();
        Office.context.mailbox.item.body.getAsync("html", processHtmlBody);
    });
};

function processHtmlBody(asyncResult) {
    var htmlParser = new DOMParser().parseFromString(asyncResult.value, "text/html");
    var links = htmlParser.getElementsByTagName("a");       
}

是否有更好的替代方法来从邮件正文中获取 URL。

请注意,getAsync 是 1.3 邮箱要求集的一部分,Mac 的 Outlook 当前不支持:

https://dev.outlook.com/reference/add-ins/tutorial-api-requirement-sets.html

否则使用实体是您唯一的选择,但 getElementsByTagName 可能效果最好(如果您可以访问电子邮件正文)。

我们尝试使用 makeEwsRequestAsync()getEntities().urls alternatives/workarounds 从 Mac 客户端上的邮件正文中检索 URL。但是都没有成功:

  • makeEwsRequestAsync():“没有数据错误”。
  • getEntities().urls : 没有给出预期 result/URLs

因此,对于 Mac 客户端,我们最终更改了逻辑并添加了条件逻辑,其中不包含任何用于检索 URL 的代码。

if (Office.context.requirements.isSetSupported("mailbox", 1.3))
{
//conditional code

}

我遇到了同样的问题,我用类似的方法解决了它:

return new Promise((resolve, reject) => {
    mailbox.item.body.getAsync(window.Office.CoercionType.Html, asyncResult => {
        if (asyncResult.status == window.Office.AsyncResultStatus.Succeeded) {
            var $dom = $(asyncResult.value);
            var url = $dom.find('#x_hiddenURL').text();

            resolve(url);
        } else {
            reject(new Error('Failed to load email body'));
        }
   });
});