5

Is there a way to send email from Twilio function? I understand that we can use sendgrid. I am looking a simpler solution.

arun kumar
  • 703
  • 2
  • 13
  • 33

2 Answers2

5

Twilio evangelist here.

As of now, you can use SendGrid from within a Twilio Function. The code below does the job for me and I just sent an email via a function

exports.handler = function(context, event, callback) {
    const sgMail = require('@sendgrid/mail');
    sgMail.setApiKey(process.env.SENDGRID_API_KEY);
    const msg = {
      to: 'sjudis@twilio.com',
      from: 'test@example.com',
      subject: 'Sending with SendGrid is Fun',
      text: 'and easy to do anywhere, even with Node.js',
      html: '<strong>and easy to do anywhere, even with Node.js</strong>',
    };
    sgMail.send(msg)
    .then(() => {
        callback(null, 'Email sent...');
    })
    .catch((e) => {
        console.log(e);
    })
};

The above email will most like end up in spam as test@example.com is not a very trust worthy email address. If you want to send emails from your own domains additional configuration is needed.

To run the code inside of the function, you have to make sure to install the sendgrid/mail mail dependency and provide the sendgrid token in the function configuration.

Twilio function configuration

If you want to use this function to power e.g. messages you have to make sure that your return valid TwiML. :) When you create a new function you will get examples showing on how to do that.

Hope that helps. :)

philnash
  • 70,667
  • 10
  • 60
  • 88
stefan judis
  • 3,416
  • 14
  • 22
  • 1
    sendgrid gets blocked by things like spamcop all the time. twilio should support npms like nodemailer to make it less of a hassle. – user2782001 May 11 '19 at 19:04
  • Agree 110%. Sendgrid is terrible. There needs to be a better way to do this. – Jake Jul 31 '19 at 06:10
  • Also, the example provided unfortunately doesn't work. I changed `process.env` to `context` to see if that fixes it but it still doesn't work. No emails get sent. – Jake Jul 31 '19 at 06:25
0

Another way is to use the SendGrid API

const got = require('got');

exports.handler = function(context, event, callback) {
  const requestBody = {
    personalizations: [{ to: [{ email: context.TO_EMAIL_ADDRESS }] }],
    from: { email: context.FROM_EMAIL_ADDRESS },
    subject: `New SMS message from: ${event.From}`,
    content: [
      {
        type: 'text/plain',
        value: event.Body
      }
    ]
  };

  got.post('https://api.sendgrid.com/v3/mail/send', {
    headers: {
      Authorization: `Bearer ${context.SENDGRID_API_KEY}`, 
      'Content-Type': 'application/json'
    },
    body: JSON.stringify(requestBody)
  })
  .then(response => {
    let twiml = new Twilio.twiml.MessagingResponse();
    callback(null, twiml);
  })
  .catch(err => {
    callback(err);
  });
 };
};

Source: https://www.twilio.com/blog/2017/07/forward-incoming-sms-messages-to-email-with-node-js-sendgrid-and-twilio-functions.html

Ludvig Odin
  • 69
  • 10