Перейти к основному содержимому

Отправка SMS на Java с помощью Twilio

· 5 мин. чтения

1. Введение

Отправка SMS-сообщений является важной частью многих современных приложений. Существует множество вариантов использования SMS-сообщений: двухфакторная аутентификация, оповещения в реальном времени, чат-боты и многое другое.

В этом руководстве мы создадим простое Java-приложение, которое отправляет SMS-сообщения с помощью Twilio .

Существует ряд сервисов, предоставляющих возможности SMS, например Vonage , Plivo , Amazon Simple Notification Service (SNS), Zapier и другие.

Используя Java-клиент Twilio, мы можем отправить SMS-сообщение всего несколькими строками кода .

2. Настройка Twilio

Для начала нам понадобится учетная запись Twilio. Они предлагают пробную учетную запись, которой достаточно для тестирования каждой функции их платформы.

В рамках настройки учетной записи мы также должны создать номер телефона. Это важно, потому что для пробной учетной записи требуется подтвержденный номер телефона для отправки сообщений.

Twilio предлагает руководство по быстрой настройке для новых учетных записей. Как только мы завершим настройку учетной записи и подтвердим наш номер телефона, мы сможем начать отправлять сообщения.

3. Введение в TwiML

Прежде чем мы напишем наш образец приложения, давайте кратко рассмотрим формат обмена данными, используемый для служб Twilio.

TwiML — это собственный язык разметки, основанный на XML. Элементы сообщения TwiML отражают различные действия, которые мы можем предпринять, связанные с телефонией: сделать телефонный звонок, записать сообщение, отправить сообщение и т. д.

Вот пример сообщения TwiML для отправки SMS:

<Response>
<Message>
<Body>Sample Twilio SMS</Body>
</Message>
</Response>

А вот еще один пример TwiML-сообщения, которое делает телефонный звонок:

<Response>
<Dial>
<Number>415-123-4567</Number>
</Dial>
</Response>

Это тривиальные примеры, но они дают нам хорошее представление о том, как выглядит TwiML. Он состоит из глаголов и существительных, которые легко запомнить и которые напрямую связаны с действием, которое мы выполняем с телефоном.

4. Отправка SMS на Java с помощью Twilio

Twilio предоставляет многофункциональный Java-клиент, который упрощает взаимодействие с их сервисами. Вместо написания кода, создающего сообщения TwiML с нуля, мы можем использовать готовый Java-клиент .

4.1. Зависимости

Мы можем загрузить зависимость непосредственно из Maven Central или добавив следующую запись в наш файл pom.xml :

<dependency>
<groupId>com.twilio.sdk</groupId>
<artifactId>twilio</artifactId>
<version>7.20.0</version>
</dependency>

4.2. Отправка SMS

Для начала давайте посмотрим на пример кода:

Twilio.init(ACCOUNT_SID, AUTH_TOKEN);
Message message = Message.creator(
new PhoneNumber("+12225559999"),
new PhoneNumber(TWILIO_NUMBER),
"Sample Twilio SMS using Java")
.create();

Давайте разобьем на ключевые части код в приведенном выше примере:

  • Вызов Twilio.init() требуется один раз для настройки среды Twilio с нашим уникальным Sid и токеном учетной записи.
  • Объект Message — это Java-эквивалент элемента TwiML <Message> , который мы видели ранее.
  • Message.creator() требует 3 параметра: на номер телефона, с номера телефона и тело сообщения.
  • Метод create() обрабатывает отправку сообщения

4.3. Отправка MMS

Twilio API также поддерживает отправку мультимедийных сообщений. Мы можем смешивать и сопоставлять текст и изображения, чтобы это работало, принимающий телефон должен поддерживать обмен мультимедийными сообщениями:

Twilio.init(ACCOUNT_SID, AUTH_TOKEN);
Message message = Message.creator(
new PhoneNumber("+12225559999"),
new PhoneNumber(TWILIO_NUMBER),
"Sample Twilio MMS using Java")
.setMediaUrl(
Promoter.listOfOne(URI.create("http://www.domain.com/image.png")))
.create();

5. Отслеживание статуса сообщения

В предыдущих примерах мы не подтверждали, действительно ли сообщение было доставлено. Однако Twilio предоставляет нам механизм для определения того, было ли сообщение успешно доставлено или нет .

5.1. Коды состояния сообщений

При отправке сообщения оно в любой момент времени будет иметь один из статусов:

  • В очереди — Twilio получил сообщение и поставил его в очередь на доставку.
  • Отправка — сервер находится в процессе отправки вашего сообщения ближайшему вышестоящему оператору связи в сети.
  • Отправлено – сообщение было успешно принято ближайшим вышестоящим перевозчиком.
  • Доставлено — Twilio получил подтверждение доставки сообщения от вышестоящего оператора связи и, возможно, от телефона назначения, если он доступен.
  • Failed – сообщение не может быть отправлено
  • Не доставлено — сервер получил уведомление о доставке, указывающее, что сообщение не было доставлено.

Обратите внимание, что для последних двух статусов мы можем найти код ошибки с более подробной информацией, которая поможет нам устранить проблемы с доставкой.

Java-клиент Twilio предлагает синхронные и асинхронные методы для получения статуса. Давайте посмотрим.

5.2. Проверка статуса доставки (синхронно)

После того, как мы создали объект Message , мы можем вызвать Message.getStatus() , чтобы увидеть, в каком статусе он находится в данный момент:

Twilio.init(ACCOUNT_SID, AUTH_TOKEN);
ResourceSet messages = Message.reader().read();
for (Message message : messages) {
System.out.println(message.getSid() + " : " + message.getStatus());
}

Обратите внимание, что Message.reader().read() выполняет удаленный вызов API, поэтому используйте его с осторожностью. По умолчанию он возвращает все отправленные нами сообщения , но мы можем отфильтровать возвращенные сообщения по номерам телефонов или диапазону дат.

5.3. Проверка статуса доставки (асинхронно)

Поскольку для получения статуса сообщения требуется удаленный вызов API, это может занять много времени. Чтобы избежать блокировки текущего потока, Java-клиент Twilio также предоставляет асинхронную версию Message.getStatus().read() .

Twilio.init(ACCOUNT_SID, AUTH_TOKEN);
ListenableFuture<ResourceSet<Message>> future = Message.reader().readAsync();
Futures.addCallback(
future,
new FutureCallback<ResourceSet<Message>>() {
public void onSuccess(ResourceSet<Message> messages) {
for (Message message : messages) {
System.out.println(message.getSid() + " : " + message.getStatus());
}
}
public void onFailure(Throwable t) {
System.out.println("Failed to get message status: " + t.getMessage());
}
});

При этом используется интерфейс Guava ListenableFuture для обработки ответа от Twilio в другом потоке.

6. Заключение

В этой статье мы узнали, как отправлять SMS и MMS с помощью Twilio и Java.

В то время как TwiML является основой для всех сообщений, поступающих на серверы Twilio и получаемых с них, Java-клиент Twilio делает отправку сообщений невероятно простой.

И, как всегда, полную кодовую базу для этого примера можно найти в нашем репозитории на GitHub .