Как создать приложение для групповой SMS-рассылки с помощью ASP.NET MVC

Автор: | 15.07.2026

**Джонатан Крессати**, победитель нашего конкурса разработчиков SMS в феврале. Betwext — это простой сервис группового обмена текстовыми сообщениями. При использовании Betwext вам достаточно отправить сообщение один раз, и его получат все участники вашего активного списка, включая любые ответы от других участников. Это почти как добавление кнопки «Ответить всем» в ваши SMS, и это оказалось чрезвычайно полезным на фестивале South by Southwest в этом году.

С помощью REST API Twilio легко отправлять текстовые сообщения любому количеству получателей. Мы подготовили пример, демонстрирующий, как создать простое приложение для групповой рассылки сообщений. В примере используется ASP.NET MVC и C#, но эти концепции легко применимы к любому другому фреймворку. Ниже мы обсудим, как обрабатывать входящие сообщения, управлять запросами на подписку и отписку, а также, что самое важное, пересылать сообщения от участников группы остальным её членам.

В нашем приложении для групповой SMS участники могут присоединиться к группе, отправив сообщение **START** на номер телефона группы. После присоединения любые сообщения, отправленные на номер группы, будут пересылаться всем остальным участникам. Чтобы оставить место для номера отправителя в пересылаемом сообщении, длина сообщений ограничена 140 символами. Чтобы покинуть группу, отправьте **STOP**.

Этот пример демонстрирует получение входящего SMS через POST-запрос на ваш SMS URL, отправку SMS-сообщений участникам группы через REST API и ответ отправителю с помощью текстового ответа на входящий HTTP-запрос.

— SMS-сообщение отправляется на ваш Twilio номер телефона.

— Twilio отправляет POST-запрос на SMS URL вашего номера телефона (в этом примере это будет http://example.com/IncomingMessage).

— Обработчик сообщений проверяет тело сообщения на наличие команд, таких как **START** или **STOP**, и соответственно изменяет членство участника в группе (список участников хранится в базе данных).

— Если сообщение содержит любой другой текст и отправитель является участником группы, пересылается включённое сообщение всем остальным участникам через Twilio REST API.

— Отправляется подтверждающее сообщение исходному отправителю о выполненном действии.

Этот пример был создан с использованием Visual Studio 2010, .NET 4, ASP.NET MVC 2, LINQ to SQL и SQL Server Express 2008. Код также будет работать с Visual Studio 2008, .NET 3.5 SP1 и проектом ASP.NET MVC 1. В этом примере также используется TwilioRest C# SDK, который можно найти по адресу http://github.com/twilio/twilio-csharp.

В этом примере мы используем простой класс LINQ to SQL. Вам не обязательно использовать LINQ to SQL; подойдёт любая стратегия доступа к данным в .NET. Просто замените обращения к базе данных на эквивалентные в вашей любимой ORM. Пример базы данных и файл .dbml включены в загрузку.

«`sql

CREATE TABLE [Member] (

[MemberId] [int] IDENTITY(1,1) NOT NULL,

[PhoneNumber] [nvarchar](50) NULL

)

«`

В одном из ваших контроллеров создайте метод действия для получения SMS-сообщений. Вот пример структуры контроллера, который также включает DataContext LINQ-to-SQL для удобства. Мы заполним содержимое метода *IncomingMessage* логикой обработки сообщений ниже.

«`csharp

public class HomeController : Controller

{

GroupSmsDataContext DB = new GroupSmsDataContext();

[HttpPost] // или [AcceptVerbs(HttpVerbs.Post)] в MVC1

public ActionResult IncomingMessage(string From, string To, string Body)

{

return View();

}

}

«`

Обновите маршруты, чтобы этот метод был доступен по адресу */IncomingMessage*:

«`csharp

public static void RegisterRoutes(RouteCollection routes)

{

routes.MapRoute(«Default», «{action}», new { controller = «Home», action = «Index» } );

}

«`

Вся обработка сообщений будет выполняться внутри метода действия IncomingMessage.

Когда Twilio отправляет POST-запрос на ваш SMS URL, он включает три значения (To, From, Body), которые ASP.NET MVC связывает с соответствующими параметрами метода. Как только мы узнаем, от кого сообщение, куда оно направлено и что содержит, мы можем его обработать.

Сначала мы проверяем команду на присоединение или выход. Если содержимое сообщения соответствует одной из четырёх поддерживаемых команд, мы добавляем или удаляем номер из группы.

«`csharp

public ActionResult IncomingMessage(string From, string To, string Body) {

string response;

switch (Body.ToLowerInvariant().Trim()) {

case «start»:

case «join»:

// подписка участника

AddMemberToGroup(From);

response = «СИСТЕМА: Добро пожаловать в клуб 🙂 Держите сообщения до 140 символов! Отправьте STOP, чтобы выйти.»;

break;

case «stop»:

case «leave»:

// отписка участника

RemoveMemberFromGroup(From);

response = «СИСТЕМА: До скорого, аллигатор.»;

break;

«`

Если сообщение содержит любой другой текст, мы хотим: 1) проверить, является ли отправитель участником группы, и 2) если да, переслать сообщение всем остальным участникам группы.

«`csharp

default:

// предотвращение отправки сообщений не участниками группы

var member = DB.Members.FirstOrDefault(m => m.PhoneNumber == From);

if (member == null) {

response = «СИСТЕМА: Отправьте START, чтобы отправлять/получать сообщения от этой группы»;

break;

}

// настройка клиента Twilio

var accountSid = «xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx»; // TODO: замените на ваш ID аккаунта

var secretKey = «xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx»; // TODO: замените на ваш ключ

var account = new TwilioRest.Account(accountSid, secretKey);

// получение всех участников группы, кроме отправителя

var members = DB.Members.Where(m => m.MemberId != member.MemberId).ToList();

foreach (var recipient in members) {

// отправка сообщения каждому участнику

var url = string.Format(«/2008-08-01/Accounts/{0}/SMS/Messages», accountSid);

var values = new Hashtable();

values.Add(«To», recipient.PhoneNumber);

values.Add(«From», To);

values.Add(«Body», From + «: » + Body.Trim());

account.request(url, «POST», values);

}

response = string.Format(«СИСТЕМА: Сообщение отправлено {0} участникам», members.Count);

break;

}

«`

Наконец, мы отвечаем отправителю, выводя простой текст, который Twilio считывает и отправляет через SMS исходному отправителю.

«`csharp

// ответ с подтверждающим сообщением

return Content(response, «text/plain»);

}

«`

Методы управления членством реализованы следующим образом. Вы можете заменить эту реализацию на метод доступа к данным по вашему выбору.

«`csharp

private void RemoveMemberFromGroup(string phoneNumber) {

// получение участника по номеру телефона

var member = DB.Members.FirstOrDefault(m => m.PhoneNumber == phoneNumber);

// если участник существует, удаляем его из базы данных

if (member != null) {

DB.Members.DeleteOnSubmit(member);

DB.SubmitChanges();

}

}

private void AddMemberToGroup(string phoneNumber) {

// получение участника по номеру телефона

var member = DB.Members.FirstOrDefault(m => m.PhoneNumber == phoneNumber);

// если участник уже есть, просто игнорируем

if (member != null) return;

// добавление нового участника в базу данных

member = new Member();

member.PhoneNumber = phoneNumber;

DB.Members.InsertOnSubmit(member);

DB.SubmitChanges();

}

«`

Существует множество способов расширить это приложение. Вот несколько идей, чтобы начать:

— Требовать PIN-код для присоединения к группе

— Позволять участникам устанавливать отображаемое имя

— Обрабатывать сообщения длиннее 140 символов

— Добавить возможность отключения уведомлений на X часов

— Позволять участникам указывать часы тишины

Создать приложение для групповой рассылки сообщений с помощью Twilio и ASP.NET MVC очень просто. Если вы хотите настроить это для себя, скачайте исходный код, создайте бесплатный аккаунт Twilio (мы дадим вам $30 при регистрации) и начните общаться!