SMS Messaging with Azure SDK for JavaScript

This document provides guidance on using the Azure SDK for JavaScript to integrate with SMS messaging services, specifically through an example integration with Twilio.

Introduction

The Azure Communication Services (ACS) SDK for JavaScript allows you to build rich communication experiences into your applications. While ACS itself doesn't directly provide SMS sending capabilities for arbitrary numbers, it integrates with established providers like Twilio to enable this functionality. This guide focuses on the common pattern of using Azure services (like Azure Functions) to orchestrate SMS sending via a third-party SMS gateway.

Note: This documentation outlines a pattern for sending SMS. For native SMS capabilities within Azure, consider Azure Communication Services and its supported integrations.

Prerequisites

Setting up Twilio

  1. Sign up for a Twilio account at twilio.com.
  2. Obtain your Account SID, Auth Token, and a Twilio phone number from your Twilio console dashboard.

Using Azure Functions to Send SMS

A common and recommended approach is to use Azure Functions as a serverless backend to handle SMS sending requests securely.

1. Install Necessary Packages

In your Azure Functions project, install the Twilio Node.js SDK:

npm install twilio @azure/functions

2. Create an Azure Function

Create an HTTP-triggered Azure Function (e.g., sendSms.js) to handle incoming requests.


// sendSms.js
const twilio = require('twilio');

module.exports = async function (context, req) {
    context.log('JavaScript HTTP trigger function processed a request.');

    // Retrieve Twilio credentials and phone number from environment variables
    const accountSid = process.env.TWILIO_ACCOUNT_SID;
    const authToken = process.env.TWILIO_AUTH_TOKEN;
    const twilioPhoneNumber = process.env.TWILIO_PHONE_NUMBER;

    if (!accountSid || !authToken || !twilioPhoneNumber) {
        context.res = {
            status: 500,
            body: "Twilio credentials are not configured."
        };
        return;
    }

    const client = twilio(accountSid, authToken);

    const toPhoneNumber = req.body && req.body.toPhoneNumber;
    const messageBody = req.body && req.body.message;

    if (!toPhoneNumber || !messageBody) {
        context.res = {
            status: 400,
            body: "Please provide 'toPhoneNumber' and 'message' in the request body."
        };
        return;
    }

    try {
        const message = await client.messages.create({
            body: messageBody,
            from: twilioPhoneNumber,
            to: toPhoneNumber
        });

        context.log(`SMS sent successfully. SID: ${message.sid}`);

        context.res = {
            status: 200,
            body: {
                message: "SMS sent successfully!",
                sid: message.sid
            }
        };
    } catch (error) {
        context.log.error(`Error sending SMS: ${error.message}`);
        context.res = {
            status: 500,
            body: `Error sending SMS: ${error.message}`
        };
    }
};
        

3. Configure Environment Variables

Set the following environment variables in your Azure Functions app's configuration (e.g., in local.settings.json for local development):


{
  "IsEncrypted": false,
  "Values": {
    "AzureWebJobsStorage": "",
    "FUNCTIONS_WORKER_RUNTIME": "node",
    "TWILIO_ACCOUNT_SID": "ACxxxxxxxxxxxxxxxxxxxxxxxxxxxxx",
    "TWILIO_AUTH_TOKEN": "your_auth_token",
    "TWILIO_PHONE_NUMBER": "+15551234567"
  }
}
        

Replace the placeholder values with your actual Twilio credentials.

Calling the Azure Function from your Frontend

You can use the fetch API in your JavaScript frontend application to call your Azure Function.


async function sendSmsMessage(phoneNumber, messageContent) {
    const apiUrl = 'YOUR_AZURE_FUNCTION_URL'; // Replace with your deployed Azure Function URL

    try {
        const response = await fetch(apiUrl, {
            method: 'POST',
            headers: {
                'Content-Type': 'application/json',
            },
            body: JSON.stringify({
                toPhoneNumber: phoneNumber,
                message: messageContent,
            }),
        });

        if (!response.ok) {
            const errorData = await response.json();
            throw new Error(`SMS sending failed: ${response.status} - ${errorData.message || response.statusText}`);
        }

        const data = await response.json();
        console.log('SMS sent successfully:', data);
        alert('SMS sent successfully!');
    } catch (error) {
        console.error('Error sending SMS:', error);
        alert(`Failed to send SMS: ${error.message}`);
    }
}

// Example usage:
// sendSmsMessage('+1234567890', 'Hello from Azure SDK for JavaScript!');
        

API Reference (Twilio SDK)

twilio.messages.create()

Sends an SMS message.

Parameters:

Returns a Promise that resolves with the message SID upon successful sending.

Best Practices