Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Iterating through array in SendGrid email template

I'm trying to iterate through a collection and display information in a SendGrid template using Ruby on Rails.

recipient = SendGrid::Recipient.new("[email protected]")
recipient.add_substitution("username", user.github_id)
recipient.add_substitution("numbers", [1,2,3,4])

In gmail, this template arrives as:

sergiotapia
ARRAY(0x85b9d90)

The actual code for the template, copied from SendGrid's editor:

<html>
  <head>
    <title></title>
  </head>
  <body>
    <div>&lt;%body%&gt;</div>

    <div>username</div>

    <div>numbers</div>

    <p>This is a small example email.</p>
  </body>
</html>

How can I iterate through a generic array or object in a SendGrid template? For this particular example, a user has many posts and I just want to show the title of the user's posts in a <li> element.

I'm just trying things out with a simple number array to see how it SendGrid works.

like image 681
Sergio Tapia Avatar asked Dec 28 '15 14:12

Sergio Tapia


4 Answers

Iterate example for the data:

{
  "people":[{"name":"Bob"},{"name":"Sally"}]
}

Code:

{{#if people}}
  <p>People:</p>
  {{#each people}}
    <p>{{this.name}}</p>
  {{/each}}
{{/if}}

Result:

People:

Bob

Sally

like image 157
Schroet Avatar answered Oct 19 '22 02:10

Schroet


Update August 2018:

Sendgrid now offers iterators from the transactional email using handlebars, here's to the docs for more info:

https://sendgrid.com/docs/for-developers/sending-email/using-handlebars/#basic-iterator

like image 39
Daniel Disblu Avatar answered Oct 19 '22 03:10

Daniel Disblu


{{#each data.products}}
    {{name}}: {{price}} <br/>
{{/each}}

{"data":{"products": [{"name": "Tomato", "price": "5"}, {"name": "Banana", "price": "8"}]}}
like image 31
Tymur Abdullaiev Avatar answered Oct 19 '22 02:10

Tymur Abdullaiev


Update

SendGrid now has support for dynamic templates!

You can read about it on their blog: https://sendgrid.com/blog/how-to-use-sendgrids-dynamic-templates-for-your-transactional-emails/

Old answer:

Searching for this resulted the following GitHub issue. So it's not possible with SendGrid (yet?).

However there are other ways to do this. Using sendwithus you get access to a more powerful template editor that supports looping and iterating.

Simply set it up using your own SendGrid API key and you will be able to use the arrays in the sendwithus template which will send the mail using SendGrid.

like image 2
Chrono Avatar answered Oct 19 '22 03:10

Chrono