Enviando SMS em Java com Twilio

Enviando SMS em Java com Twilio

1. Introdução

O envio de mensagens SMS é uma grande parte de muitos aplicativos modernos. Há uma variedade de casos de uso que as mensagens SMS podem atender: autenticação de dois fatores, alertas em tempo real, chatbots e muito mais.

Neste tutorial, construiremos um aplicativo Java simples que envia mensagens SMS usandoTwilio.

Existem vários serviços que fornecem recursos de SMS, comoNexmo,Plivo, AmazonSimple Notification Service (SNS),Zapier e mais.

Usando o cliente Twilio Java,we can send an SMS message in just a few lines of code.

2. Configurando o Twilio

To get started we’ll need a Twilio account. Eles oferecem uma conta de teste que é suficiente para testar todos os recursos de sua plataforma.

Como parte da configuração da conta, também devemos criar um número de telefone. Isso é importante porque a conta de avaliação requer um número de telefone verificado para o envio de mensagens.

Twilio oferece umquick setup tutorial para novas contas. Depois de concluir a configuração da conta e verificar nosso número de telefone, podemos começar a enviar mensagens.

3. Introdução ao TwiML

Antes de escrevermos nosso aplicativo de amostra, vamos dar uma olhada rápida no formato de troca de dados usado para serviços Twilio.

TwiML é uma linguagem de marcação proprietária baseada em XML. Os elementos em uma mensagem TwiML refletem as diferentes ações que podemos executar relacionadas à telefonia: fazer uma ligação telefônica, gravar uma mensagem, enviar uma mensagem e assim por diante.

Aqui está um exemplo de mensagem TwiML para enviar um SMS:


    
        Sample Twilio SMS
    

E aqui está outro exemplo de mensagem TwiML que faz uma ligação:


    
        415-123-4567
    

Ambos são exemplos triviais, mas eles nos dão uma boa compreensão de como o TwiML se parece. É composto por verbos e substantivos fáceis de lembrar e diretamente relacionados à ação que realizaríamos com um telefone.

4. Enviando SMS em Java com Twilio

O Twilio fornece um rico cliente Java que facilita a interação com seus serviços. Instead of having to write code that builds TwiML messages from scratch, we can use an out-of-the-box Java client.

4.1. Dependências

Podemos baixar a dependência diretamente deMaven Central ou adicionando a seguinte entrada ao nosso arquivopom.xml:


    com.twilio.sdk
    twilio
    7.20.0

4.2. Enviando um SMS

Para começar, vejamos alguns exemplos de código:

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

Vamos dividir em partes essenciais o código do exemplo acima:

  • A chamadaTwilio.init() é necessária uma vez para configurar o ambiente Twilio com nosso exclusivo Sid e Token de conta

  • O objetoMessage é o Java equivalente ao elemento TwiML<Message> que vimos anteriormente

  • Message.creator() requer 3 parâmetros: Para o número do telefone, Do número do telefone e o corpo da mensagem

  • O métodocreate() lida com o envio da mensagem

4.3. Enviando um MMS

The Twilio API also supports sending multimedia messages. Podemos misturar e combinar texto e imagens, para que isso funcione, o telefone receptor deve suportar mensagens de mídia:

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. Status da mensagem de rastreamento

Nos exemplos anteriores, não confirmamos se a mensagem foi realmente entregue. No entanto,Twilio provides a mechanism for us to determine whether a message was successfully delivered or not.

5.1. Códigos de status da mensagem

Ao enviar uma mensagem, ela terá um dos status a qualquer momento:

  • Queued - Twilio recebeu a mensagem e a colocou na fila para entrega

  • Sending - o servidor está enviando sua mensagem para a operadora upstream mais próxima na rede

  • Sent - a mensagem foi aceita com sucesso pela operadora upstream mais próxima

  • Delivered - Twilio recebeu confirmação de entrega da mensagem da operadora upstream e, possivelmente, do aparelho de destino, quando disponível

  • Failed - a mensagem não pôde ser enviada

  • Undelivered - o servidor recebeu um recibo de entrega indicando que a mensagem não foi entregue

Observe que, nos dois últimos status, podemos encontrar um código de erro com detalhes mais específicos para nos ajudar a solucionar problemas de entrega.

O Twilio Java Client oferece métodos síncronos e assíncronos para buscar o status. Vamos dar uma olhada.

5.2. Verificando o status da entrega (síncrono)

Depois de criar um objetoMessage, podemos chamarMessage.getStatus() para ver em qual status ele está:

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

Observe queMessage.reader().read() faz uma chamada de API remota, portanto, use-a com moderação. By default, it returns all messages we’ve sent, mas podemos filtrar as mensagens retornadas por números de telefone ou intervalo de datas.

5.3. Verificando o status da entrega (assíncrono)

Como a recuperação do status da mensagem requer uma chamada de API remota, pode levar muito tempo. Para evitar o bloqueio do thread atual, o cliente Twilio Java também fornece uma versão assíncrona deMessage.getStatus().read().

Twilio.init(ACCOUNT_SID, AUTH_TOKEN);
ListenableFuture> future = Message.reader().readAsync();
Futures.addCallback(
    future,
    new FutureCallback>() {
        public void onSuccess(ResourceSet 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());
         }
     });

Isso usa a interface GuavaListenableFuture para processar a resposta do Twilio em um thread diferente.

6. Conclusão

Neste artigo, aprendemos como enviar SMS e MMS usando o Twilio e Java.

Enquanto o TwiML é a base de todas as mensagens de e para servidores Twilio, o cliente Java do Twilio facilita o envio de mensagens de maneira incrivelmente fácil.

E, como sempre, a base de código completa para este exemplo pode ser encontrada em nossoGitHub repository.