EWS Error: 'Set action is invalid for property' when CreateItem with attachment by Using XML EWS API

836 Views Asked by At

I need to create an item with attachments.

I am using This documentation and following is my xml request:

"<soap:Envelope xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" "
 " xmlns:m=\"http://schemas.microsoft.com/exchange/services/2006/messages\" "
 " xmlns:t=\"http://schemas.microsoft.com/exchange/services/2006/types\" "
 " xmlns:soap=\"http://schemas.xmlsoap.org/soap/envelope/\">"
 "<soap:Header>"
 "<t:RequestServerVersion Version=\"Exchange2010\" />"
 "</soap:Header>"
 "<soap:Body>"
 "<m:CreateItem MessageDisposition=\"SaveOnly\">"
 "<m:Items>"
 "<t:Message>"
 "<t:Subject>%@</t:Subject>"
 "<t:Body BodyType=\"HTML\">%@</t:Body>"
 "<t:ToRecipients>"
 "%@"
 "</t:ToRecipients>"
 "<t:CcRecipients>"
 "%@"
 "</t:CcRecipients>"
 "<t:BccRecipients>"
 "%@"
 "</t:BccRecipients>"

 "<t:Attachments>"
     "<t:FileAttachment>"
     "<t:Name>FileAttachment.txt</t:Name>"
     "<t:IsInline>false</t:IsInline>"
     "<t:IsContactPhoto>false</t:IsContactPhoto>"
     "<t:Content>VGhpcyBpcyBhIGZpbGUgYXR0YWNobWVudC4=</t:Content>"
     "</t:FileAttachment>"
 "</t:Attachments>"

 "</t:Message>"
 "</m:Items>"
 "</m:CreateItem>"
 "</soap:Body>"
 "</soap:Envelope>"

But EWS API returns following error:

    <?xml version="1.0" encoding="utf-8"?>
<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/">
    <s:Header>
        <h:ServerVersionInfo MajorVersion="15" MinorVersion="1" MajorBuildNumber="817" MinorBuildNumber="11" Version="V2016_10_10" xmlns:h="http://schemas.microsoft.com/exchange/services/2006/types" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" />
    </s:Header>
    <s:Body>
        <m:CreateItemResponse xmlns:m="http://schemas.microsoft.com/exchange/services/2006/messages" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:t="http://schemas.microsoft.com/exchange/services/2006/types">
            <m:ResponseMessages>
                <m:CreateItemResponseMessage ResponseClass="Error">
                    <m:MessageText>Set action is invalid for property.</m:MessageText>
                    <m:ResponseCode>ErrorInvalidPropertySet</m:ResponseCode>
                    <m:DescriptiveLinkKey>0</m:DescriptiveLinkKey>
                    <m:MessageXml>
                        <t:FieldURI FieldURI="item:Attachments" />
                    </m:MessageXml>
                    <m:Items />
                </m:CreateItemResponseMessage>
            </m:ResponseMessages>
        </m:CreateItemResponse>
    </s:Body>
</s:Envelope>

Am I doing something something wrong? When I remove attachment section from my XML request then it is working but not with attachment.

1

There are 1 best solutions below

0
On

Here is my sample. First I fetch ChangeKey using this request

Office.context.mailbox.item.saveAsync((res) => {
      const itemID = res.value;
      const request = `
      <soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
            xmlns:m="http://schemas.microsoft.com/exchange/services/2006/messages" 
            xmlns:t="http://schemas.microsoft.com/exchange/services/2006/types" 
            xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
      <soap:Header>
        <t:RequestServerVersion Version="Exchange2007_SP1" />
      </soap:Header>
      <soap:Body>
        <m:GetItem>
          <m:ItemShape>
            <t:BaseShape>IdOnly</t:BaseShape>
          </m:ItemShape>
          <m:ItemIds>
            <t:ItemId Id="${itemID}" />
          </m:ItemIds>
        </m:GetItem>
      </soap:Body>
    </soap:Envelope>`;

      Office.context.mailbox.makeEwsRequestAsync(request, (asyncResult) => {
        if (asyncResult.status === Office.AsyncResultStatus.Failed) {
          console.log(asyncResult);
          return;
        }
        const changeKey = getChangeKey(asyncResult.value); // parse xml response to get change key
      });
    });

And after that I call send request

const request = ` <soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
                           xmlns:m="http://schemas.microsoft.com/exchange/services/2006/messages"
                           xmlns:t="http://schemas.microsoft.com/exchange/services/2006/types"
                           xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
              <soap:Header>
                <t:RequestServerVersion Version="Exchange2007_SP1" />
              </soap:Header>
              <soap:Body>
                <m:SendItem SaveItemToFolder="true">
                  <m:ItemIds>
                    <t:ItemId Id="${itemID}" ChangeKey="${changeKey}" />
                  </m:ItemIds>
                  <m:SavedItemFolderId>
                    <t:DistinguishedFolderId Id="sentitems" />
                  </m:SavedItemFolderId>
                </m:SendItem>
              </soap:Body>
            </soap:Envelope>`;
    
          Office.context.mailbox.makeEwsRequestAsync(request, (asyncResult) => {
            if (asyncResult.status === Office.AsyncResultStatus.Failed) {
              console.log(asyncResult);
              return;
            }
            // email sent successfully 
          });