SMS · LMS · MMS 문자 보내기 — 언어별 예제
샌드고로 SMS(90바이트), LMS(장문), MMS(이미지)를 발송하는 방법. 타입 선택 기준, 바이트 계산, 광고 문자 규칙까지 정리했습니다.
POST /api/v2/messages/send문자는 템플릿 승인이 필요 없습니다. 본문을 코드에서 자유롭게 만들 수 있어서, 알림톡 템플릿으로 커버되지 않는 일회성 안내나 인증번호에 적합합니다.
준비물
- 사전등록된 문자 발신번호(
senderKey) → 발신번호 사전등록 - 액세스 키 / 시크릿 키
카카오 발신프로필은 필요 없습니다.
SMS, LMS, MMS — 어떤 걸 써야 하나
| 타입 | 본문 한도 | 제목 | 첨부 | 언제 |
|---|---|---|---|---|
| SMS | 90바이트 (한글 ~45자) | ❌ | ❌ | 인증번호, 짧은 알림 |
| LMS | 2,000바이트 (한글 ~1,000자) | ✅ | ❌ | 공지, 안내문 |
| MMS | 2,000바이트 | ✅ | 이미지 | 이벤트 배너, 쿠폰 이미지 |
바이트 계산: 한글 2바이트, 영문·숫자·기호 1바이트, 줄바꿈 1~2바이트. 90바이트를 넘기면 SMS 로 보낼 수 없습니다. 길이가 유동적인 본문이라면 처음부터 LMS 를 쓰거나, 길이에 따라 분기하세요.
언어별 예제
Node.js / TypeScript
// SMS — 단문
await sendgo.sms.sendSms({
content: '[샌드고] 인증번호: 123456 (5분 이내 입력)',
contacts: [{ contact: '01012345678' }],
});
// LMS — 장문 (제목 포함)
await sendgo.sms.sendLms({
subject: '[중요] 서비스 점검 안내',
content: `안녕하세요.
서비스 점검이 예정되어 있습니다.
■ 점검 일시: 2026-09-01 02:00 ~ 06:00
■ 영향 범위: 전체 서비스
이용에 불편을 드려 죄송합니다.`,
contacts: [{ contact: '01012345678' }],
});
// MMS — 이미지 첨부
await sendgo.sms.sendMms({
subject: '[이벤트] 9월 특가',
content: '이번 달 특가 상품을 확인하세요!',
contacts: [{ contact: '01012345678' }],
});
Python
client.sms.send_sms(
content="[샌드고] 인증번호: 123456 (5분 이내 입력)",
contacts=[{"contact": "01012345678"}],
)
client.sms.send_lms(
subject="[중요] 서비스 점검 안내",
content="안녕하세요.\n\n서비스 점검이 예정되어 있습니다.\n일시: 2026-09-01 02:00 ~ 06:00",
contacts=[{"contact": "01012345678"}],
)
client.sms.send_mms(
subject="[이벤트] 9월 특가",
content="이번 달 특가 상품을 확인하세요!",
contacts=[{"contact": "01012345678"}],
)
PHP · Laravel
<?php
$sendgo->sms->sendSms([
'content' => '[샌드고] 인증번호: 123456 (5분 이내 입력)',
'contacts' => [['contact' => '01012345678']],
]);
$sendgo->sms->sendLms([
'subject' => '[중요] 서비스 점검 안내',
'content' => "안녕하세요.\n\n서비스 점검이 예정되어 있습니다.",
'contacts' => [['contact' => '01012345678']],
]);
$sendgo->sms->sendMms([
'subject' => '[이벤트] 9월 특가',
'content' => '이번 달 특가 상품을 확인하세요!',
'contacts' => [['contact' => '01011111111'], ['contact' => '01022222222']],
]);
Laravel 에서는 app(Sendgo::class)->sms->sendSms([...]) 또는 생성자 주입으로 씁니다.
REST 직접 호출
curl -X POST https://sendgo.io/api/v2/messages/send \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-d '{
"campaignType": "MESSAGE",
"messageType": "SMS",
"scheduleType": "DIRECTLY",
"content": "인증번호: 123456",
"contacts": [{ "contact": "01012345678" }],
"senderKey": "your_sms_sender_key"
}'
messageType 을 LMS 나 MMS 로 바꾸면 해당 타입으로 나갑니다. LMS/MMS 는 subject 를 함께 보냅니다.
인증번호 발송 패턴
인증번호는 문자의 가장 흔한 용도입니다. 몇 가지 주의점이 있습니다.
// 인증번호는 서버에서 생성하고, 발송 실패를 사용자에게 알려야 한다.
const code = String(Math.floor(100000 + Math.random() * 900000));
await redis.setex(`verify:${phone}`, 300, code); // 5분 만료
try {
await sendgo.sms.sendSms({
content: `[서비스명] 인증번호: ${code} (5분 이내 입력)`,
contacts: [{ contact: phone }],
});
} catch (error) {
// 인증번호는 실패를 삼키면 안 된다 — 사용자가 오지 않는 문자를 기다린다.
throw new Error('인증번호 발송에 실패했습니다. 잠시 후 다시 시도해 주세요.');
}
- 발송 실패를 삼키지 마세요. 주문 알림과 달리 인증번호는 도착하지 않으면 사용자가 다음 단계로 갈 수 없습니다.
- 재발송에 제한을 거세요. 번호당 분당 횟수를 제한하지 않으면 문자 폭탄에 악용되고 크레딧이 소진됩니다.
- 본문에 서비스명을 넣으세요. 어디서 온 인증번호인지 모르면 사용자가 입력하지 않습니다.
광고 문자 규칙
홍보성 문자에는 정보통신망법이 적용됩니다.
(광고)[브랜드명] 가을 세일 최대 50%!
...
무료수신거부 080-000-0000
- 본문 맨 앞에
(광고)표기 - 무료 수신거부 번호 또는 방법 명시
- 21시 ~ 익일 08시 발송 금지
- 사전 수신동의를 받은 대상에게만
자세한 내용은 광고성 메시지 규칙에 있습니다. 인증번호·주문 알림 같은 정보성 문자에는 적용되지 않습니다.
다음 단계
자주 묻는 질문
- SMS 와 LMS 는 어떻게 구분되나요?
- 본문 길이입니다. SMS 는 90바이트(한글 약 45자) 이하의 단문이고, 넘으면 LMS(장문, 2,000바이트)를 써야 합니다. LMS 는 제목(subject)을 함께 보낼 수 있습니다. 요금도 다릅니다.
- 한글은 몇 바이트인가요?
- EUC-KR 기준 한글 한 글자가 2바이트, 영문·숫자가 1바이트입니다. 따라서 SMS 90바이트는 한글로 약 45자입니다. 줄바꿈도 바이트를 차지합니다.
- 알림톡 대신 문자를 써도 되나요?
- 됩니다. 문자는 템플릿 승인이 필요 없어 본문을 자유롭게 쓸 수 있습니다. 대신 알림톡보다 단가가 높고 도달 경험이 다릅니다. 정형화된 알림이 반복된다면 알림톡이, 일회성·자유 문안이라면 문자가 적합합니다.
- 광고 문자를 보낼 때 지켜야 할 게 있나요?
- 본문 맨 앞에 (광고) 표기, 무료 수신거부 번호 명시, 21시~익일 08시 발송 금지가 필수입니다. 정보통신망법 위반 시 과태료 대상입니다.