Outlook Mail (Office 365) Connector
Documentation
Version: 3
Documentation

Outlook Mail (Office 365) Connector - Source Code


<?xml version="1.0" encoding="utf-8"?>
<ApiConfig Name="Outlook Mail (Office 365)"
           Desc="Outlook Mail Connector (Office 365) can be used to integrate Office 365 Outlook Mail API in your App / BI Tools. You can download attachment, read / search Emails, Users, MailFolders, Send email and more."
           Slug="outlook-mail-connector"
           Id="8b5786b9-5dee-4420-8b12-8a7058d63148"
           Logo="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAJYAAACWCAYAAAA8AXHiAAAACXBIWXMAAAsTAAALEwEAmpwYAAAFyWlUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4gPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgNy4yLWMwMDAgNzkuMWI2NWE3OSwgMjAyMi8wNi8xMy0xNzo0NjoxNCAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RFdnQ9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZUV2ZW50IyIgeG1sbnM6ZGM9Imh0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvIiB4bWxuczpwaG90b3Nob3A9Imh0dHA6Ly9ucy5hZG9iZS5jb20vcGhvdG9zaG9wLzEuMC8iIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIDIzLjUgKFdpbmRvd3MpIiB4bXA6Q3JlYXRlRGF0ZT0iMjAyMy0wMy0xM1QxMTowNjoyNS0wNDowMCIgeG1wOk1ldGFkYXRhRGF0ZT0iMjAyMy0wMy0xM1QxMTowNjoyNS0wNDowMCIgeG1wOk1vZGlmeURhdGU9IjIwMjMtMDMtMTNUMTE6MDY6MjUtMDQ6MDAiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6Zjk5ODFmN2YtZGEzZS0xOTQ2LWFlNGQtZmEyNTgyODE2Yjk5IiB4bXBNTTpEb2N1bWVudElEPSJhZG9iZTpkb2NpZDpwaG90b3Nob3A6OTZlOTE5OTctMjlkMS02ZjQxLWFjNDAt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"
           Version="3"
           EngineVersion="11">
  <VersionHistory>
      <Change Ver="3" Date="2024-12-20" Type="New">Added "UserId" parameter to "User Credentials" and "Application Credentials" authentications.</Change>
      <Change Ver="3" Date="2024-12-20" Type="Fix">Updated the default value for parameter "Scope" to "https://graph.microsoft.com/.default" in Application Credentials authentication.</Change>
      <Change Ver="3" Date="2024-12-20" Type="Fix">Made "ReturnUrl" parameter required and set it to "https://zappysys.com/oauth" by default in User Credentials authentication.</Change>      
      <Change Ver="3" Date="2024-12-20" Type="Modified">Updated help links, auth descriptions, and auth instructions with images.</Change>      
      
	 <Change Ver="2" Date="2024-06-24" Type="New">Lookup operation might fail if you query Users or other Objects by ID becuase its passing general OData options in URL (e.g. $top)</Change>
	 <Change Ver="2" Date="2024-06-24" Type="New">New endpoint download_message_attachments to get multiple attachments by search condition</Change>
 	 <Change Ver="2" Date="2024-06-24" Type="New">Allow to get messages from a specific folder for get_messages and get_my_messages endpoints</Change>
      <Change Ver="2" Date="2024-06-24" Type="Fix">Updated datatypes for some endpoint columns (previously they were all string types)</Change>
     
      <Change Ver="1" Date="2023-03-28" Type="New">Initial version</Change>
  </VersionHistory>

  <ServiceUrls>
    <ServiceUrl Name="Microsoft Graph API v1.0" Url="https://graph.microsoft.com/v1.0" />
  </ServiceUrls>

  <Auths>
    <Auth Type="OAuth" Name="UserCreds" Label="User Credentials" 
          Desc="Use delegated access (User Credentials) whenever you want to let a signed-in user work with their own resources or resources they can access. 
                Whether it's an admin setting up policies for their entire organization or a user deleting an email in their inbox, 
                all scenarios involving user actions should use delegated access."
          HelpLink="https://learn.microsoft.com/en-us/entra/identity-platform/delegated-access-primer"
          ConnStr="Provider=Custom;OAuthVersion=OAuth2;GrantType=Default;Scope=[$Scope$];ScopeSeparator={space};"
          TestEndPoint="get_my_info">
      <Params>
        <Param Name="AuthUrl" 
               Label="Authorization URL" 
               Required="True" 
               Options="For Single-Tenant Use=https://login.microsoftonline.com/{ENTER-TENANT-ID-HERE}/oauth2/v2.0/authorize;For Multi-Tenant Use=https://login.microsoftonline.com/common/oauth2/v2.0/authorize" />
        <Param Name="TokenUrl" Label="Token URL" 
               Required="True" 
               Options="For Single-Tenant Use=https://login.microsoftonline.com/{ENTER-TENANT-ID-HERE}/oauth2/v2.0/token;For Multi-Tenant Use=https://login.microsoftonline.com/common/oauth2/v2.0/token"
               HelpLink="https://docs.microsoft.com/en-us/graph/auth-register-app-v2"/>
        <Param Name="ClientId" Label="Client ID" Required="True" HelpLink="https://docs.microsoft.com/en-us/graph/auth-register-app-v2" />
        <Param Name="ClientSecret" Label="Client Secret" Secret="True"/>
        <Param Name="RefreshTokenFilePath" Label="Refresh Token File Path" Hidden="True" Desc="If you cant fit long refresh token in ConnectionString from your program then use this. Supply three properties in json format (i.e. save this in file { &quot;access_token&quot;: &quot;YOUR_ACCESS_TOKEN&quot;, &quot;refresh_token&quot;: &quot;YOUR_REFRESH_TOKEN&quot;, &quot;expires_in&quot;: 3600 } )"/>
        <Param Name="Scope"
               Required="True"
               Options="offline_access;email;Mail.Read;Mail.Read.Shared;Mail.ReadBasic;Mail.ReadBasic.Shared;openid;profile;User.Read;User.ReadBasic.All;Mail.ReadWrite;Mail.ReadWrite.Shared;Mail.Send;Mail.Send.Shared"
               MultiSelectSeparator=" "
               MultiSelect="True"
               Value="offline_access~email~Mail.Read~Mail.Read.Shared~Mail.ReadBasic~Mail.ReadBasic.Shared~openid~profile~User.Read~User.ReadBasic.All~Mail.ReadWrite~Mail.ReadWrite.Shared~Mail.Send~Mail.Send.Shared~"
               Desc="Permissions you want to use."
               Example="offline_access~email~Mail.Read~Mail.Read.Shared~Mail.ReadBasic~Mail.ReadBasic.Shared~openid~profile~User.Read~User.ReadBasic.All~Mail.ReadWrite~Mail.ReadWrite.Shared~Mail.Send~Mail.Send.Shared~"
               HelpLink="https://learn.microsoft.com/en-us/graph/permissions-reference"/>
          
        <Param Name="ReturnUrl" Required="True" Label="Return URL" Value="https://zappysys.com/oauth" Options="https://zappysys.com/oauth" />
        <Param Name="ExtraAttributesForAuthRequest"
			Label="Login Prompt Option"
               Options="None=;Force login prompt=prompt=login;Force permission select=prompt=consent;"
               Desc="Choose this if you want to force login prompt or permission prompt."
               HelpLink="https://learn.microsoft.com/en-us/azure/active-directory/develop/v2-oauth2-auth-code-flow"/>
        
        <Param Name="UserId" 
               Template="UserIdParam" 
               Label="Default User Id (Select after clicking **Generate Token**)"
               Value="me" 
               OptionsExtra="My user=me"
               Required="False"/>
          
        <!--below not exposed as root level property in HTTP Connection so use as placeholder-->
        <Param Name="RetryMode" Value="RetryWhenStatusCodeMatch" Options="None;RetryAny;RetryWhenStatusCodeMatch;" Hidden="True" />
        <Param Name="RetryStatusCodeList" Value="429|503" Hidden="True" />
        <Param Name="RetryCountMax" Value="5" Hidden="True" />
        <Param Name="RetryMultiplyWaitTime" Value="True" Hidden="True" />          
      </Params>
      <Notes>
        <![CDATA[<p>Follow these simple steps below to create Microsoft Entra ID application with delegated access:<p/>
                
<div class="alert alert-warning">
    <strong>WARNING</strong>: 
    If you are planning to automate processes, we recommend that you use a <em>Application Credentials</em> authentication method.    
    In case, you still need to use <em>User Credentials</em>, then make sure you use a system/generic account (e.g. <code>automation@my-company.com</code>).
    When you use a personal account which is tied to a specific employee profile and that employee leaves the company, 
    the token may become invalid and any automated processes using that token will start to fail.   
</div>
        
<ol>
    <li>
        Navigate to the <a target="_blank" href="https://portal.azure.com/#home">Azure Portal</a> and log in using your credentials.
    </li>
    <li>
        Access <a target="_blank" href="https://portal.azure.com/#blade/Microsoft_AAD_IAM/ActiveDirectoryMenuBlade/Overview">Microsoft Entra ID</a>.
    </li>
    <li>
        Register a new application by going to 
        <a target="_blank" href="https://portal.azure.com/#blade/Microsoft_AAD_IAM/ActiveDirectoryMenuBlade/RegisteredApps">App registrations</a>
        and clicking on <strong>New registration</strong> button:

        <img src="https://cdn.zappysys.com/api/Images/authentication/microsoft/start-new-app-registration-in-microsoft-entra-id.png"
             loading="lazy"
             decoding="async"
             class="img-thumbnail block"
             alt="Start new app registration in Microsoft Entra ID"
             title="Starting new app registration in Microsoft Entra ID"
             width="1000"
             height="490" />
             
        <div class="alert alert-info">
            <strong>INFO:</strong>
            Find more information on how to register an application in <a target="_blank" href="https://docs.microsoft.com/en-us/graph/auth-register-app-v2">Graph API reference</a>.
        </div>
    </li>
    <li>
        When configuration window opens, configure these fields:
        
        <ul>
            <li>
                <strong>Supported account type</strong>
                <ul>
                    <li>Use <code>Accounts in this organizational directory only</code>, if you need access to data in your organization only.</li>
                </ul>    
            </li>
            </li>
            <li>
                <strong>Redirect URI</strong>:
                <ul>
                    <li>Set the type to <code>Public client/native (mobile & desktop)</code>.</li>
                    <li>Use <code>https://zappysys.com/oauth</code> as the URL.</li>
                </ul>    
            </li>
        </ul>

        <img src="https://cdn.zappysys.com/api/Images/authentication/microsoft/register-app-in-microsoft-entra-id.png"
             loading="lazy"
             decoding="async"
             class="img-thumbnail block"
             alt="Register app in Microsoft Entra ID"
             title="Registering app in Microsoft Entra ID"
             width="1000"
             height="840" />        
    </li>        
    <li>       
        After registering the app, copy the <strong>Application (client) ID</strong> for later:
                
        <img src="https://cdn.zappysys.com/api/Images/authentication/microsoft/copy-client-id-of-microsoft-entra-id-app.png"
             loading="lazy"
             decoding="async"
             class="img-thumbnail block"
             alt="Copy client ID of Microsoft Entra ID app"
             title="Copying client ID of Microsoft Entra ID app"
             width="1000"
             height="560" />
    </li>
    <li>       
        Then copy <strong>OAuth authorization endpoint (v2)</strong> & <strong>OAuth token endpoint (v2) URLs</strong> to use later in the configuration:
       
        <img src="https://cdn.zappysys.com/api/Images/authentication/microsoft/copy-auth-and-token-urls-in-microsoft-entra-id-app.png"
             loading="lazy"
             decoding="async"
             class="img-thumbnail block"
             alt="Copy Auth and Token URLs in Microsoft Entra ID app"
             title="Copying Auth and Token URLs in Microsoft Entra ID app"
             width="1000"
             height="560" />
    </li>
    <li>
        Now go to SSIS package or ODBC data source and use the copied values in <strong>User Credentials</strong> authentication configuration:
               
	   <ul>
            <li>In the <strong>Authorization URL</strong> field paste the <strong>OAuth authorization endpoint (v2) URL</strong> value you copied in the previous step.</li>        
            <li>In the <strong>Token URL</strong> field paste the <strong>OAuth token endpoint (v2) URL</strong> value you copied in the previous step.</li>        
            <li>In the <strong>Client ID</strong> field paste the <strong>Application (client) ID</strong> value you copied in the previous step.</li>
            <li>
                In the <strong>Scope</strong> field use the default value or select individual scopes, e.g.:
                <ul>
                    <li>
                        <code>email</code>
                    </li>                                    
                    <li>
                        <code>offline_access</code>
                    </li>
                    <li>
                        <code>openid</code>
                    </li>
                    <li>
                        <code>profile</code>
                    </li>
                    <li>
                        <code>Mail.Read</code>
                    </li>                    
                    <li>                    
                        <code>Mail.Read.Shared</code>
                    </li>                        
                    <li>                        
                        <code>Mail.ReadBasic</code>
                    </li>                        
                    <li>                        
                        <code>Mail.ReadBasic.Shared</code>
                    </li>                        
                    <li>                        
                        <code>Mail.ReadWrite</code>
                    </li>                        
                    <li>                        
                        <code>Mail.ReadWrite.Shared</code>
                    </li>                        
                    <li>                        
                        <code>Mail.Send</code>
                    </li>                        
                    <li>                        
                        <code>Mail.Send.Shared</code>
                    </li>                        
                    <li>                        
                        <code>User.Read</code>
                    </li>                        
                    <li>                        
                        <code>User.ReadBasic.All</code>                    
                    </li>
                </ul>
            </li>
        </ul>
    </li>
    <li>
        Press <strong>Generate Token</strong> button to generate Access and Refresh Tokens.
    </li>    
    <li>
        <em>Optional step</em>. Choose <strong>Default User Id</strong> from the drop down menu (if someone shared a mailbox with you).
    </li>
    <li>
        Click <strong>Test Connection</strong> to confirm the connection is working.
    </li>
    <li>
        Done! Now you are ready to use the API Connector!
    </li>
</ol>
]]>
      </Notes>        
    </Auth>
      
      
    <Auth Type="OAuth" Name="AppCreds" Label="Application Credentials"
           Desc="Application-only access is broader and more powerful than delegated access (User Credentials), so you should only use app-only access where needed. 
                 Use it when: 1. The application needs to run in an automated way, without user input 
                                 (for example, a daily script that checks emails from certain contacts and sends automated responses).
                              2. The application needs to access resources belonging to multiple different users 
                                 (for example, a backup or data loss prevention app might need to retrieve messages from many different chat channels, each with different participants).
                              3. You find yourself tempted to store credentials locally and allow the app to sign in 'as' the user or admin."
           HelpLink="https://learn.microsoft.com/en-us/entra/identity-platform/app-only-access-primer"
           ConnStr="Provider=Custom;OAuthVersion=OAuth2;ScopeSeparator={space};GrantType=ClientCredentials;Scope=[$Scope$];ScopeSeparator={space};"
           TestEndPoint="get_my_info">
      <Params>
        <Param Name="TokenUrl" Label="Token URL" Required="True" Options="For Single Tenant=https://login.microsoftonline.com/{ENTER-TENANT-ID-HERE}/oauth2/v2.0/token;For Multi Tenant=https://login.microsoftonline.com/common/oauth2/v2.0/token"  />
        <Param Name="ClientId" Label="Client ID" Required="True" />
        <Param Name="ClientSecret" Label="Client Secret" Secret="True" Required="True"/>
        <Param Name="Scope"
               Required="True"
               Options="https://graph.microsoft.com/.default"
               MultiSelectSeparator=" "
               MultiSelect="True"
               Value="https://graph.microsoft.com/.default"
               Desc="Permissions you want to use."
               HelpLink="https://learn.microsoft.com/en-us/graph/permissions-reference" />
        <Param Name="UserId" Template="UserIdParam" 
               Label="Default User Id" />          
          
        <!--below not exposed as root level property in HTTP Connection so use as placeholder-->
        <Param Name="RetryMode" Value="RetryWhenStatusCodeMatch" Options="None;RetryAny;RetryWhenStatusCodeMatch;" Hidden="True" />
        <Param Name="RetryStatusCodeList" Value="429|503" Hidden="True" />
        <Param Name="RetryCountMax" Value="5" Hidden="True" />
        <Param Name="RetryMultiplyWaitTime" Value="True" Hidden="True" />        
      </Params>
      <Notes>
<![CDATA[
<p>
    Follow these simple steps below to create Microsoft Entra ID application with application access permissions.
<p/>

<ol>
    <li>
        Navigate to the <a href="https://portal.azure.com/#home" target="_blank">Azure Portal</a> and log in using your credentials.
    </li>
    <li>
        Access <a target="_blank" href="https://portal.azure.com/#blade/Microsoft_AAD_IAM/ActiveDirectoryMenuBlade/Overview">Microsoft Entra ID</a>.
    </li>
    <li>
        Register a new application by going to 
        <a target="_blank" href="https://portal.azure.com/#blade/Microsoft_AAD_IAM/ActiveDirectoryMenuBlade/RegisteredApps">App registrations</a>
        and clicking on <strong>New registration</strong> button:

        <img src="https://cdn.zappysys.com/api/Images/authentication/microsoft/start-new-app-registration-in-microsoft-entra-id.png"
             loading="lazy"
             decoding="async"
             class="img-thumbnail block"
             alt="Start new app registration in Microsoft Entra ID"
             title="Starting new app registration in Microsoft Entra ID"
             width="1000"
             height="490" />

        <div class="alert alert-info">
            <strong>INFO:</strong>
            Find more information on how to register an application in <a target="_blank" href="https://docs.microsoft.com/en-us/graph/auth-register-app-v2">Graph API reference</a>.
        </div>        
    </li>
    <li>
        When configuration window opens, configure these fields:
        
        <ul>
            <li>
                <strong>Supported account type</strong>
                <ul>
                    <li>e.g. select <code>Accounts in this organizational directory only</code> if you need access to data in your organization only.</li>
                </ul>    
            </li>
            </li>
            <li>
                <strong>Redirect URI</strong>:
                <ul>
                    <li>Set the type to <code>Public client/native (mobile & desktop)</code>.</li>
                    <li>Leave the URL field empty.</li>
                </ul>
            </li>
        </ul>

        <img src="https://cdn.zappysys.com/api/Images/authentication/microsoft/register-app-in-microsoft-entra-id.png"
             loading="lazy"
             decoding="async"
             class="img-thumbnail block"
             alt="Register app in Microsoft Entra ID"
             title="Registering app in Microsoft Entra ID"
             width="1000"
             height="840" />        
    </li>        
    <li>       
        After registering the app, copy the <strong>Application (client) ID</strong> for later:
                
        <img src="https://cdn.zappysys.com/api/Images/authentication/microsoft/copy-client-id-of-microsoft-entra-id-app.png"
             loading="lazy"
             decoding="async"
             class="img-thumbnail block"
             alt="Copy client ID of Microsoft Entra ID app"
             title="Copying client ID of Microsoft Entra ID app"
             width="1000"
             height="560" />
    </li>
    <li>       
        Then copy <strong>OAuth authorization endpoint (v2)</strong> & <strong>OAuth token endpoint (v2) URLs</strong>:
       
        <img src="https://cdn.zappysys.com/api/Images/authentication/microsoft/copy-auth-and-token-urls-in-microsoft-entra-id-app.png"
             loading="lazy"
             decoding="async"
             class="img-thumbnail block"
             alt="Copy Auth and Token URLs in Microsoft Entra ID app"
             title="Copying Auth and Token URLs in Microsoft Entra ID app"
             width="1000"
             height="560" />
    </li>
    <li>
        Continue and create <strong>Client secret</strong>:
                
        <img src="https://cdn.zappysys.com/api/Images/authentication/microsoft/app-credentials/add-client-secret-for-microsoft-entra-id-app.png"
             loading="lazy"
             decoding="async"
             class="img-thumbnail block"
             alt="Add Client secret for Microsoft Entra ID app"
             title="Adding Client secret for Microsoft Entra ID app"
             width="1000"
             height="560" />
    </li>
    <li>
        Then copy the <strong>Client secret</strong> for later steps:
                
        <img src="https://cdn.zappysys.com/api/Images/authentication/microsoft/app-credentials/copy-client-secret-of-microsoft-entra-id-app.png"
             loading="lazy"
             decoding="async"
             class="img-thumbnail block"
             alt="Copy Client secret"
             title="Copy Client secret"
             width="1000"
             height="560" />
    </li>    
    <li>
        Continue by adding permissions for the app by going to the <strong>API permissions</strong> section, and clicking on <strong>Add a permission</strong>:
                        
        <img src="https://cdn.zappysys.com/api/Images/authentication/microsoft/start-adding-permissions-to-microsoft-entra-id-app.png"
             loading="lazy"
             decoding="async"
             class="img-thumbnail block"
             alt="Start adding permissions to Microsoft Entra ID app"
             title="Starting adding permissions to Microsoft Entra ID app"
             width="1000"
             height="520" />            
    </li>    
    <li>
        Select <strong>Microsoft Graph</strong>:
                
        <img src="https://cdn.zappysys.com/api/Images/authentication/microsoft/select-graph-api-permissions-for-microsoft-entra-id-app.png"
             loading="lazy"
             decoding="async"
             class="img-thumbnail block"
             alt="Select Graph API permissions for Microsoft Entra ID app"
             title="Selecting Graph API permissions for Microsoft Entra ID app"
             width="1000"
             height="420" />
    </li>          
    <li>
        Then choose <strong>Application permissions</strong> option: 
        
        <img src="https://cdn.zappysys.com/api/Images/authentication/microsoft/App-Credentials/select-app-permissions-for-microsoft-entra-id-app.png"
             loading="lazy"
             decoding="async"
             class="img-thumbnail block"
             alt="Select app permissions for Microsoft Entra ID app"
             title="Selecting app permissions for Microsoft Entra ID app"
             width="1000"
             height="320" />
    </li>        
    <li>
        Continue by adding these <strong>Mail</strong> (Outlook) permissions:
    
        <img src="https://cdn.zappysys.com/api/Images/authentication/microsoft/App-Credentials/select-outlook-mail-application-scopes.png"
             loading="lazy"
             decoding="async"
             class="img-thumbnail block"
             alt="Select Outlook Mail application scopes"
             title="Selecting Outlook Mail application scopes"
             width="1000"
             height="450" />
    </li>               
    <li>
        Finish by clicking <strong>Add permissions</strong> button:
        
        <img src="https://cdn.zappysys.com/api/Images/authentication/microsoft/add-permissions-to-microsoft-entra-id-app.png"
                loading="lazy"
                decoding="async"
                class="img-thumbnail block"
                alt="Add permissions to Microsoft Entra ID app"
                title="Adding permissions to Microsoft Entra ID app"
                width="270"
                height="70" />        
    </li>
    <li>
        Now it's time to <strong>Grant admin consent</strong> for your application:
        
        <img src="https://cdn.zappysys.com/api/Images/authentication/microsoft/App-Credentials/grant-admin-consent-for-microsoft-entra-id-app.png"
             loading="lazy"
             decoding="async"
             class="img-thumbnail block"
             alt="Grant admin consent for Microsoft Entra ID app"
             title="Granting admin consent for Microsoft Entra ID app"
             width="1000"
             height="590" />
    </li>
    <li>
        Confirm all the permissions are granted:
        
        <img src="https://cdn.zappysys.com/api/Images/authentication/microsoft/App-Credentials/admin-consent-granted-successfully-in-entra-id.png"
             loading="lazy"
             decoding="async"
             class="img-thumbnail block"
             alt="Admin consent granted successfully in Entra ID"
             title="Admin consent granted successfully in Entra ID"
             width="1000"
             height="260" />
    </li>    
    <li>
        Now go to SSIS package or ODBC data source and use the copied values in <strong>Application Credentials</strong> authentication configuration:
               
	   <ul>
            <li>In the <strong>Token URL</strong> field paste the <strong>OAuth token endpoint (v2) URL</strong> value you copied in the previous step.</li>        
            <li>In the <strong>Client ID</strong> field paste the <strong>Application (client) ID</strong> value you copied in the previous step.</li>
            <li>In the <strong>Client Secret</strong> field paste the <strong>Client secret</strong> value you copied in the previous step.</li>
            <li>Choose <strong>Default User Id</strong> from the drop down menu.</li>
        </ul>
    </li>    
    <li>
        Click <strong>Test Connection</strong> to confirm the connection is working.
    </li>
    <li>
        That's it! Now you can use the API Connector!
    </li>
</ol>

]]>
            </Notes>        
    </Auth>
  </Auths>


  <Template>
     <Param Name="UserIdParam" Label="User ID or Email" 
		  Required="True" 
		  Type="Placeholder"
            Desc="The Microsoft Mail user ID GUID or email address for the account to read messages from. (Examples: '4ff54a77-9c09-4274-958f-83bdc0a53900' or 'first.last@domain.com')"
            OptionsEndPoint="get_users"
		  OptionsEndPointValueColumn="Id"
		  OptionsEndPointLabelColumn="DisplayName" 
		  ValueTemplate="&lt;&lt;{$value$}|~|Eq|~|me|~|me|~|users/{$value$},FUN_IF&gt;&gt;"           
		  />
	<Param Name="MailFolderIdParam"           
		  OptionsEndPoint="get_mailfolders"
		  OptionsEndPointParameters="UserId=[$UserId$]"
		  OptionsEndPointValueColumn="Id"
		  OptionsEndPointLabelColumn="DisplayName"
		  ValueTemplate="mailfolders('{$value$}')/"
		  />
		  
    <Param Name="MessageColumnsParam" Key="$select" Label="Selected Columns" Type="Query"
	  OptionsEndPoint="get_table_columns" OptionsEndPointValueColumn="Name" OptionsEndPointParameters="Filter=message" 
	  OptionSort="ASC"
      MultiSelect="True" MultiSelectSeparator=","
      DataType="DT_WSTR" Length="4000"
      Desc="Select the individual columns to be included in the response, to reduce the response size and increase performance"
      HelpLink="https://zappysys.com/links?url=https://learn.microsoft.com/en-us/graph/query-parameters" />
	  
    <Param Name="UserColumnsParam" Key="$select" Label="Selected Columns" Type="Query"
	  OptionsEndPoint="get_table_columns" OptionsEndPointValueColumn="Name" OptionsEndPointParameters="Filter=user" 
	  OptionSort="ASC"
      MultiSelect="True" MultiSelectSeparator=","
      DataType="DT_WSTR" Length="4000"
      Desc="Select the individual columns to be included in the response, to reduce the response size and increase performance"
      HelpLink="https://zappysys.com/links?url=https://learn.microsoft.com/en-us/graph/query-parameters" />
	  
    <Param Name="MailFolderColumnsParam" Key="$select" Label="Selected Columns" Type="Query"
	  OptionsEndPoint="get_table_columns" OptionsEndPointValueColumn="Name" OptionsEndPointParameters="Filter=mailFolder" 
	  OptionSort="ASC"
      MultiSelect="True" MultiSelectSeparator=","
      DataType="DT_WSTR" Length="4000"
      Desc="Select the individual columns to be included in the response, to reduce the response size and increase performance"
      HelpLink="https://zappysys.com/links?url=https://learn.microsoft.com/en-us/graph/query-parameters" />

    <EndPoint Name="ODataGeneralOptions">
      <Params>
        <Param Name="OrderBy" Key="$orderby" Label="Order By" Type="Query"
          Options="None=;AscendingOrder=SomeColumn asc;DescendingOrder=SomeColumn desc;"
          DataType="DT_WSTR" Length="200"
          Desc="Order the specified column by ascending or descending order"
          HelpLink="https://zappysys.com/links?url=https://learn.microsoft.com/en-us/graph/query-parameters" />
        <Param Name="SearchCriteria" Key="$filter" Label="Search Criteria" Type="Query"
          Options="None=;Equal Search=SomeColumn eq 'SomeValue';Substring Search=substringof(SomeField,'abc');Starts With=startswith(SomeField, 'abc')"
          Desc="Data filter (e.g. somecolumn -eq 'somevalue')"
          HelpLink="https://zappysys.com/links?url=https://learn.microsoft.com/en-us/graph/query-parameters" />
        <Param Name="PageSize" Key="$top" Label="Page Size" Type="Query" Value="100"
          DataType="DT_I4" Desc="The number of records to include in each page of results"
          HelpLink="https://zappysys.com/links?url=https://learn.microsoft.com/en-us/graph/query-parameters" />
      </Params>
    </EndPoint>



    <EndPoint Name="SearchMessageParams"
		Headers="Prefer: outlook.body-content-type=[$EmailBodyFormat$]"
	>
	  <Params>
		<!-- KQL funtionality is still buggy in Mail API so commented
		<Param Name="SearchCriteriaKQL" Key="$search" Label="Search Criteria (using KQL) - Simple expression" Type="Query"
			Options="None=;
			Search Text in Body or Subject=&quot;invoice G020427950 is ready&quot;;
			From=from:some@abcinc.onmicrosoft.com;
			To=to:some@abcinc.onmicrosoft.com;
			Cc=cc:some@abcinc.onmicrosoft.com;
			Bcc=bcc:some@abcinc.onmicrosoft.com;
			Participants (From, To, Cc, Bcc)=participants:npatel@zappysys.onmicrosoft.com;
			Mail Received on=received:07/23/2018;
			Mail Sent on=sent:07/23/2018;
			Subject Contains=subject:daily report;"
			HelpLink="https://learn.microsoft.com/en-us/graph/search-query-parameter?tabs=http#using-search-on-message-collections"
			ValueTemplate="&quot;{$value$}&quot;"
		>
		
		</Param>
		-->
		
        <Param Name="SearchCriteria" Key="$filter" Label="Search Criteria" Type="Query"
              Options="None=;
			  From specific email='from/emailAddress/address eq 'microsoft-noreply@microsoft.com';
			  Has Attachments=hasAttachments eq true;
              Has Attachments, Sent After, and Subject containing 'party'=hasAttachments eq true and sentDateTime gt 2023-03-01 and contains(subject, 'party');
              Received before=receivedDateTime lt 2023-02-01;
              Sent after=sentDateTime gt 2023-03-01;
			  Sent after (dynamic)=sentDateTime gt &lt;&lt;yearstart+1d|~|yyyy-MM-dd,FUN_TO_DATE&gt;&gt;;
			  Search by Internet MessageId=contains(internetMessageId,''59e62584-e364-453a-8444-5591a324ddaa@az.centralus.production.microsoft.com'')
              Has attachment(s)=hasAttachments eq true;
              Subject contains 'case'=contains(subject, 'case');
              Subject starts with 'Your'=startsWith(subject, 'Your');
              Subject does not start with 'Your'=not(startsWith(subject, 'Your'));
              Only normal importance=importance eq 'normal';
              Only low importance=importance eq 'low';
              Only high importance=importance eq 'high';
              Only if delivery receipt requested=isDeliveryReceiptRequested eq true;
              Only if delivery receipt not requested=isDeliveryReceiptRequested eq false;
              Only if read receipt requested=isReadReceiptRequested eq true;
              Only if read receipt not requested=isReadReceiptRequested eq false;
              Only if message is read=isRead eq true;
              Only if message is unread=isRead eq false;
              Only if message is a draft=isDraft eq true;
              Only if message is not a draft=isDraft eq false;
              Body content contains=contains(body/content, 'money');
              From Sender 'John Doe'=sender/emailAddress/name eq 'John Doe'"
              Desc="Data filter (e.g. somecolumn -eq 'somevalue'), you can use Date time functions for dynamic date. You can use keywords like now,today,yesterday,monthstart,monthend,yearstart,yearend,weekstart,weekend along with operator + / - [hour,minute,second,day,month,year]"
              HelpLink="https://learn.microsoft.com/en-us/graph/filter-query-parameter?tabs=http" />        
        <Param Name="EmailBodyFormat" Label="Email Body Format" Type="Placeholder" Value="html" Required="True"
              Options="html;text" />

		<Param Name="MailFolderId" Template="MailFolderIdParam" />           
		 
      </Params>	
	</EndPoint>

    <EndPoint Name="MessageOutputColumns">
      <Params>
        <Param Name="SelectedColumns" Template="MessageColumnsParam" />
        <Param Name="EnableArrayFlattening" Value="True" Type="Property" Desc="Enables deep array flattening for selected filtered hierarchy. When you turn on this property it will flatten each property of each array item and expose as column (e.g. If you have array property called tags and value is ['red','blue','yellow'] and if you turn on array flatterning then may see columns tags.1, tags.2, tags.3... tags.N in the output. You can control how many array items you want to flatten by setting MaxArrayItemsToFlatten property." />
        <Param Name="MaxArrayItemsToFlatten" Value="5" Type="Property" />
      </Params>
      <OutputColumns>
        <Column Name="id" DataType="DT_WSTR" Label="Id" Length="1000" />
        <Column Name="receivedDateTime" DataType="DT_DBTIMESTAMP" Label="ReceivedDateTime" />
        <Column Name="hasAttachments" DataType="DT_BOOL" Label="HasAttachments" />
        <Column Name="subject" DataType="DT_WSTR" Label="Subject" Length="800" />
        <Column Name="bodyPreview" DataType="DT_WSTR" Label="BodyPreview" Length="4000" />
        <Column Name="sender.emailAddress.name" DataType="DT_WSTR" Label="SenderEmailAddressName" Length="800" />
        <Column Name="sender.emailAddress.address" DataType="DT_WSTR" Label="SenderEmailAddress" Length="800" />		
        <Column Name="importance" DataType="DT_WSTR" Label="Importance" Length="500" />
        <Column Name="sentDateTime" DataType="DT_DBTIMESTAMP" Label="SentDateTime" />		
        <Column Name="createdDateTime" DataType="DT_DBTIMESTAMP" Label="CreatedDateTime" />
        <Column Name="lastModifiedDateTime" DataType="DT_DBTIMESTAMP" Label="LastModifiedDateTime" />
        <Column Name="changeKey" DataType="DT_WSTR" Label="ChangeKey" Length="1000" />
		
        <Column Name="toRecipients" DataType="DT_WSTR" Label="ToRecipients" Length="1190" />
        <Column Name="ccRecipients" DataType="DT_WSTR" Label="CcRecipients" Length="1190" />
        <Column Name="bccRecipients" DataType="DT_WSTR" Label="BccRecipients" Length="1190" />
		
		
		
        <Column Name="toRecipients.1.emailAddress.address" DataType="DT_WSTR" Label="ToRecipient1" Length="200" />
        <Column Name="toRecipients.2.emailAddress.address" DataType="DT_WSTR" Label="ToRecipient2" Length="200" />
        <Column Name="toRecipients.3.emailAddress.address" DataType="DT_WSTR" Label="ToRecipient3" Length="200" />
        <Column Name="toRecipients.4.emailAddress.address" DataType="DT_WSTR" Label="ToRecipient4" Length="200" />
        <Column Name="toRecipients.5.emailAddress.address" DataType="DT_WSTR" Label="ToRecipient5" Length="200" />
        <Column Name="ccRecipients.1.emailAddress.address" DataType="DT_WSTR" Label="CcRecipient1" Length="200" />
        <Column Name="ccRecipients.2.emailAddress.address" DataType="DT_WSTR" Label="CcRecipient2" Length="200" />
        <Column Name="ccRecipients.3.emailAddress.address" DataType="DT_WSTR" Label="CcRecipient3" Length="200" />
        <Column Name="ccRecipients.4.emailAddress.address" DataType="DT_WSTR" Label="CcRecipient4" Length="200" />
        <Column Name="ccRecipients.5.emailAddress.address" DataType="DT_WSTR" Label="CcRecipient5" Length="200" />
        <Column Name="bccRecipients.1.emailAddress.address" DataType="DT_WSTR" Label="BccRecipient1" Length="200" />
        <Column Name="bccRecipients.2.emailAddress.address" DataType="DT_WSTR" Label="BccRecipient2" Length="200" />
        <Column Name="bccRecipients.3.emailAddress.address" DataType="DT_WSTR" Label="BccRecipient3" Length="200" />
        <Column Name="bccRecipients.4.emailAddress.address" DataType="DT_WSTR" Label="BccRecipient4" Length="200" />
        <Column Name="bccRecipients.5.emailAddress.address" DataType="DT_WSTR" Label="BccRecipient5" Length="200" />
        <Column Name="categories" DataType="DT_WSTR" Label="Categories" Length="1000" />
        <Column Name="parentFolderId" DataType="DT_WSTR" Label="ParentFolderId" Length="1200" />
        <Column Name="conversationId" DataType="DT_WSTR" Label="ConversationId" Length="1200" />
        <Column Name="conversationIndex" DataType="DT_WSTR" Label="ConversationIndex" Length="1200" />
        <Column Name="isDeliveryReceiptRequested" DataType="DT_BOOL" Label="IsDeliveryReceiptRequested" />
        <Column Name="isReadReceiptRequested" DataType="DT_BOOL" Label="IsReadReceiptRequested" />
        <Column Name="isRead" DataType="DT_BOOL" Label="IsRead" />
        <Column Name="isDraft" DataType="DT_BOOL" Label="IsDraft" />
        <Column Name="webLink" DataType="DT_WSTR" Label="WebLink" Length="4000" />
        <Column Name="inferenceClassification" DataType="DT_WSTR" Label="InferenceClassification" Length="800" />
        <Column Name="internetMessageHeaders" DataType="DT_NTEXT" Label="InternetMessageHeaders" />
        <Column Name="body.contentType" DataType="DT_WSTR" Label="BodyContentType" Length="500" />
        <Column Name="body.content" DataType="DT_NTEXT" Label="BodyContent" />
        <Column Name="from.emailAddress.name" DataType="DT_WSTR" Label="FromEmailAddressName" Length="800" />
        <Column Name="from.emailAddress.address" DataType="DT_WSTR" Label="FromEmailAddress" Length="800" />
        <Column Name="replyTo" DataType="DT_WSTR" Label="ReplyTo" Length="1190" />
        <Column Name="uniqueBody.contentType" DataType="DT_WSTR" Label="UniqueBodyContentType" Length="500" />
        <Column Name="uniqueBody.content" DataType="DT_WSTR" Label="UniqueBodyContent" Length="4000" />
        <Column Name="flag.flagStatus" DataType="DT_WSTR" Label="FlagFlagStatus" Length="800" />
        <Column Name="@odata.etag" DataType="DT_WSTR" Label="ODataETag" Length="1000" />
		<Column Name="internetMessageId" DataType="DT_WSTR" Label="InternetMessageId" Length="1800" />		
      </OutputColumns>
    </EndPoint>

    <EndPoint Name="AttachmentOutputColumns">
      <OutputColumns>
        <Column Name="id" DataType="DT_WSTR" Label="Id" Length="1000" />
        <Column Name="name" DataType="DT_WSTR" Label="Name" Length="200" />
        <Column Name="contentType" DataType="DT_WSTR" Label="ContentType" Length="200" />
        <Column Name="isInline" DataType="DT_BOOL" Label="IsInline" />
        <Column Name="lastModifiedDateTime" DataType="DT_DBTIMESTAMP" Label="LastModifiedDateTime" />
        <Column Name="size" DataType="DT_I4" Label="Size" />
        <Column Name="contentId" DataType="DT_WSTR" Label="ContentId" Length="2000" />
        <Column Name="contentBytes" DataType="DT_NTEXT" Label="ContentBytes" />
        <Column Name="@odata.type" DataType="DT_WSTR" Label="ODataType" Length="200" />
        <Column Name="@odata.mediaContentType" DataType="DT_WSTR" Label="ODataMediaContentType" Length="200" />
      </OutputColumns>
    </EndPoint>

    <EndPoint Name="UserOutputColumns">
      <Params>
        <Param Name="SelectedColumns" Template="UserColumnsParam" />
      </Params>
      <OutputColumns>
        <Column Name="businessPhones" DataType="DT_WSTR" Label="BusinessPhones" Length="4000" />
        <Column Name="displayName" DataType="DT_WSTR" Label="DisplayName" Length="500" />
        <Column Name="givenName" DataType="DT_WSTR" Label="GivenName" Length="80" />
        <Column Name="jobTitle" DataType="DT_WSTR" Label="JobTitle" Length="200" />
        <Column Name="mail" DataType="DT_WSTR" Label="Mail" Length="200" />
        <Column Name="mobilePhone" DataType="DT_WSTR" Label="MobilePhone" Length="500" />
        <Column Name="officeLocation" DataType="DT_WSTR" Label="OfficeLocation" Length="500" />
        <Column Name="preferredLanguage" DataType="DT_WSTR" Label="PreferredLanguage" Length="100" />
        <Column Name="surname" DataType="DT_WSTR" Label="SurName" Length="80" />
        <Column Name="userPrincipalName" DataType="DT_WSTR" Label="UserPrincipalName" Length="200" />
        <Column Name="id" DataType="DT_WSTR" Label="Id" Length="4000" />
      </OutputColumns>
    </EndPoint>

    <EndPoint Name="MailFolderOutputColumns">
      <Params>
        <Param Name="SelectedColumns" Template="MailFolderColumnsParam" />
      </Params>
      <OutputColumns>
        <Column Name="id" DataType="DT_WSTR" Label="Id" Length="1200" />
        <Column Name="displayName" DataType="DT_WSTR" Label="DisplayName" Length="500" />
        <Column Name="parentFolderId" DataType="DT_WSTR" Label="ParentFolderId" Length="1200" />
        <Column Name="childFolderCount" DataType="DT_I4" Label="ChildFolderCount" />
        <Column Name="unreadItemCount" DataType="DT_I4" Label="UnreadItemCount" />
        <Column Name="totalItemCount" DataType="DT_I4" Label="TotalItemCount" />
        <Column Name="sizeInBytes" DataType="DT_I4" Label="SizeInBytes" />
        <Column Name="isHidden" DataType="DT_BOOL" Label="IsHidden" />
      </OutputColumns>
    </EndPoint>
    
    <EndPoint Name="PaginationParams">
      <Params>
        <Param Name="PageSize" Label="PageSize" Type="Query" Value="100" Desc="The number of records to show on each page of results." Hidden="True" />
        <Param Name="DataFormat" Type="Property" Value="OData" />
      </Params>
    </EndPoint>

  </Template>


  <EndPoints>


		
	<!-- GET Tables-->	
    <EndPoint Name="get_tables"
              Label="Get Tables"
              Url="/$metadata"
			  Filter="$.edmx:Edmx.edmx:DataServices.Schema[*].EntityType[*]"
              Method="GET"
			  Desc="Get table list and its properties for Graph API"
			  ResponseFormat="Xml" 
			  CachedTtl="600"
			  >
		<OutputColumns>
			<Column Name="@Name" DataType="DT_WSTR" Label="Name" Length="500"  /> 
			<Column Name="@BaseType" DataType="DT_WSTR" Label="BaseType" Length="500"  />			
		</OutputColumns>
    </EndPoint>
	
    <EndPoint Name="get_table_columns"
              Label="Get Table Columns"
              Url="/$metadata"
              Method="GET"
			  Desc="Get table list and its properties for Graph API"
			  Filter="$.edmx:Edmx.edmx:DataServices.Schema[*].EntityType[*].Property[*]"
			  IncludeParentColumns="True"
			  ResponseFormat="Xml" 
			  CachedTtl="600"
			  >			  
		<Params>
			<Param Name="Filter" Label="Table Name" Value="" DataEndPoint="get_tables" 
			  ValueTemplate="$.edmx:Edmx.edmx:DataServices.Schema[*].EntityType[?(@@Name=='{$value$}')].Property[*]"
			  OptionsEndPoint="get_tables"
              OptionsEndPointValueColumn="name"
              OptionsEndPointLabelColumn="name"
			  OptionSort="ASC"
			/>
		</Params>	  
		<OutputColumns>
			<Column Name="P_edmx:Edmx.edmx:DataServices.Schema_EntityType_@Name" Label="EntityName" DataType="DT_WSTR" Length="500" />
			<Column Name="P_edmx:Edmx.edmx:DataServices.Schema_EntityType_@BaseType" Label="BaseType" DataType="DT_WSTR" Length="500" />
			<Column Name="@Name" DataType="DT_WSTR" Label="Name" Length="500"  />
			<Column Name="@Type" DataType="DT_WSTR" Label="Type" Length="500"  />
			<Column Name="@Nullable" DataType="DT_BOOL" Label="Nullable"  />
		</OutputColumns>
    </EndPoint>	
	
    <!-- GET MY INFO ***-->
    <EndPoint Name="get_my_info"
              Label="Get My Information"
              Url="/me"
              Method="GET"
			  Desc="Get general information about the current user.">
      <OutputColumns>
        <Column Name="id" DataType="DT_WSTR" Label="Id" Length="500" />
        <Column Name="displayName" DataType="DT_WSTR" Label="DisplayName" Length="200" />
        <Column Name="givenName" DataType="DT_WSTR" Label="GivenName" Length="200" />
        <Column Name="surname" DataType="DT_WSTR" Label="SurName" Length="200" />
        <Column Name="jobTitle" DataType="DT_WSTR" Label="JobTitle" Length="200" />
        <Column Name="mail" DataType="DT_WSTR" Label="Mail" Length="200" />
        <Column Name="userPrincipalName" DataType="DT_WSTR" Label="UserPrincipalName" Length="200" />
        <Column Name="businessPhones" DataType="DT_WSTR" Label="BusinessPhones" Length="200" />
        <Column Name="mobilePhone" DataType="DT_WSTR" Label="MobilePhone" Length="200" />
        <Column Name="officeLocation" DataType="DT_WSTR" Label="OfficeLocation" Length="500" />
        <Column Name="preferredLanguage" DataType="DT_WSTR" Label="PreferredLanguage" Length="200" />
        <Column Name="@odata.context" DataType="DT_WSTR" Label="@OdataContext" Length="2000" />
      </OutputColumns>
    </EndPoint>


    <!-- GET MESSAGES **-->
    <EndPoint Name="get_messages"
              Label="Get Messages"
              Url="/[$UserId$]/[$MailFolderId$]messages"
              Method="GET"
              Filter="$.value[*]"
			  Desc="Get the mail messages for the specified user ID or email address."
              Template="SearchMessageParams,ODataGeneralOptions, MessageOutputColumns, PaginationParams"
              HelpLink="https://learn.microsoft.com/en-us/graph/api/user-list-messages?view=graph-rest-1.0">
      <Params>
        <Param Name="UserId" Template="UserIdParam"/>
      </Params>
    </EndPoint>


    <!-- SEND MAIL -->
    <EndPoint Name="send_mail"
              Label="Send Mail"
              Url="/[$UserId$]/sendMail"
              Method="POST"
              ContentType="application/json"
              JsonRowFormat="Multicontent"
              Desc="Sends an email message."
              HelpLink="https://learn.microsoft.com/en-us/graph/api/user-sendmail?view=graph-rest-1.0">
      <LayoutMap>
        <![CDATA[<?xml version="1.0" encoding="utf-8"?>
<settings ver="3" singledataset="True">
	<dataset id="root" main="True" readfrominput="True"></dataset>
	<map name="message">
		<map src="Subject" name="subject" />
		<map name="body">
			<map src="BodyContentType" name="contentType" />
			<map src="BodyContent" name="content" />
		</map>
		<map src="ToRecipients" name="toRecipients" fragment="True" />
		<map src="CcRecipients" name="ccRecipients" fragment="True" />
		<map src="BccRecipients" name="bccRecipients" fragment="True" />
		<map src="InternetMessageHeaders" name="internetMessageHeaders" fragment="True" />
		<map src="Attachments" name="attachments" fragment="True" />
		<map src="Importance" name="importance" />
		<map src="IsDeliveryReceiptRequested" name="isDeliveryReceiptRequested" />
		<map src="IsReadReceiptRequested" name="isReadReceiptRequested" />
	</map>
	<map src="SaveToSentItems" name="saveToSentItems" />
</settings>
				]]>
      </LayoutMap>
      <Body>
        <![CDATA[{$rows$}]]>
      </Body>
      <Params>
        <Param Name="UserId" Template="UserIdParam"/>
        <Param Name="DoNotOutputEmptyNestedProperty" Type="Property" Value="True" />
        <Param Name="DoNotOutputEmptyArrayProperty" Type="Property" Value="True" />
        <Param Name="RawOutputDataRowTemplate" Type="Property" Value="{}" ValueTemplate="{Response:'Message Sent'}" />
        <Param Name="EnableRawOutputModeSingleRow" Type="Property" Value="True" />
      </Params>
      <InputColumns>
        <Column Name="Subject" DataType="DT_WSTR" Length="250" />
        <Column Name="BodyContentType" DataType="DT_WSTR" Length="8" Options="html;text" Example="html or text" />
        <Column Name="BodyContent" DataType="DT_NTEXT" />
        <Column Name="ToRecipients" DataType="DT_WSTR" Length="4000" Raw="True" Example="[{ &quot;emailAddress&quot;: { &quot;address&quot;: &quot;john.doe@domain.com&quot; }}, { &quot;emailAddress&quot;: { &quot;address&quot;: &quot;jane.doe@domain.com&quot; }}]"/>
        <Column Name="CcRecipients" DataType="DT_WSTR" Length="4000" Raw="True" Example="[{ &quot;emailAddress&quot;: { &quot;address&quot;: &quot;john.doe@domain.com&quot; }}, { &quot;emailAddress&quot;: { &quot;address&quot;: &quot;jane.doe@domain.com&quot; }}]"/>
        <Column Name="BccRecipients" DataType="DT_WSTR" Length="4000" Raw="True" Example="[{ &quot;emailAddress&quot;: { &quot;address&quot;: &quot;john.doe@domain.com&quot; }}, { &quot;emailAddress&quot;: { &quot;address&quot;: &quot;jane.doe@domain.com&quot; }}]"/>
        <Column Name="InternetMessageHeaders" DataType="DT_WSTR" Length="4000" Raw="True" Example="[{ &quot;name&quot;: &quot;x-custom-header-group-name&quot;, &quot;value&quot;: &quot;Nevada&quot; }, { &quot;name&quot;: &quot;x-custom-header-group-id&quot;, &quot;value&quot;: &quot;NV001&quot; }]"/>
        <Column Name="Attachments" DataType="DT_NTEXT" Raw="True" Example="[{ &quot;@odata.type&quot;: &quot;#microsoft.graph.fileAttachment&quot;, &quot;name&quot;: &quot;attachment.txt&quot;, &quot;contentType&quot;: &quot;text/plain&quot;, &quot;contentBytes&quot;: &quot;SGVsbG8gV29ybGQh&quot; }]"/>
        <Column Name="Importance" DataType="DT_WSTR" Length="10" />        
        <Column Name="IsDeliveryReceiptRequested" DataType="DT_BOOL" />
        <Column Name="IsReadReceiptRequested" DataType="DT_BOOL" />
        <Column Name="SaveToSentItems" DataType="DT_BOOL" />
      </InputColumns>
      <OutputColumns>
        <Column Name="Id" DataType="DT_WSTR" />
        <Column Name="Response" DataType="DT_WSTR" Length="255" />
      </OutputColumns>
    </EndPoint>


    <!-- GET MY MAIL FOLDERS -->
    <EndPoint Name="get_my_mailfolders"
              Label="Get My Mail Folders [only works with User Credentials]"
              Url="/me/mailFolders"
              Method="GET"
              Filter="$.value[*]"
			        Desc="Get the list of mail folders for the current user."
              Template="ODataGeneralOptions, MailFolderOutputColumns, PaginationParams"
              HelpLink="https://learn.microsoft.com/en-us/graph/api/user-list-mailfolders?view=graph-rest-1.0">
    </EndPoint>

    <!-- the following format:
         https://graph.microsoft.com/v1.0/users/{some-use-id}/mailfolders/{some-folder-id}
         does not seem to be supported, only /me/mailfolders/{some-folder-id} Works. Revisit this when
	-->
		 
    <!-- GET MY MAIL FOLDER BY ID -->
    <EndPoint Name="get_my_mailfolder"
              Label="Get Mail Folder by Id [only works with User Credentials]"
              Url="/me/mailFolders/[$MailFolderId$]"
              Method="GET"
			        Desc="Get the mail folder specified by the mail folder Id."
              Template="MailFolderOutputColumns"
              HelpLink="https://learn.microsoft.com/en-us/graph/api/mailfolder-get?view=graph-rest-1.0">
      <Params>
        <Param Name="MailFolderId" ReadAs="Id" Label="Mail Folder Id" IsKey="True" Required="True" Type="Placeholder" Desc="The Microsoft Mail mail folder ID for the mail folder." />
      </Params>
    </EndPoint>


    <!-- GET USERS -->
    <EndPoint Name="get_users"
              Label="Get Users"
              Url="/users"
              Method="GET"
              Filter="$.value[*]"
			        Desc="Get the list of users."
              Template="ODataGeneralOptions, UserOutputColumns, PaginationParams"
              HelpLink="https://learn.microsoft.com/en-us/graph/api/user-list?view=graph-rest-1.0">
    </EndPoint>


    <!-- GET USER BY ID -->
    <EndPoint Name="get_user"
              Label="Get User by Id"
              Url="/[$UserId$]"
              Method="GET"
			  Desc="Get a specific user."
              Template="UserOutputColumns"
              HelpLink="https://learn.microsoft.com/en-us/graph/api/user-get?view=graph-rest-1.0">
      <Params>
        <Param Name="UserId" Template="UserIdParam" IsKey="True" ReadAs="Id" />
      </Params>
    </EndPoint>


    <!-- GET MAIL FOLDERS ***-->
    <EndPoint Name="get_mailfolders"
              Label="Get Mail Folders"
              Url="/[$UserId$]/mailFolders"
              Method="GET"
              Filter="$.value[*]"
			        Desc="Get the list of mail folders for the specified user Id."
              Template="ODataGeneralOptions, MailFolderOutputColumns, PaginationParams"
              HelpLink="https://learn.microsoft.com/en-us/graph/api/user-list-mailfolders?view=graph-rest-1.0">
      <Params>
        <Param Name="UserId" Template="UserIdParam"/>
      </Params>
    </EndPoint>


    <!-- GET MY MESSAGES ****-->
    <EndPoint Name="get_my_messages"
              Label="Get My Messages [only works with User Credentials]"
              Url="/me/[$MailFolderId$]messages"
              Method="GET"
              Filter="$.value[*]"
			  Desc="Get the mail messages for the current user."
              Template="SearchMessageParams,ODataGeneralOptions, MessageOutputColumns, PaginationParams"
              HelpLink="https://learn.microsoft.com/en-us/graph/api/user-list-messages?view=graph-rest-1.0">
      <Params>

      </Params>
    </EndPoint>

    
    <!-- GET MY MESSAGE BY ID ****-->
    <EndPoint Name="get_my_message"
              Label="Get My Message by Id [only works with User Credentials]"
              Url="/me/messages/[$MessageId$]"
              Method="GET"
			        Desc="Get the mail message by message Id for the specified user ID or email address."
              Template="MessageOutputColumns"
              Headers="Prefer: outlook.body-content-type=[$EmailBodyFormat$]"
              HelpLink="https://learn.microsoft.com/en-us/graph/api/message-get?view=graph-rest-1.0">
      <Params>
        <Param Name="MessageId" Label="Message Id" ReadAs="Id" IsKey="True" Required="True" Type="Placeholder" Desc="The Microsoft Mail message ID GUID for the message to read. (Example: 'c3220464-7209-453c-8840-3cf4de0afaa6')" />
        <Param Name="EmailBodyFormat" Label="Email Body Format" Type="Placeholder" Value="html" Required="True"
               Options="html;text" />
      </Params>
    </EndPoint>

    <!-- GET MESSAGE ATTACHMENT LIST **-->
    <EndPoint Name="get_message_attachments"
              Label="Get Message Attachments"
              Url="/[$UserId$]/messages/[$MessageId$]/attachments"
              Method="GET"
              Filter="$.value[*]"
			        Desc="Get the list of attachments linked to the specified message Id."
              Template="ODataGeneralOptions, AttachmentOutputColumns, PaginationParams"
              HelpLink="https://learn.microsoft.com/en-us/graph/api/message-list-attachments?view=graph-rest-1.0">
      <Params>
		<Param Name="UserId" Template="UserIdParam" />
        <Param Name="MessageId" ReadAs="Id" Label="Message ID" IsKey="True" Required="True" Type="Placeholder" Desc="The message Id for which to get attachments from." />
      </Params>
    </EndPoint>


    <!-- GET A SPECIFIC MESSAGE ATTACHMENT *-->
    <EndPoint Name="get_message_attachment"
              Label="Get Message Attachment"
			        Desc="Get a specific attachment linked to the specified message Id."
              Url="/[$UserId$]/messages/[$MessageId$]/attachments/[$AttachmentId$]"
              Method="GET"
              Template="AttachmentOutputColumns"
              HelpLink="https://learn.microsoft.com/en-us/graph/api/attachment-get?view=graph-rest-1.0">
      <Params>
	  	<Param Name="UserId" Template="UserIdParam" /> 
        <Param Name="MessageId" Label="Message ID" Required="True" Type="Placeholder" Desc="The message Id for which to get the attachment from." />
        <Param Name="AttachmentId" IsKey="True" Label="Attachment ID" Required="True" Type="Placeholder" Desc="The attachment Id for the attachment to get." />
      </Params>
    </EndPoint>


    <!-- DOWNLOAD A SPECIFIC MESSAGE ATTACHMENT *-->
    <EndPoint Name="download_message_attachment"
              Label="Download Message Attachment (Single File)"
			        Desc="Download a specific attachment linked to the specified message Id."
              Url="/[$UserId$]/messages/[$MessageId$]/attachments/[$AttachmentId$]/$value"
              Method="GET"
              HelpLink="https://learn.microsoft.com/en-us/graph/api/attachment-get?view=graph-rest-1.0">
      <Params>
		<Param Name="UserId" Template="UserIdParam" />
        <Param Name="MessageId" Label="Message ID" Required="True" Type="Placeholder" Desc="The message Id for which to get the attachment from." />
        <Param Name="AttachmentId" IsKey="True" Label="Attachment ID" Required="True" Type="Placeholder" Desc="The attachment Id for the attachment to get." />
        <Param Name="RequestTimeoutMs" Type="Property" Desc="Timeout in milliseconds after which download stops" Value="7200000" Required="True" Hidden="True" />
        <Param Name="FileOverwriteMode" Type="Property" Value="AlwaysOverwrite" Required="True" />
        <Param Name="TargetFilePath" Key="ResponseDataFile" Desc="Specify a disk file path to save file as" Type="Property" Required="True" Value="" Editor="FileSave" />
        <Param Name="SaveContentAsBinary" Type="Property" Value="True" Hidden="True" />
        <Param Name="RawOutputDataRowTemplate" Type="Property" Value="{Status:'Downloaded'}" />
        <Param Name="EnableRawOutputModeSingleRow" Type="Property" Value="True" />
      </Params>
      <OutputColumns>
		<Column Name="data" DataType="DT_NTEXT" Label="Data" />
		<Column Name="Status" DataType="DT_STR"  />
      </OutputColumns>
    </EndPoint>
	
		
    <EndPoint Name="download_message_attachments"
          Label="Download Message Attachments (Multiple Files) - Using Search Condition"
		  Url="/[$UserId$]/[$MailFolderId$]messages"
          Method="GET"
		  Editor="FolderOpen"
          Filter="$.value[*]"
          ContentType="application/json"
          Desc="Downloads multiple attachments for a specified search condition to select Mails"
          Template="SearchMessageParams,ODataGeneralOptions, PaginationParams"
          HelpLink="">
	  <Params>
		
		<Param Name="UserId" Template="UserIdParam" />		
		<Param Name="MailFolderId" Template="MailFolderIdParam"/>		  
		
		
		<Param Name="OverwriteFile" Value="True" Options=";True;False"/>		
		<Param Name="SaveFolder" Value="c:\temp" Desc="Specify a disk folder path to save file(s) to" Required="True" Editor="FolderOpen"/>		
	  </Params>
      <EndPoint Name="child_message_attachments"
				Url="/[$UserId$]/[$MailFolderId$]messages/[$parent.id$]/attachments"
                Method="GET"
				IncludeParentColumns="True"
				Filter="$.value"
				Desc="See contentBytes column - it invokes FUN_FILE_WRITE_BINARY_SAFE to save Base64 bytes to file."
				>		
		  <Params>
			 <Param Name="UserId" ValueTemplate="&lt;&lt;{$value$}|~|Eq|~|me|~|me|~|users/{$value$},FUN_IF&gt;&gt;"/>
			 <Param Name="MailFolderId"  ValueTemplate="mailfolders('{$value$}')/"/>			  
		  </Params>	
      </EndPoint>
	  
		<OutputColumns>
			<Column Name="id" Label="Id" DataType="DT_STR" Length="255" />
			<Column Name="p1_id" Label="MessageId" DataType="DT_STR" Length="255" />
			<Column Name="name" Label="Name" DataType="DT_WSTR" Length="500" />
			<Column Name="contentId" Label="ContentId" DataType="DT_STR" Length="255" />
			<Column Name="contentType" Label="ContentType" DataType="DT_STR" Length="255" />
			<Column Name="contentLocation" Label="ContentLocation" DataType="DT_STR" Length="1000" />
			<Column Name="isInline" Label="IsInLine" DataType="DT_BOOL"  />
			<Column Name="lastModifiedDateTime" Label="LastModifiedDateTime" DataType="DT_DBTIMESTAMP"  />
			
			<Column Name="size" Label="Size" DataType="DT_I4"  />

			<Column Name="name" Label="SavedPath" DataType="DT_WSTR" 
				ValueTemplate="[$SaveFolder$]\[$parent.contentId$]_{$value$}" />
				
			<Column Name="contentBytes" Label="SavedSize" DataType="DT_I8" 
				ValueTemplate="&lt;&lt;[$SaveFolder$]\[$parent.contentId$]_[$parent.name$]|~|{$value$}|~|[$OverwriteFile$],FUN_FILE_WRITE_BINARY_SAFE&gt;&gt;" />
		</OutputColumns>	  

    </EndPoint> 
	
	
  </EndPoints>


  <Tables>
    <Table Name="MyMessages"
           SelectEndPoint="get_my_messages"
           LookupEndPoint="get_my_message"
           InsertEndPoint="send_mail"
           />
    <Table Name="MyMailFolders"
           SelectEndPoint="get_my_mailfolders"
           LookupEndPoint="get_my_mailfolder"
           />
    <Table Name="Users"
           SelectEndPoint="get_users"
           LookupEndPoint="get_user"
           />		   
  </Tables>

  <Examples>
    
    <Example Default="True" Group="ODBC" Label="Get messages for the current user">
        <Code>
            <![CDATA[SELECT * FROM MyMessages]]>
        </Code>
    </Example>
    <Example Group="ODBC" Label="Get users">
        <Code>
            <![CDATA[select * from Users 
			--Where Id='049beb7f-03e0-4b0d-825d-73567b6786e9'	
			]]>
        </Code>
    </Example>


    <Example Group="ODBC" Label="Get a specific message from the current user's account by the message ID">
    <Code>
      <![CDATA[SELECT * FROM MyMessages
WHERE Id='AAXkADIwNzNhODMyLTZiMTQtNDhiMC02OWQzLTc5YTY5M2IyMjk0NABGAyAAAACbj2hVuNphT74wylrfU4ixBwAbUV6IxRnpQrqzrb2WfacdAAAAAAEMAAAbUV6IxRnpQrqzrb2WfacdAAAysBnxAAA=']]>
    </Code>
  </Example>
    
    <Example Group="ODBC" Label="Get messages for a specified user">
    <Code>
      <![CDATA[SELECT * FROM get_messages
WITH (UserID='firstname.lastname@domainname.com')]]>
    </Code>
  </Example>

    <Example Group="ODBC" Label="Get first 5 messages for a specified user">
      <Code>
        <![CDATA[SELECT * FROM get_messages
WITH (UserID='firstname.lastname@domainname.com', PageSize='5')]]>
      </Code>
    </Example>
	
    <Example Group="ODBC" Label="Get all messages in a specific Mail Folder">
      <Code>
        <![CDATA[SELECT * FROM get_messages
WITH (
MailFolderID='INBOX' --or use mai folder id
)]]>
      </Code>
    </Example>	

    <Example Group="ODBC" Label="Get messages with a subject line that starts with 'Announcements for'">
      <Code>
        <![CDATA[SELECT * FROM get_messages
WITH (UserID='firstname.lastname@domainname.com', SearchCriteria='startsWith(Subject,''Announcements for'')')]]>
      </Code>
    </Example>

    <Example Group="ODBC" Label="Get messages that have at least one attachment associated with them">
      <Code>
        <![CDATA[SELECT * FROM get_messages
WITH (UserID='firstname.lastname@domainname.com', SearchCriteria='hasAttachments eq true')]]>
      </Code>
    </Example>

    <Example Group="ODBC" Label="Get messages that are unread">
      <Code>
        <![CDATA[SELECT * FROM get_messages
WITH (UserID='firstname.lastname@domainname.com', SearchCriteria='IsRead eq false')]]>
      </Code>
    </Example>

    <Example Group="ODBC" Label="Get messages for the current user ordered by the time they were sent in ascending order">
      <Code>
        <![CDATA[SELECT * FROM MyMessages WITH (OrderBy='sentDateTime')]]>
      </Code>
    </Example>

    <Example Group="ODBC" Label="Get messages for the current user ordered by the time they were sent in descending order">
      <Code>
        <![CDATA[SELECT * FROM MyMessages WITH (OrderBy='sentDateTime desc')]]>
      </Code>
    </Example>

    <Example Group="ODBC" Label="Get messages for the current user ordered by the time they were received in ascending order">
      <Code>
        <![CDATA[SELECT * FROM MyMessages WITH (OrderBy='receivedDateTime')]]>
      </Code>
    </Example>

    <Example Group="ODBC" Label="Get messages for the current user ordered by the time they were received in descending order">
      <Code>
        <![CDATA[SELECT * FROM MyMessages WITH (OrderBy='receivedDateTime desc')]]>
      </Code>
    </Example>

    <Example Group="ODBC" Label="Get messages for the current user ordered by the name of the sender in ascending order">
      <Code>
        <![CDATA[SELECT * FROM MyMessages WITH (OrderBy='sender/emailAddress/name')]]>
      </Code>
    </Example>

    <Example Group="ODBC" Label="Get messages for the current user ordered by the name of the sender in descending order">
      <Code>
        <![CDATA[SELECT * FROM MyMessages WITH (OrderBy='sender/emailAddress/name desc')]]>
      </Code>
    </Example>

    <Example Group="ODBC" Label="Get all mail folders associated with the current user">
      <Code>
        <![CDATA[SELECT * FROM MyMailFolders]]>
      </Code>
    </Example>

    <Example Group="ODBC" Label="Get a specific mail folder associated with the current user by its mail folder ID">
      <Code>
        <![CDATA[SELECT * FROM MyMailFolders
WHERE (Id='AAMkADIwNzNhODMyLTZiMTQtNDhiMCz4OWQzLTc5YTY5M2IyMjk0NAYuAAAAAACbj2hVuNphT74wyYrfU4ixAQAbUV6IxRnpQrWzrb2WfacdAAAAAAEKAcA=')]]>
      </Code>
    </Example>

    <Example Group="ODBC" Label="Get all attachments linked to the specified message ID">
      <Code>
        <![CDATA[SELECT * FROM get_message_attachments
WITH (MessageId='AAXkADIwNzNhODMyLTZiMTQtNDhiMC02OWQzLTc5YTY5M2IyMjk0NABGAyAAAACbj2hVuNphT74wylrfU4ixBwAbUV6IxRnpQrqzrb2WfacdAAAAAAEMAAAbUV6IxRnpQrqzrb2WfacdAAAysBnxAAA=')]]>
      </Code>
    </Example>

    <Example Group="ODBC" Label="Get the specified attachment by message ID and attachment ID">
      <Code>
        <![CDATA[SELECT * FROM get_message_attachment
WITH (MessageId='AAXkADIwNzNhODMyLTZiMTQtNDhiMC02OWQzLTc5YTY5M2IyMjk0NABGAyAAAACbj2hVuNphT74wylrfU4ixBwAbUV6IxRnpQrqzrb2WfacdAAAAAAEMAAAbUV6IxRnpQrqzrb2WfacdAAAysBnxAAA=',
AttachmentId='AAMkADIwNzNhODMyLTZiMTQtNDhiM704OWQzLTc5YTY5M2IyMjk0NABGAAqAAACbj2hVuNphT74wylrfU4ixBwAbUV6IxRnpQrqzrb2WfacdAABBAAEMAAAbUV6IxRnpQrqzrb2WfacdAAAysB9xAAABEgAQAK6dg4NuEa5Fmn_5Tp_D_XM=')]]>
      </Code>
    </Example>

    <Example Group="ODBC" Label="Download the specified attachment by message ID and attachment ID and save it to a file">
      <Code>
        <![CDATA[SELECT * FROM download_message_attachment
WITH (MessageId='AAMkADIwNz2hODMyLTZiMTQtNDhiMC04OWQzLTc5YTY5M2IyMjk0NABGZAAAAxCbj2hVuNphT74wylrfU4ixBwAbUV6IxRnpQ6qzrb2WfacdAAAAAAEMAAAbUb6IxRnpQrqzrb2WfacdAAAysBnxAAA=',
AttachmentId='AAMkADIwNzNhODMyLTZiMTQtNDhiMC04cWQzLTc5YTY5M2IyMjk0NABGAAAAAACbj2hVuNphTZ4wylrfU4ixBwAbUV6IxRnpQrqzrb2WfacdAAAAAAEMAA8bUV6IxRnpQrqzrb2WfacdAAAysBnxAAABEgAQAK6dg4NuEa5Fmn_5Tp_D_XM=',
TargetFilePath='C:\temp\photo.png'
)]]>
      </Code>
    </Example>

    <Example Group="ODBC" Label="Download multiple attchments with search condition" Desc="This example shows how to download Office 365 Email attachments with search criteria. In this example we used multiple conditions to search. For example search mail with attachments only, sent after 2023-03-01, subject contains string 'invoice' and email sent from microsoft-noreply@microsoft.com">
      <Code>
        <![CDATA[
SELECT *  FROM download_message_attachments
WITH(
	  SaveFolder='c:\download',	
	  OverwriteFile='True',
 	  MailFolderId='INBOX', --or use mailbox ID
	  UserId='me', --or use "user-id" or use "email"
	  --search mail with attachments, sent after 2023-03-01, subject contains string "invoice" and  from email is microsoft-noreply@microsoft.com
	  SearchCriteria='hasAttachments eq true and sentDateTime gt 2023-03-01 and contains(subject, ''invoice'') and from/emailAddress/address eq ''microsoft-noreply@microsoft.com''  ',
	  EmailBodyFormat='HTML' --or text
)
		]]>
      </Code>
    </Example>
	
    <Example Group="ODBC" Label="Send a simple email message (with headers, HTML body, recipients, attachments and more)" Desc="This example shows how to send email using Office 365 API. It shows how to attach local file(s) as attachments. To send email as Text format use Text rather than HTML in BodyContentType value.">
      <Code>
        <![CDATA[INSERT INTO MyMessages
(Subject, BodyContentType, BodyContent
, ToRecipients, CcRecipients, BccRecipients
, InternetMessageHeaders
, Attachments, Importance, IsDeliveryReceiptRequested, IsReadReceiptRequested
, SaveToSentItems)
VALUES
('Employee Reviews Scheduled', 'HTML', '<b>Hi All,</b> employee reviews have been scheduled. <span style="text-decoration: underline;">Please reflect this in your notes.</span>',
 '[{ "emailAddress": { "address": "john.doe@domain.com" }}, { "emailAddress": { "address": "jane.doe@domain.com" }}]',
 '[{ "emailAddress": { "address": "mary.dawson@domain.com" }}]',
 '[{ "emailAddress": { "address": "ryan.connor@domain.com" }}]',
 '[{ "name": "x-custom-header-group-name", "value": "Managers" }, { "name": "x-custom-header-group-id", "value":"MGR001" }]',
 '[
      {
        "@odata.type": "#microsoft.graph.fileAttachment",
        "name": "file1.txt",
        "contentType": "text/plain",
        "contentBytes": "<<c:\file1.txt,FUN_FILE_BASE64ENC>>"
      },
      {
        "@odata.type": "#microsoft.graph.fileAttachment",
        "name": "profile-picture.png",
        "contentType": "image/png",
        "contentBytes": "<<c:\profile-picture.png,FUN_FILE_BASE64ENC>>"
      }	  
  ]', 
 'normal', 'false', 'false', 'true')]]>
      </Code>
    </Example>

    <Example Group="ODBC" Label="Call generic API request" Desc="This example shows how ot call any Office 365 / Outlook API using generic_request endpoint. This is useful when some endpoints not defined in the connector but you like to call that API.">
      <Code>
        <![CDATA[  SELECT * FROM generic_request
  WITH (
  URL='/users/049beb7f-03e0-4b0d-825d-73567b6786e9'
  , RequestMethod='GET'
  , Filter='$' --optional if you like to read from array inside document
  --Try commenting below line or define static metadata (speed up API calls by not requesting columns)
  , Meta='businessPhones:String(220); displayName:String(230); givenName:String(100); jobTitle:String(255); mail:String(310); mobilePhone:String(255); officeLocation:String(255); preferredLanguage:String(255); surname:String(140); userPrincipalName:String(500); id:String(360); '
  )]]>
      </Code>
    </Example>

		

  </Examples>

</ApiConfig>