问题
Office.context.mailbox.item.body
gives null while
Office.context.mailbox.item.body.getAsync()
works only with JavaScript API 1.3
.
Is there any way to fetch email body with JavaScript API 1.1/1.2
?
回答1:
Yes you can. Actually, you will retrieve the body using Exchange Web Services.
As explained here there are two ways to do this: 1) SOAP request from javascript (client app) or 2) server side using an SDK such as the .NET Exchange Web SDK
For solution 1), your request could look like the following js snippet (note that I have used an angular.js promise with that.$q.defer();
but this is not mandatory)
function getSoapEnvelope(request) {
// Wrap an Exchange Web Services request in a SOAP envelope.
var result =
'<?xml version="1.0" encoding="utf-8"?>' +
'<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"' +
' xmlns:t="http://schemas.microsoft.com/exchange/services/2006/types">' +
' <soap:Header>' +
' <t:RequestServerVersion Version="Exchange2013"/>' +
' </soap:Header>' +
' <soap:Body>' +
request +
' </soap:Body>' +
'</soap:Envelope>';
return result;
}
var getBodyAsync = function () {
var that =this;
var deferred = that.$q.defer();
function getHeadersRequest(id) {
// Return a GetItem EWS operation request for the headers of the specified item.
var result =
' <GetItem xmlns="http://schemas.microsoft.com/exchange/services/2006/messages">' +
' <ItemShape>' +
' <t:BaseShape>IdOnly</t:BaseShape>' +
' <t:BodyType>HTML</t:BodyType>' +
' <t:AdditionalProperties>' +
' <t:FieldURI FieldURI="item:Body"/>' +
' </t:AdditionalProperties>' +
' </ItemShape>' +
' <ItemIds><t:ItemId Id="' + id + '"/></ItemIds>' +
' </GetItem>';
return result;
}
// Create a local variable that contains the mailbox.
var mailbox = Office.context.mailbox;
var request = getHeadersRequest(mailbox.item.itemId);
var envelope = getSoapEnvelope(request);
var callback = function (data) {
var $data = $(data.value);
var $body = $("t\\:Body", $data);
deferred.resolve($body.html());
}
mailbox.makeEwsRequestAsync(envelope, callback);
return deferred.promise;
};
And for solution 2) with .NET Exchange SDK
ExchangeService service = new ExchangeService();
service.Credentials = new OAuthCredentials(token);
service.Url = new Uri(ewsUrl);
PropertyDefinition definition = ItemSchema.NormalizedBody;
var propertySet = new PropertySet(definition, ItemSchema.Attachments,
ItemSchema.HasAttachments);
EmailMessage ewsEmail = EmailMessage.Bind(service, new ItemId(itemId), propertySet);
return ewsEmail.NormalizedBody.Text;
来源:https://stackoverflow.com/questions/36685110/outlook-web-app-exchange-2013-on-premise-api-1-2-how-to-access-email-body