Power Automate: Add attachment to e-mail dynamically

Adding attachments to an email looks relatively straightforward, but if you want to do it dynamically, it can be tricky to understand how to do it. It’s a question that I see all the time showing up in the Power Automate’s Community and want to address here in some detail so that you can understand how it works.

The issue

The main issue here is that you don’t know beforehand how many attachments you may have and, therefore, you need to, dynamically, fill in the attachments. You cannot map them to the “Send Email.”

Entering the advanced mode

To achieve this, you need to tap and go into the advanced mode. It can look intimidating since it becomes a text box, so we need to know what we’re doing.

The syntax is straightforward, but when you don’t know how to build something, I recommend filling-in the primary mode with some data and switch to the advanced mode, and you’ll see the structure needed. Something like this:

The syntax

It may look strange to you, but if you’re familiar with JSON, this will make sense.

[
  {
    "Name": "File1",
    "ContentBytes": @{outputs('Get_file_content_using_path')?['body']}
  },
  {
    "Name": "File2",
    "ContentBytes": @{outputs('Get_file_content_using_path')?['body']}
  }
]

Let’s break it down.

1. The “[“ and the “]” indicate that you’re defining an array.
2. The “{” and “}” indicate a key: value object. 
3. The key and object say to SharePoint that you have a field that contains the “Name” of the file and another with the ”ContentBytes” or the actual file.
4. Separate each object by , to indicate that they are multiple rows in the array.

Sounds ok? So what happens if you want to add the 3rd value. Easy, just add another key/object like this:

[
  {
    "Name": "File1",
    "ContentBytes": @{outputs('Get_file_content_using_path')?['body']}
  },
  {
    "Name": "File2",
    "ContentBytes": @{outputs('Get_file_content_using_path')?['body']}
  },
  {
    "Name": "File3",
    "ContentBytes": @{outputs('Get_file_content_using_path')?['body']}
  }
]

How to generate manually

Let’s say that you query a folder in your OneDrive and want to send all files to a colleague by email. Here’s what you can do.

  1. Define a variable
  2. Fetch the files in the folder
  3. Append the syntax to the variable
  4. Use the contents of the variable in the advanced mode.

Here’s what it looks like:

The only thing we’re missing is building the email itself. Here’s how to do it. You’ll need to transform the values inside the array into comma-separated values. To do that, you can use the join function.

join(variables('FILES_TO_SEND'),',')

The function will get all values from the array and separate them by “,” to have the structure that we defined above.

Then you can send the email:

Final thoughts

It looks complicated, but once you start to understand how things work and all boils down to JSON formatted strings in the background, it becomes simpler to build these advanced cases.

 

Have a suggestion of your own, or disagree with something I said? Leave a comment or interact on Twitter and be sure to check out other Power Automate-related articles here.

 

Photo by Thanhy Nguyen on Unsplash

Manuel Gomes

I'm a Project Manager with experience in large projects and companies. I've worked in the past for companies like Bayer, Sybase (now SAP) and I'm currently working for Pestana Hotel Group.

View all posts by Manuel Gomes →

Leave a Reply

%d bloggers like this: