MS Outlook – Messages – Create Message

Estimated reading: 8 minutes

MS Outlook – Messages – Create Message

Create an Outlook draft message. Uses the selected mailbox and returns the available result.

Creates a draft; it does not send mail. Retain the returned ID, add attachments if needed, then use MS Outlook – Messages – Send Message. Leave Is Draft unset or set it to true; setting it to false is not a send operation. The action requests Prefer: IdType="ImmutableId" for the creation response.

Action details

PropertyValue
Action labelMS Outlook – Messages – Create Message
CategoryCloudTools
Apex class and methodCreateMSOutlookMessage.createMessage
Input typeCreateMSOutlookMessage.CreateMSOutlookMessageInput
Output typeList<MSOutlookMessage>
AuthorizationOAuth Delegated (Authorization Code) or OAuth Application (Client Credentials).
Flow automationUse an application connector configured as the Flow default.
Microsoft Graph operationPOST /v1.0/me/messages for Authorization Code Flow; otherwise POST /v1.0/users/{userIdOrPrincipalName}/messages.

Prerequisites and permissions

Configure a CloudTools Connector with Connector Type set to Microsoft 365. Complete Microsoft sign-in for delegated access. For application access, grant application permissions and administrator consent, supply the target mailbox user ID or principal name, and ensure the app can access that mailbox.

Microsoft requires Mail.ReadWrite for delegated and application access. See the Microsoft operation and permissions reference.

Mailbox selection: Authorization Code Flow uses /me and ignores userIdOrPrincipalName. Supplying another user does not redirect that call. Other authorization types use /users/{userIdOrPrincipalName}; their authentication must be valid for Microsoft Graph. Use Graph resource IDs rather than Salesforce record IDs.

Inputs

The table lists action labels, Apex field names, and data types. Provide one non-null request per invocation. Required text must not be blank.

InputApex fieldTypeRequiredDescription
User Id or Principal NameuserIdOrPrincipalNameStringUnless Authorization Code Flow is enabledUser id or user principal name. Required for application authorization; ignored for Authorization Code Flow.
SubjectsubjectStringNoMessage subject.
Body ContentbodyContentStringNoMessage body content.
Body Content TypebodyContentTypeStringNoMessage body content type (Text/HTML). Defaults to Text when body content is supplied and this value is blank. A blank bodyContent omits the body entirely.
To Recipients CSVtoRecipientsCsvStringNoComma-separated to recipient addresses. Separate plain email addresses with commas. CloudTools trims whitespace and skips empty entries; it does not parse display-name address syntax.
Cc Recipients CSVccRecipientsCsvStringNoComma-separated cc recipient addresses. Separate plain email addresses with commas. CloudTools trims whitespace and skips empty entries; it does not parse display-name address syntax.
Bcc Recipients CSVbccRecipientsCsvStringNoComma-separated bcc recipient addresses. Separate plain email addresses with commas. CloudTools trims whitespace and skips empty entries; it does not parse display-name address syntax.
ImportanceimportanceStringNoMessage importance (low/normal/high).
Is DraftisDraftBooleanNoWhether this message is draft.

The invocable input has no connectorId field. Apex and Flow use CloudTools connector selection; the LWC controller accepts an additional connectorId property to select a record. This action does not resolve replacement tokens in its inputs; resolve dynamic values first. See Using Token Replacements.

Outputs

Returns a list containing one MSOutlookMessage, or an empty list if no response is mapped. Check the returned ID before subsequent operations.

OutputApex fieldTypeDescription
IdidStringMessage identifier.
SubjectsubjectStringMessage subject.
Body PreviewbodyPreviewStringMessage body preview.
BodybodyMSOutlookMessageItemBodyMessage body.
FromfromRecipientMSOutlookMessageRecipientFrom recipient.
SendersenderRecipientMSOutlookMessageRecipientSender recipient.
To RecipientstoRecipientsList<MSOutlookMessageRecipient>Recipient collection.
Cc RecipientsccRecipientsList<MSOutlookMessageRecipient>CC recipient collection.
Bcc RecipientsbccRecipientsList<MSOutlookMessageRecipient>BCC recipient collection.
Reply ToreplyToList<MSOutlookMessageRecipient>Reply-to recipient collection.
From AddressfromAddressStringFrom email address.
Sender AddresssenderAddressStringSender email address.
To RecipientstoRecipientsCsvStringComma-separated recipients.
Cc RecipientsccRecipientsCsvStringComma-separated CC recipients.
Bcc RecipientsbccRecipientsCsvStringComma-separated BCC recipients.
Received Date TimereceivedDateTimeStringReceived timestamp.
Sent Date TimesentDateTimeStringSent timestamp.
Created Date TimecreatedDateTimeStringCreated timestamp.
Last Modified Date TimelastModifiedDateTimeStringLast modified timestamp.
Parent Folder IdparentFolderIdStringParent folder identifier.
Internet Message IdinternetMessageIdStringInternet message identifier.
Web LinkwebLinkStringOutlook web link.
Is DraftisDraftBooleanWhether message is draft.
Has AttachmentshasAttachmentsBooleanWhether message has attachments.
ImportanceimportanceStringMessage importance.
Conversation IdconversationIdStringConversation identifier.
Conversation IndexconversationIndexStringConversation index.
Follow Up FlagfollowUpFlagMSOutlookMessageFollowupFlagFollow-up metadata.
AttachmentsattachmentsList<DynamicObject>Message attachments.
ExtensionsextensionsList<DynamicObject>Message extensions.
OData TypeodataTypeStringOData type.
OData ETagodataEtagStringOData etag.
Additional PropertiesadditionalPropertiesList<DynamicObject>Additional data returned by query.

Optional properties depend on the response and any Select or Expand query. Do not treat an absent field as proof of its value. Timestamps represented by String remain text. Nested body and recipient properties follow the Apex message model; content, recipient collections, and attachment expansion are not guaranteed.

In the Apex model, Body exposes content and contentType. Each recipient exposes emailAddress.address and emailAddress.name. Follow Up Flag exposes flagStatus, startDateTime, dueDateTime, and completedDateTime; each date object has dateTime and timeZone. Availability depends on response mapping. Use the top-level id for Graph message operations, rather than internetMessageId or conversationId.

Use in Flow

Add MS Outlook – Messages – Create Message in Flow Builder. Configure a Microsoft 365 application connector as the default for Flow automations, then populate the inputs above. Delegated connectors are not supported for CloudTools Flow automation. Add a fault path for callout errors. This implementation processes only the first input request; it is not a bulk action.

Use in custom Apex

This subscriber-org example uses the Apptigent namespace. Replace placeholders before use. Run in a context that permits callouts with a configured application connector. For an already-authorized delegated connector, omit the user value.

Apptigent.CreateMSOutlookMessage.CreateMSOutlookMessageInput request =
    new Apptigent.CreateMSOutlookMessage.CreateMSOutlookMessageInput();
request.userIdOrPrincipalName = 'REPLACE_WITH_MICROSOFT_USER_ID_OR_UPN';
request.subject = 'Project update';
request.bodyContent = 'Here is the project update.';
request.bodyContentType = 'Text';
request.toRecipientsCsv = 'recipient@example.com';
request.isDraft = true;

List<Apptigent.MSOutlookMessage> results =
    Apptigent.CreateMSOutlookMessage.createMessage(
        new List<Apptigent.CreateMSOutlookMessage.CreateMSOutlookMessageInput>{ request }
    );

Apptigent.MSOutlookMessage item = results.isEmpty() ? null : results[0];
String resultId = item == null ? null : item.id;
System.debug(resultId);

Submit one request per invocation. The example does not implement connector setup, delegated sign-in, or exception handling; those belong in the calling application.

Use in a Lightning Web Component

Use createMSOutlookMessage from msOutlookConnectorLib, through MSOutlookConnectorController. This example uses repository c/ imports for a component in the same namespace. Replace placeholders and complete connector authorization before invoking it.

outlookActionExample.js

import { LightningElement } from 'lwc';
import { createMSOutlookMessage, MSOutlookObjects } from 'c/msOutlookConnectorLib';

export default class OutlookActionExample extends LightningElement {
    connectorId = 'REPLACE_WITH_CONNECTOR_RECORD_ID';
    result = null;
    errorMessage = '';
    isRunning = false;
    completed = false;

    async handleRun() {
        if (this.isRunning || this.completed) {
            return;
        }
        this.isRunning = true;
        this.errorMessage = '';
        try {
            const request = MSOutlookObjects.inputs.message();
            request.connectorId = this.connectorId;
            request.userIdOrPrincipalName = 'REPLACE_WITH_MICROSOFT_USER_ID_OR_UPN';
            request.subject = 'Project update';
            request.bodyContent = 'Here is the project update.';
            request.bodyContentType = 'Text';
            request.toRecipientsCsv = 'recipient@example.com';
            request.isDraft = true;
            const result = await createMSOutlookMessage(request);
            if (!result?.id) {
                throw new Error('No resource ID was returned.');
            }
            this.result = result;
            this.completed = true;
        } catch (error) {
            this.errorMessage = error.requiresInteractiveAuthorization
                ? 'Sign in to Microsoft for this connector, then try again.'
                : error.message || 'The Outlook action failed.';
        } finally {
            this.isRunning = false;
        }
    }
}

outlookActionExample.html

<template>
    <lightning-button label="Run action" onclick={handleRun}
        disabled={isRunning}></lightning-button>
    <p role="alert">{errorMessage}</p>
</template>

The library accepts one request object and resolves to one resource object, or null when no response is mapped; read result.id directly. The shared factory includes inputs for other actions; only the fields in this page and optional connectorId are used here.

The LWC controller flattens body into bodyContent and bodyContentType, recipients into address and CSV fields including replyToRecipientsCsv, and follow-up metadata into flag status and date fields. Use the JavaScript response shape rather than assuming the nested Apex fields are present. The response also exposes rawJson, which is not an invocable Flow output and may be a serialization of the mapped model.

This example reports authorization errors but does not implement sign-in. For delegated access, use getMSOutlookAuthorizationState, beginMSOutlookAuthorization, and createMSOutlookOAuthMessageHandler. Errors expose message and requiresInteractiveAuthorization.

The example prevents another invocation after success. Reset completed only when deliberately starting a new operation. If an error leaves the outcome uncertain, verify mailbox state before retrying; repeating the action can create duplicate mail, attachments, or folders, or act on an item that has already moved or been deleted.

Error handling and troubleshooting

SymptomWhat to check
Required fields errorPass a nonempty list with a non-null first request. Populate required resource fields and User Id or Principal Name for application authorization.
Authorization is requiredComplete or renew the current user’s delegated Microsoft authorization for the selected connector.
Access deniedCheck the operation permission, consent, connector identity, and mailbox access.
Resource not foundVerify IDs belong to the selected mailbox and refer to the expected resource. Authorization Code Flow ignores the user input.
Operation rejectedReview the Microsoft error and confirm the resource supports this operation.
Unexpected resultCheck for an empty Apex result, a null JavaScript response, omitted properties, or incomplete pagination. Handle exceptions in the caller.
Share this Doc

MS Outlook – Messages – Create Message

Or copy link

CONTENTS

Free eBook: The Ultimate Guide to Power Platform Custom Connectors

Antimanual

Ask our AI support assistant your questions about our platform, features, and services.

You are offline
Chatbot avatar
What can I help you with?

Subscribe

×
Cancel