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.

Template:
If you want to see an example, I have a template in my cookbook section that you can import and adapt to your needs. 

The issue

The main issue here is that you don’t know beforehand how many attachments you may have, and, therefore, you need to fill in the attachments dynamically. 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, 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']}
  }
]

The template

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:

Correction:
Previously, I converted it to a JSON format before adding it to the “Attachments” part of the action, but it’s unnecessary. You can add the array, and the Flow will convert and send the files correctly.

The only thing we’re missing is building the email itself. Here’s how to do it:

As you can see, we’re adding the files dynamically to the “Attachments” section without defining beforehand how many we’re sending.

One thing you should be aware of. If you’re using your connection to send emails, all of them will be saved in your “Sent” folder since it’s you who are sending them. If not necessary, I recommend taking a look and deleting them or build a Flow that does that for you.

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 →

20 thoughts on “Power Automate: Add attachment to e-mail dynamically

  1. well, short and simple question here. Can I drop a file in my one drive, at any time and have that file be sent?

    I think the answer is yes with this post. But, please advise.

    1. Hi John,

      Yes, you can. You can even do it automatically. You can use the “When a file is created” trigger. Fetch it and send it off.

      If you have questions about building the Flow, please let me know, and we’ll work on a template.

      Cheers
      Manuel

      1. You know my power automate was having trouble doing this and originally showed an error. I would love to see a template to figure out what I am doing wrong.

        1. Hi John,
          Sure, I added a new one that you can use as a reference. It contains comments, and I simplified the process to make it more understandable.
          It’s in my Cookbook Section but you can download it directly here
          Any questions or other issues, please let me know.
          Cheers
          Manuel

  2. Manuel, your tutorial is clear and easy to follow! I tried your steps to send files from One Drive by appending to an array variable but it fails when sending the email “‘Attachment Content’ cannot be null or empty.”. The output for appending is —
    {
    “Name”: “2021-04-30-090412.jpg”,
    “ContentBytes”: null
    }

    Flow got to the correct jpg file but the file size is 450kb on One Drive. Any ideas?

    1. Hi Yogi Ch

      Thanks a lot. I’m glad the articles are helpful.

      Regarding your problem, I would check the variable you’re using to fill in the “ContentBytes”. Also, check if in the Flow History if the file is fetched correctly from OneDrive. You can see this by expanding the OneDrive action and see if you have the information there.

      If you have, then it’s an issue with associating that to the “Content Bytes”. If not, then there’s something wrong with fetching the file.

      Can you please check if and let me know if you have any questions?

      Cheers
      Manuel

  3. Thank you Manuel. How do I connect the template with the Power Automate program? How does it work?

  4. Hi;

    Can this be done by parsing an email for URL's, fetching the files (images) the links point to, creating a new email (or same doesn't matter) and adding the files as attachments before emailing them

    1. I like the idea, but I have to think about it. Parsing text in emails is tricky, as well as fetching stuff from URLs.
      Give me a couple of days to try to come up with a template for you :).
      Cheers
      Manuel

  5. This is wonderful Manual. Thank you.
    I’ve built, using power automate, an anonymous email tool for our partners so they can email each other without knowing each other’s addresses. It all works well except for the passing on each other’s attachments. I’ve now gotten your code working where it sends, as attachments, all files in a folder. That’s step two. Now I’m going back to step One which is to put attachments in that folder from a previously sent email.
    Trigger on received email
    1. If Has Attachments then
    a. Save attachments to a temporary folder.
    b. Make a copy to a permanent archive folder
    c. Make a log in a spreadsheet: From, To, Attachments Display Names
    2. Create outbound email with same attachments (from temporary folder) (DONE with your article. Thanks!)
    3. Remove temporary folder.

    As I proceed working on step 1 above any thoughts from you (or others) would be appreciated. The temporary folder may be the most difficult part since it needs to be unique just in case there are other emails (runs of the flow) at the same time.

    Thoughts?
    Thanks again!

    1. Hey!
      Thanks a lot, and what a good challenge.
      It’s feasible, but it will be easier for me to do a template and send it to you. Then you only need to make minor adjustments, and you’re good to go.
      Sounds good?
      Let me work on this, and I’ll try to come up with something.
      Cheers
      Manuel

    2. Hi Paul,

      Here’s the template as promised:
      https://manueltgomes.com/wp-content/uploads/2021/07/PaulFlow_20210701073840.zip

      Notes:
      – I left space for you to add your custom email.
      – I used OneDrive for this example, but you can use SharePoint document libraries.
      – I added a lot of comments so that you can understand what each action does.
      – It’s not possible yet to delete folders in Power Automate. I know it’s sad, but I’ll figure out a workaround for OneDrive. I’m making one for SharePoint document libraries, so I’ll have a solution soon if you store your files there.

      Can you please check if this is what you need?

      Cheers
      Manuel

  6. Hi Manuel,

    Great sharing on how to add attachment to e-mail dynamically using Power Automate.

    Was wondering if you could help me if I want to extract files of various extensions ( eg. PDF & excel) from a Sharepoint Document Library and attach all the files into an email and send them to a customer?

    Much appreciated!

    Thank you!

  7. Hi Manuel, when I used your template to add attachments to email dynamically, it works!

    However, upon checking my sent email with the multiple attachments, it has some errors.
    For example: when I open the PDF file it says “Insufficient data for an image” and certain data in the PDF is blanked out.
    and for excel files, the error says that “The file is corrupt & cannot be opened.”

    Could you help me please?
    Thank you

  8. Manuel,

    Similar to a previous comment from Lynn, I too have implemented your template and everything worked, but when the recipient of the email attempts to open the attachments, they receive an error that files cannot be opened. In my particular case, I am sending Microsoft Project files.

      1. After removing the double quotes from around the “file content” in the JSON in the step where we append the files to the array, the files are now able to be opened successfully.

Leave a Reply to IVAN CORTINAS RODRIGUEZ Cancel reply

This site uses Akismet to reduce spam. Learn how your comment data is processed.

%d bloggers like this: