Create a Draft Reply Email with AI Builder and Graph API in Power Automate
Mark Nanneman
Microsoft Power Platform | Copilot | Power Automate | Dataverse | PL-200
6 minutes
The Challenge
Automating responses to emails is straightforward enough in Power Automate Cloud Flows.
Still, sometimes you (or your client or your employer) wants a draft email automatically created that they can review, edit and send from their Outlook.
I’ve had clients request this and I have seen it reported by others on forums that their employers have also asked for it.
With the OOTB actions in Power Automate, we could send an “Start and wait for an approval of text” Approval before the flow sends the email that allows editing of the response text. We could also send a link to a simple Canvas App with the draft email body for review and editing before the user clicks a send button.
Still, the user experience is not the same (or as straightforward) in either of these solutions. Everyone already knows how to view and edit their draft emails in Outlook, why not just stick with that?
The Solution
Use Microsoft Graph APIs with Invoke an HTTP Request
Fortunately, Microsoft Graph REST API has many endpoints for Outlook activities, including creating drafts and replies. We can “Create draft message” and we can even “Create draft to reply”.
POST /users/{id | userPrincipalName}/messages/{id}/createReply
Example Flow
Create an “HTTP with Microsoft Entra ID (preauthorized)” Connection Reference for Microsoft Graph API
It’s best to create a connection reference in a solution. You can of course directly create a connection in your Power Automate Flow designer, but if you’re using more than one connection for the “Invoke an HTTP request with Entra ID” action it’s best to use connection references.
Name Connection Reference
Give the connection reference a good name so it’s easy to pick the right one.
Add a new connection to your connection reference
Click “New Connection”
Select “HTTP with Microsoft Entra ID (preauthorized)
Add the base URL of Microsoft Graph and login to create the connection
Create a Simple Triggered by the Arrival of a New Email
Here my trigger is “When a new email arrives (V3)”.
Create a “Trigger Condition” so that the flow is only triggered by certain emails
You probably don’t want to create draft email responses to every email, especially if you’re using AI Builder credits in the flow. Here for my testing purposes, I have my trigger set up to run on any email from gmail.
I like to use a temporary filter array to help build my trigger conditions. Just drop in references to the relevant trigger properties and build your logic.
When done, click “Code view” and copy the expression code from the “where” property.
Paste the expression in a “trigger condition” on your trigger’s settings.
Delete the temporary filter array.
Save the email address for the reply sender in a compose
This isn’t necessary, but I’m doing it for demonstration purposes.
Here, I’m saving the email address for the user (sender) that will own the draft response. In my case, it’s just my email address. You could source the email address or User ID in a number of different ways, or use the “/me/” Graph Endpoint for your own email account.
Create text with GPT using a prompt with AI Builder
Here I’m using a prompt to read the email subject and body and draft a quick one line response. This is really helpful for loquacious types such as myself, quick responses to longer emails are difficult!
Prompt
Send the triggering email’s subject and message body to the GPT action
领英推荐
Build the payload for your Graph API HTTP request
Here I’m constructing the HTTP Request payload in a compose.
Here is the format for a simple draft email response to the sender of the email. The text output from the AI Builder GPT action above goes in the “message/body/content” property.
{
"message": {
"toRecipients": [
{
"emailAddress": {
"address": @{triggerOutputs()?['body/from']}
}
}
],
"body": {
"contentType": "HTML",
"content": "@{outputs('Create_text_with_GPT_using_a_prompt')?['body/responsev2/predictionOutput/text']}"
}
}
}
Invoke an HTTP request to the Graph API
Finally, we just need to add a preauthorized Entra ID “Invoke an HTTP request” action.
Set it up as a POST method and construct the relative url of the request.
/v1.0/users/@{outputs('Compose_-_Replying_User_Email')}/messages/@{triggerOutputs()?['body/id']}/createReply
The key points for the end point are first, the User Id or email address of the user who will be sending the draft reply (you) and the message id of the email that is being replied to (the “id” property from the trigger).
Finally, just drop in the payload constructed above in the compose action.
Send A Mobile Notification with Link to Draft Email (Optional)
We can also send ourselves a notification on our mobile (assuming we have the Power Automate App installed) with a link to the draft email.
Add a “Send me a mobile notification” action
Send Link to Draft Email
To send a link to the draft email, reference the “webLink” property of the Graph API call response above.
Test flow by sending a long, rambling, unprofessional email from a Gmail account
Use Chat GPT to create an example of a Bad Email
For fun I’m going to test this flow by sending a long, rambling, unprofessional email message to my outlook address from my gmail address. I will use Chat GPT to create the message.
Send the Email from Gmail to Test Flow
I copied the message Chat GPT created for me and sent it to my Outlook address from my Gmail account.
The flow runs and creates a short draft response.
Notification on Mobile
Notification pops up on mobile device.
Open notification and click on the link to the draft email.
Review draft email reply in Outlook (OWA)
Thanks for reading!
If you found this post helpful please give it a like.