16

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

recipient = SendGrid::Recipient.new("sergio@gmail.com")
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.

Sergio Tapia
  • 9,173
  • 12
  • 35
  • 59

7 Answers7

19

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

schmoopy
  • 6,419
  • 11
  • 54
  • 89
Daniel Disblu
  • 203
  • 2
  • 12
17

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

Schroet
  • 365
  • 4
  • 8
6
{{#each data.products}}
    {{name}}: {{price}} <br/>
{{/each}}

{"data":{"products": [{"name": "Tomato", "price": "5"}, {"name": "Banana", "price": "8"}]}}
  • 4
    While this code may answer the question, it is better to explain how to solve the problem and provide the code as an example or reference. Code-only answers can be confusing and lack context. – Dima Kozhevin May 10 '19 at 12:38
2

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.

Chrono
  • 1,433
  • 1
  • 16
  • 33
0

Unfortunately the templates SendGrid provides are pretty minimal at this time. The templates don't support arrays as values and there are no conditional or looping controls, so you'd need to predetermine everything prior to building the template and template content. A more robust templating system is coming soon.

bwest
  • 9,182
  • 3
  • 28
  • 58
  • https://www.youtube.com/watch?v=09s-c2JVI40 - Is it possible for me to send over a large string and replace that in the template? I can loop and render in Rails, and send that chunk to be replaced in the template. Is that kosher? – Sergio Tapia Dec 28 '15 at 15:08
  • Yep, that's a good way to go, [here's a similar example](https://sendgrid.com/docs/API_Reference/Web_API_v3/Transactional_Templates/smtpapi.html#-Substitutions-and-Sections) – bwest Dec 28 '15 at 15:12
  • 8
    Is this answer still valid or has SenGrid implemented loops? – Maria Ines Parnisari Aug 26 '16 at 17:14
0

Here is a workaround Sendgrid is yet to update their template engine for this

Hello guys i need to do some iteration in my sendgrid mail and ran into this issue for now i had a temporal workaround which solved the problem. here is how i worked around it

  • created a txt file and loaded my html template there
  • Note areas i wanted to iterate on i replaced with a sendgrid variable e.g %list of items%
  • read the txt file into a string create a string builder and pass all iterated object into the %list of items% variable

then send the whole string content as message through sendgrid

public void sendSimpleMessage(String message,
                String subject, 
                String toEmail,
                String fromEmail){
                 Email from = new Email(fromEmail);
                 Email to = new Email(toEmail);
                 Content content = new Content("text/html", message);
                 Mail mail = new Mail(from, subject, to, content);


                 SendGrid sg = new SendGrid(sendgridApiKey);
                 Request request = new Request();
                 try {
                      request.method = Method.POST;
                      request.endpoint = "mail/send";
                      request.body = mail.build();
                      sg.api(request);
                 } catch (IOException ex) {
                      ex.printStackTrace();
                }
        }

hope it helps someone https://github.com/sendgrid/sendgrid-nodejs/issues/221#issuecomment-361489007

chukwuka mark
  • 154
  • 2
  • 11
0
        "businessContributors" : [
                    {
                        "total" : {
                            "amount" : 11340,
                            "title" : "Dhama Ji Total"
                        },
                        "list" : {
                            "Dhama Ji Paid" : -296310,
                            "HDFC Account" : 0,
                            "Dhama Ji Received" : 307650
                        },
                        "title" : "Dhama Ji Owner Account"
                    },
                    {
                        "total" : {
                            "amount" : -1270,
                            "title" : "Rahul Total"
                        },
                        "list" : {
                            "Rahul Paid" : 243838,
                            "Rahul Received" : 242568
                        },
                        "title" : "Rahul Account"
                    },
        ]
    
    
   in email template  :-

 
     <h4>Business Contributors </h4>
            <ul>
                {{#each businessContributors}}
                <li> {{this.title}} <br>
                    {{#each this.list}}
                     {{@key}} = {{this}} <br>
                {{/each}}  </li>
                

      
         
                <hr style="height: 2px; background-color: black;"><br>
                <h2>{{this.total.title}}</h2><br>
                <h2>{{this.total.amount}}</h2>
                <br><br>
            {{/each}}
            </ul>
Shashwat Gupta
  • 5,071
  • 41
  • 33