twilio sms보내기

뽀로로·2024년 11월 20일

문자 메세지를 보내는 다양한 플랫폼이 있다. 나는 그 중 twilio로 sms보내기를 구현했다.

참고로 나는 구글 로그인으로 했을 때 잘 안되서 일반 계정으로 생성했다. 아래에 겪은 버그들을 적어두겠다.

로그인

twilio 로그인 주소

sign up을 누른 후 로그인 방법을 선택하면 된다.
일반 계정 생성은 아래 폼을 작성하면 된다.

나는 구글로 계정 생성과 일반 계정 생성을 둘 다 해봤다. 왜 그런진 모르겠지만 구글 로그인에서 버그가 있었다. 나의 경우에 다음과 같은 에러가 있었다.

번호 발급

첫 화면에서 get phone number(?)을 눌렀던가 하면 번호를 준다. 그럼 아래에 다음과 같은 정보들이 나타난다.

일반 로그인이 구글 로그인보다 탭에 더 많은게 있다. Verify나 Flex같은 것들은 구글 로그인에 없었다.

번호 등록 확인

옆에 탭에서 #Develop -> Phone Numbers -> Manage -> Verfied Caller Ids에서 번호가 잘 등록되어 있는지 확인한다. 여기서 번호가 없다면 등록해준다. 무료버전에서는 여기에 등록된 사람들에게만 보내지는 것으로 알고있다.

SMS send 테스트

메세지 보내는 테스트는 #Develop -> Messaging -> Send an SMS 에서 테스트할 수 있다.

  • to: Verified Caller Ids에 있는 번호만 가능하다.
  • Phone number: 아까 발급받은 번호를 사용하게 된다.

옆에 request정보와 응답 정보를 볼 수 있다. 이것을 보고 직접 코드를 작성해도 되고 twilio 패키지를 사용해도 된다.

Nestjs로 구현하기

nest g mo twilio # 모듈 생성 
nest g s twilio # 서비스 생성
nest g co twilio # 컨트롤러 생성 / 테스트 용도

.env

각자 자신이 발급받은 accountsid, authtoken, phonenumber넣어주기.

TWILIO_ACCOUNT_SID=""
TWILIO_AUTH_TOKEN=""
TWILIO_PHONE_NUMBER=""
  • TWILIO_PHONE_NUMBER: 아까 get phone number(?)로 발급받은 번호
  • TWILIO_ACCOUNT_SID: 로그인 했을 때 나오는 첫 페이지에 있는 accountsid
  • TWILIO_AUTH_TOKEN: 로그인 했을 때 나오는 첫 페이지에 있는 authtoken

twilio module

import { Module } from '@nestjs/common';
import { TwilioService } from './twilio.service';
import { ConfigService } from '@nestjs/config';
import * as Twilio from 'twilio';
import { TwilioController } from './twilio.controller';

@Module({
  controllers: [TwilioController],
  providers: [
    TwilioService,
    {
      provide: 'TWILIO_CLIENT',
      useFactory: (configService: ConfigService) => {
        const accountSid = configService.get<string>('TWILIO_ACCOUNT_SID');
        const authToken = configService.get<string>('TWILIO_AUTH_TOKEN');
        return Twilio(accountSid, authToken);
      },
      inject: [ConfigService],
    },
    {
      provide: 'TWILIO_PHONE_NUMBER',
      useFactory: (configService: ConfigService) => {
        return configService.get<string>('TWILIO_PHONE_NUMBER');
      },
      inject: [ConfigService],
    },

  ],
  exports: [TwilioService],
})
export class TwilioModule {}

twilio service

import {
  Inject,
  Injectable,
  InternalServerErrorException,
} from '@nestjs/common';

@Injectable()
export class TwilioService {
  constructor(
    @Inject('TWILIO_PHONE_NUMBER') private readonly twilioPhoneNumber: string,
    @Inject('TWILIO_CLIENT') private readonly twilio,
    @Inject('TWILIO_SERVICE_ID') private readonly twilioServiceId: string,
  ) {}

  async sendMessage({ to, body }: { to: string; body: string }) {
    try {
      return this.twilio.messages.create({
        to: to,
        from: this.twilioPhoneNumber,
        body,
      });
    } catch (e) {
      throw new InternalServerErrorException('메세지 보내는데 실패했습니다.');
    }
  }
}

twilio test controller

import { Body, Controller, Get } from '@nestjs/common';
import { TwilioService } from './twilio.service';

@Controller('twilio')
export class TwilioController {
  constructor(private readonly twilioService: TwilioService) {}

  @Get('test')
  async sendMessage(@Body('to') to: string, @Body('body') body: string) {
    const data = await this.twilioService.sendMessage({
      to,
      body,
    });
    return data;
  }
}

이렇게 작성하고 테스트를 하면 문자가 잘 오는 것을 확인할 수 있다.

삽질

구글 로그인으로 불편했던 점.

  1. 로그인에 구글 로그인이 없어서 sign up -> 구글 로그인을 해야했다. (다른 방법이 있다면 알려주세요)
  2. 1번의 과정으로 계속 새로운 앱이 생성되었다.
  3. 나의 경우에는 전화번호 등록 확인 문자를 입력해야하는데 입력 문자가 안왔다. twilio인증문자가 로그인할 땐 잘 오다가 여기서만 안오는 이유를 모르겠다.(이 이유를 알고 있다면 알려주세요.)

처음에 구글 로그인으로 시작했다. 다른 블로그 글과 내 UI가 살짝 달랐다. 다른 사람들은 5단계로 되어 있었고, 나는 4단계로 되어 있었다. 나는 당연히 업데이트 했나보다라고 생각했다. (나중에 보니까 구글 로그인이랑 일반 로그인이랑 조금 다르더라.)

에러 1 (제 정보는 가렸습니다.)

The number +8210????XXXX is unverified. Trial accounts cannot send messages to unverified numbers; verify +8210????XXXX at twilio.com/user/account/phone-numbers/verified, or purchase a Twilio number to send messages to unverified numbers

분명 내 번호는 등록되어 있었다. 해결하기 위해 내 번호 삭제 후 다시 등록하려 했다. verified Caller IDs -> Add a new Caller ID를 통해서 번호를 등록하려고 했지만 문자가 안왔다.

Service를 등록하래서 등록도 해봤지만 여전히 에러났다.

그래서 계정을 업그레이드하면 된다길래 시도했다. 결제가 실패하더니 메일이 한통 왔다.
대충 내용은
1. 이 서비스를 사용하려는 구체적인 사례 설명
2. 비지니스 목적으로 twilio를 사용하려는 이유
3. twilio에서 생성한 기타 계정이나 프로젝트
단지 공부 목적이라라고 답장하니 또 무슨 별 이상한걸 물어본다 귀찮게;;
물어보는거 계속 답장해주니까 결국 계정을 풀어줄 수 없다고 해서 새롭게 계정을 만들었다.
일반 계정으로 생성하니 모든게 너무 잘 되어서 열받았다.

구글 로그인으로 잘 사용하시는 분들이 계시다면 댓글로 사용법 알려주세요

profile
노는게 제일 좋아

3개의 댓글

comment-user-thumbnail
2025년 3월 4일

안녕하세요! 저도 같은 문제를 겪고 있는데 일반 계정으로 다시 하셨다함은 free trial이 아닌 upgrade를 하셨다는 말씀이실까요?ㅠ

1개의 답글