Skip to main content

SendGrid

SendGrid provides a cloud-based service that assists businesses with email delivery. On this page you will learn how to use the SendGrid plugin to send emails from your DynaMaker app. You can read more about sending emails with SendGrid in their official documentation here.

In DynaMaker, SendGrid exists as a plugin and it is very easy to use! In order to explain how it works, we will go through:

  1. SendGrid Account
  2. DynaMaker Plugin

1. SendGrid Account

A. Register / Login

You need an account in SendGrid to be able to use it in DynaMaker. You can use the same account for multiple applications and have custom templates for each one. If you don't have an account yet, you can create one for free at https://signup.sendgrid.com.

Once you have set up your SendGrid account, there are a few steps to follow regarding the account and its access before going into the DynaMaker app. First off, a SendGrid API key needs to be created for the plugin in DynaMaker. Then, different email templates can be created for the same app (e.g. one for the users and one for the Sales department). Finally, the DynaMaker app can use these templates and send the custom product values we need to show.

B. Create API Key

  • In your SendGrid account, to the left under Settings, go into API Keys.
  • Create a new API key with restricted access with Mail Send enabled.

sendgrid-1

You will be given an API key that needs to be saved somewhere before SendGrid hides it.

Now, you can enable the plugin with this API key in your DynaMaker app, like:

sendgrid-2

Remember that you can have the same API key for multiple apps. Also, each DynaMaker app can use different email templates simultaneously. In the next step we will show how to create these templates.

C. Create Dynamic Template

We will create a template intended for the user of the application.

  • Go back to the dashboard of your SendGrid account.
  • Under Email API, go into Dynamic Templates and create a template with any name you want

sendgrid-3

  • Add a version with any name, e.g. UserTemplate.

sendgrid-4

Keep the template ID for the DynaMaker application later.

  • Customize them however you want. The values from DynaMaker will be fetched correctly with the proper syntax (i.e. {{ }}):

sendgrid-5

You can read more about the syntax here in case you want to use if statements in the email for example.

Great! There is a built-in functionality in the dynamic template (to the left) to send this template with a test email. Try it and see that you get everything in place. Also, if you want to test the values within {{ }}, you can go under Preview (at the top) in Show Test Data.

Before using this template in your app, there is one more step left. You need to create a sender identity that SendGrid asks for.

D. Create Sender Identity

You will find this option at the very top of your SendGrid dashboard as a green warning. Otherwise, you can also find it under Settings, in Sender Authentication.

sendgrid-6

Write a real email as sender, since you will need to verify it.

2. DynaMaker Plugin

Once we have enabled the plugin with the API key, it is ready to use in your app.

A. Import Plugin

First off, you need to import PLUGINS in your application as if it was a subcomponent. Then you should be able to get the code completion correctly and use the function PLUGINS.SENDGRID.sendMail().

B. Send Mail

The function PLUGINS.SENDGRID.sendMail() needs a configuration as argument that should include the values you want to read in the dynamic template of SendGrid (e.g. project, customer and delivery). You can try to create it in a function that should return an object including the following for example:

function getMailConfig(pdfDataUrl) {
const pdfContent = pdfDataUrl.replace('data:application/pdf;base64,', '')
const customerEmail = ACTIONS.getCustomerEmail()
const dimensions = ACTIONS.getCubeDimensions()
const { width, depth, height } = dimensions
const projectName = `Cube - ${width} x ${depth} x ${height}`
const projectPrice = `${Math.round(width * depth * height / 100000)}`
const deliveryDate = new Date(Date.now() + 12096e5) // 12096e5 is 2 weeks in milliseconds
const deliveryDateString = deliveryDate.toISOString().split('T')[0]

const project = { name: projectName, material: 'PVC Blue', qty: 1, price: projectPrice }
const customer = { name: 'Mr Customer', phoneNumber: '0760000000', email: customerEmail }
const delivery = { address: 'Stora Torget 1', postalCode: 58219, city: 'Linköping', date: deliveryDateString }

return {
template_id: 'your-dynamic-template-id',
from: {
email: 'your-sender-email-you-verified-in-sendgrid@theamazingcube.com'
},
personalizations: [
{
to: [
{
email: customer.email,
name: 'Mr Customer',
},
],
cc: [
{ email: 'sales@theamazingcube.com' },
],
dynamic_template_data: {
project,
customer,
delivery,
}
}
],
attachments: [
{
content: pdfContent,
type: 'application/pdf',
filename: `The Amazing Cube.pdf`,
}
],
}
}

Notice that the template_id of the dynamic template in SendGrid can be seen in its dashboard next to the versions.

Now that you have the configuration defined, we can use this in a button to request a quotation for example, like:

const quotationButton = new SKYUI.Button('Request Quotation', async () => {
const pdfDataUrl = await ACTIONS.generatePdfDataUrl() // drawing.generatePdfDataUrl()
const mailConfig = getMailConfig(pdfDataUrl)
PLUGINS.SENDGRID.sendMail(mailConfig)
}, {
icon: STUDIO.ICONS.SEND,
})

Remember that the SendGrid template can be updated without saving or redeploying the app again.


As an example, we show it in app where the customer email is written as input together with a success display message.


Since sendMail() is a promise, you can display the message when it has completed:

PLUGINS.SENDGRID.sendMail(mailConfig)
.then(response => {
if (response.ok) {
Studio.dispatchEvent({ type: 'success-message', content: `Quotation requested successfully! Check the email sent to ${ACTIONS.getCustomerEmail()}` })
} else {
throw new Error(response.statusText) // check console browser for possible errors (F12)
}
return response
})