I am developing an outlook plugin that needs to upload not a file attachment but a reference file when the user compose a message.
I've tried to use these 3 methods :
- addFileAttachmentAsync(uri, attachmentName, [options], [callback])
- addItemAttachmentAsync(itemId, attachmentName, [options], [callback])
- makeEwsRequestAsync(data, callback, [userContext])
Results of the 3 methods :
- Not able to add referenceFile
- MessageText":"You cannot attach yourself.","ResponseCode":"ErrorCannotAttachSelf","ResponseClass":"Error"}]}}}
- HTTP 500 error.
Code of the second method :
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);
}
});
});
};
Code of the third method :
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);
}
});
});
};
None of the three methods works. Is there a way to upload a cloud attachment like this one ? :
If yes, what is the method to use ?
Regards
from Outlook Plugin upload FileReference as attachment
No comments:
Post a Comment