An API that connects multiple Microsoft services, enabling data access and automation across platforms
Create the baseline reply with JSON createReply, omit from, sender, and replyTo, inspect the resulting draft, and send that same draft; this is the cleanest supported test of Graph’s authenticated-mailbox identity and native threading behavior.
Recommended controlled comparison
Your proposed A is the right baseline:
POST https://graph.microsoft.com/v1.0/me/messages/{anchor-id}/createReply
Authorization: Bearer {token}
Content-Type: application/json
client-request-id: {new-guid}
{
"comment": "Controlled Graph reply test A"
}
createReply supports personal Microsoft accounts with delegated Mail.ReadWrite, creates a native reply draft, and permits later draft updates. Specify either comment or message.body, not both.^1^
Then:
- Record the returned draft ID and response headers.
- Read the draft as JSON, retaining at least:
-
id,isDraft,changeKey -
from,sender,replyTo,toRecipients -
internetMessageId -
conversationId,conversationIndex
-
- Retrieve its MIME representation before sending:
Graph documentsGET https://graph.microsoft.com/v1.0/me/messages/{draft-id}/$value$valueas the supported way to retrieve a message’s MIME representation.^2^ - Send that exact draft:
Sending an existing reply draft is supported and saves the message in Sent Items.^3^POST https://graph.microsoft.com/v1.0/me/messages/{draft-id}/send - Locate the Sent Items copy by
internetMessageId, because a draft’s Graph item ID is not guaranteed to remain stable when it is sent.^4^ - Capture the sent-item JSON/MIME and recipient-side original source, then compare the same RFC Message-ID.
Testing an explicit Reply-To
Your proposed B is also supported at the Graph property level. The native replyTo property is explicitly updatable while isDraft=true; the operation requires delegated Mail.ReadWrite, which you already have.^5^
PATCH https://graph.microsoft.com/v1.0/me/messages/{draft-id}
Authorization: Bearer {token}
Content-Type: application/json
{
"replyTo": [{
"emailAddress": {
"address": "[Email]"
}
}]
}
Read back both JSON and $value before sending. This tests the documented native property, not X-Reply-To.
The available documentation does not establish an Outlook.com-specific guarantee that a patched or MIME-supplied Reply-To will be delivered unchanged, nor does it document special createReply rules for generated [Email] identities. Therefore:
- Treat A as the supported identity baseline.
- Treat B as a supported draft-property request whose end-to-end Outlook.com behavior must be demonstrated.
- Do not present the generated identity as an alias-configuration problem: your primary address is already Microsoft-hosted and confirmed, unlike the third-party-sign-in scenarios described in the alias Q&A reports.
Sender and From
Omit explicit sender in this self-mailbox flow. Graph describes sender as the account actually generating the message and documents updating it for shared-mailbox or delegate sending; its value must correspond to the mailbox actually used.^5^
For sending from another user, Microsoft also says the application does not need to set sender; Graph sets it according to mailbox permissions.^6^ Although that page concerns delegation, it reinforces that manually setting sender is unnecessary. In your nondelegated /me test, omit both sender and from so they cannot confound the result.
Verifying threading before submission
A draft created through createReply is itself the supported threading operation. Preserve and compare:
- Anchor
conversationIdand reply-draftconversationId - Draft
conversationIndex - Recipient-side
In-Reply-ToandReferencesafter delivery - Subject and actual reply recipients
Do not treat absent pre-send MIME In-Reply-To or References as proof that threading was lost. The documentation does not promise those transport headers will be materialized in a draft before submission. There is no documented supported PATCH procedure for synthesizing them on a Graph-created native reply.
Escalation evidence
For every Graph operation, generate and log a unique client-request-id, plus the response request-id and Date; Microsoft identifies these as necessary correlation data for support investigation.^7^
Provide Microsoft Support with one compact A/B package containing:
- UTC timestamp for every request
- Redacted request URL, headers, and exact body
- HTTP status and correlation headers
- Anchor JSON and MIME
- Draft JSON and MIME before and after PATCH
- Sent-item JSON and MIME
- Recipient’s unmodified original source
- Matching RFC Message-ID
- Gmail’s selected reply destination
- Whether the mismatch first appears at draft, Sent Items, or recipient delivery
The 2024 SDK issue was labeled a service issue and later closed after reporters confirmed resolution; it does not establish recurrence or personal Outlook.com applicability.^8^ Your historical normal02 is valuable evidence of a stored-versus-delivered mismatch, but normal03 cannot isolate service processing without the retained request and same-draft capture.
References