首页 > 解决方案 > Outlook 插件上传 FileReference 作为附件

问题描述

我正在开发一个 Outlook 插件,当用户撰写消息时,它需要上传的不是文件附件而是参考文件。

我尝试使用这 3 种方法:

  1. addFileAttachmentAsync(uri, attachmentName, [options], [callback])
  2. addItemAttachmentAsync(itemId, attachmentName, [options], [callback])
  3. makeEwsRequestAsync(数据,回调,[userContext])

3种方法的结果:

  1. 无法添加参考文件
  2. MessageText":"你不能附加自己。","ResponseCode":"ErrorCannotAttachSelf","ResponseClass":"Error"}]}}}
  3. HTTP 500 错误。

第二种方法的代码:

var messageId = await getMessageItemId();
var exchangeAttachment = await uploadAttachmentToExchange(accessToken, messageId, attachment.name,fileUploaded.webUrl);
await addReferenceAttachment(exchangeAttachment.id, attachment.name);

var uploadAttachmentToExchange = async function(accessToken, messageId, fileName, fileUrl){
    var OneDriveURL = "https://graph.microsoft.com/beta/me/messages/"+messageId+"/attachments";
    var payload = JSON.stringify({ 
        "@odata.type": "#microsoft.graph.referenceAttachment", 
        "name": fileName, 
        "sourceUrl": fileUrl, 
        "providerType": "oneDriveBusiness", 
        "permission": "organizationEdit",
        "isFolder" : false,
        "isInline" : false
    }) ;
    
    return new Promise((successCallback, failureCallback) => {
        $.ajax({
            method: "POST",
            contentType: 'application/json',
            dataType: 'json',
            headers: {
                'Authorization': 'Bearer '+ accessToken
            },
            url: OneDriveURL,
            data : payload
        })
        .done(function( response ) {
            successCallback(response);
        })
        .fail(function(resultat, status, error) {
            failureCallback(resultat);
        });
    }); 
};

var getMessageItemId = async function(){
    return new Promise((successCallback, failureCallback) => {
        mailboxItem.getItemIdAsync(function(asyncResult){
            if (asyncResult.status === Office.AsyncResultStatus.Failed) {
                failureCallback(asyncResult.error.message);
            } else {
                successCallback(asyncResult.value);
            }
        });
    });  
};

var addReferenceAttachment = async function(itemId, attachmentName){
    return new Promise((successCallback, failureCallback) => {
        mailboxItem.addItemAttachmentAsync(itemId, attachmentName, {}, function(asyncResult){
            if (asyncResult.status === Office.AsyncResultStatus.Failed) {
                failureCallback(asyncResult.error.message);
            } else {
                successCallback(asyncResult);
            }
        });
    });
};

第三种方法的代码:

var messageId = await getMessageItemId();
await uploadAttachmentUsingEWSAPI(messageId);

var uploadAttachmentUsingEWSAPI = async function (messageId){
    var request = 
    '<?xml version="1.0" encoding="utf-8"?>'+
    '<soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"'+
    '               xmlns:m="https://schemas.microsoft.com/exchange/services/2006/messages"'+
    '               xmlns:t="https://schemas.microsoft.com/exchange/services/2006/types"'+
    '               xmlns:soap="https://schemas.xmlsoap.org/soap/envelope/">'
    '  <soap:Header>'
    '    <t:RequestServerVersion Version="Exchange2007_SP1" />'
    '    <t:TimeZoneContext>'
    '      <t:TimeZoneDefinition Id="Central Standard Time" />'
    '    </t:TimeZoneContext>'
    '  </soap:Header>'
    '  <soap:Body>'
    '    <m:CreateAttachment>'
    '      <m:ParentItemId Id="'+ messageId +'" />'
    '      <m:Attachments>'
    '        <t:FileAttachment>'
    '          <t:Name>FileAttachment.txt</t:Name>'
    '          <t:Content>VGhpcyBpcyBhIGZpbGUgYXR0YWNobWVudC4=</t:Content>'
    '        </t:FileAttachment>'
    '      </m:Attachments>'
    '    </m:CreateAttachment>'
    '  </soap:Body>'
    '</soap:Envelope>';

    console.log(request);
    return sendEWSRequest(request);
};

var sendEWSRequest = async function(request){
    return new Promise((successCallback, failureCallback) => {
        Office.context.mailbox.makeEwsRequestAsync(request, function(asyncResult){
            if (asyncResult.status === Office.AsyncResultStatus.Failed) {
                failureCallback(asyncResult.error.message);
            } else {
                successCallback(asyncResult);
            }
        });
    });
};

这三种方法都不起作用。有没有办法上传像这样的云附件?:

在此处输入图像描述

如果是,使用什么方法?

问候

标签: javascriptexchangewebservicesoutlook-addinoutlook-web-addinsyo

解决方案


目前该功能:根据您的要求,使用 Addins API 添加云附件作为参考不是产品的一部分。我们在我们的技术社区页面上跟踪 Outlook 加载项功能请求。请在那里提交您的请求并选择适当的标签。当我们完成规划过程时,会考虑技术社区的功能请求。


推荐阅读