# Custom SMTP

To use OAuth2.0 authentication to access the SMTP server using the Microsoft Graph API, the Ultimo application must be registered with Microsoft Entra ID and granted specific permissions.

**Applicable Ultimo version**: Rolling Release (Azure cloud)

### Implementation steps <a href="#implementation-steps" id="implementation-steps"></a>

#### 1. Register application with Microsoft Entra ID <a href="#id-1.-register-application-with-azure-active-directory" id="id-1.-register-application-with-azure-active-directory"></a>

1. Go to the [Azure portal](https://portal.azure.com/) and sign in. This account must be in the same directory as the account that will be used to access Exchange Online.
2. Select **Microsoft Entra ID** and then select **Manage** > **App Registrations** in the left side menu.
3. Click on **New Registration** and use the following values:
   1. Enter a **Name** for the application
   2. For **Supported account types** choose **Accounts in this organizational directory only**
   3. For **Redirect URI** choose **Web** and enter the following value based on your situation (note: the URI is case sensitive):

      `{UltimoEnvironment}/OAuth2Callback` where `{UltimoEnvironment}` is the domain where Ultimo is hosted.\
      Example: `https://customer.ultimo.net/OAuth2Callback`
4. Click **Register**. Then copy the value of the **Application (client) ID** and the **Directory (tenant) ID** and save it. This will be needed later.
5. Select **Certificates & secrets** in the left side menu and click **New client secret**. Enter a description and click **Add**.
6. Copy the value of the added client secret and save it.
7. Select **API permissions** in the left menu and select **Add permission**.
   1. select **Microsoft Graph**.&#x20;
   2. Select **Delegated permissions** and then choose **SMTP.Send** under **SMTP**.
   3. Select **Add permissions**.

#### 2. Create credential in Ultimo <a href="#id-2.-create-credential-in-ultimo" id="id-2.-create-credential-in-ultimo"></a>

The application that was registered in the previous steps can be used to create a credential in Ultimo.

1. Go to the UCTool and select **Credentials** under **Authorisation**.
2. Click on the plus icon to create a new credential and use the following values:
   1. Enter an **Id** and **Description** for the credential
   2. For **Grant type** choose **Authorization Code**
   3. For **Authorization URL** enter\
      `https://login.microsoftonline.com/{tenant-id}/oauth2/v2.0/authorize?prompt=select_account`\
      where `{tenant-id}` should be replaced with the **Directory (tenant) ID** that was copied in the previous steps
   4. For **Access token URL** enter\
      `https://login.microsoftonline.com/{tenant-id}/oauth2/v2.0/token`\
      where `{tenant-id}` should be replaced with the **Directory (tenant) ID** that was copied in the previous steps
   5. For **Client Id** enter the value of the **Application (client) ID** that was copied in the previous steps
   6. For **Client secret** enter the value of the added client secret that was copied in the previous steps
   7. For **Scope** enter the following value:

      `https://outlook.office.com/SMTP.Send offline_access`
3. Click on the save icon.
4. Click on the key icon in the toolbar to get an access token.
5. You will be redirected to the Microsoft login screen. Sign in with the account that will be used to authenticate with Exchange Online.
6. You will be redirected back to Ultimo.


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://developer.ultimo.net/connectors/exchange-online/custom-smtp.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
