← 블로그 목록
가이드2026-05-21

한국 SMS/LMS/MMS API 완벽 가이드: Python으로 문자 보내기

한국 SMS/LMS/MMS API 완벽 가이드: Python으로 문자 보내기

ClawOps - AI 전화 에이전트 플랫폼

한국에서 문자를 API로 보내는 건 생각보다 복잡합니다.

해외에서는 Twilio로 SMS 한 줄이면 끝이지만, 한국은 사정이 다릅니다. SMS(단문), LMS(장문), MMS(멀티미디어)를 구분해야 하고, 발신번호 사전등록제를 지켜야 하고, 한글 인코딩 때문에 글자 수 계산도 다릅니다.

이 글에서는 한국 문자 발송의 기본부터, Python SDK로 SMS/LMS/MMS를 보내는 실전 코드까지 다룹니다.

SMS vs LMS vs MMS

한국은 문자 메시지를 세 종류로 구분합니다:

타입한글 기준바이트 기준특징
SMS (단문)~45자200byte 이하가장 저렴, 빠름
LMS (장문)~1,000자2,000byte 이하제목 포함 가능, 첨부 불가
MMS (멀티미디어)~1,000자2,000byte 이하이미지 최대 3장, 제목 포함

한글 1자 = 2바이트, 영문/숫자 1자 = 1바이트입니다.

"안녕하세요, 예약이 확인되었습니다." → 한글 15자 + 기호 3자 = 33바이트 → SMS로 충분합니다.

사전 준비

1. ClawOps 가입 및 번호 발급

ClawOps 대시보드에서 가입 후 070 번호를 발급받습니다. 이 번호가 문자 발신 번호가 됩니다.

2. SDK 설치

pip install clawops

3. 환경변수

export CLAWOPS_API_KEY="sk_live_..."
export CLAWOPS_ACCOUNT_ID="AC..."

SMS 발송 (단문)

가장 기본적인 단문 문자 발송입니다:

from clawops import ClawOps

client = ClawOps()

msg = client.messages.create(
    to="01012345678",
    from_="07052351234",  # 발급받은 070 번호
    body="안녕하세요, ClawOps입니다.",
)
print(f"Message ID: {msg.message_id}")
print(f"Status: {msg.status}")

body가 200바이트 이하이면 자동으로 SMS로 발송됩니다.

LMS 발송 (장문)

200바이트를 넘는 긴 문자를 보내려면 LMS를 사용합니다:

msg = client.messages.create(
    to="01012345678",
    from_="07052351234",
    body="""[강남내과의원] 김철수님 예약 안내

예약 일시: 2026년 5월 21일 (수) 오후 2시
진료 과목: 건강검진 (종합 패키지)
담당 의사: 이영희 원장

준비 사항:
- 8시간 이상 공복 유지
- 편한 복장 착용
- 신분증 지참

예약 변경/취소: 070-5235-1234
방문이 어려우시면 최소 전날까지 연락 부탁드립니다.""",
    type="mms",  # LMS/MMS는 type="mms"로 설정
    subject="예약 안내",
)

type="mms"를 지정하면 body 길이에 따라 LMS(이미지 없음) 또는 MMS(이미지 있음)로 자동 구분됩니다.

MMS 발송 (이미지 첨부)

이미지를 첨부할 수 있습니다:

msg = client.messages.create(
    to="01012345678",
    from_="07052351234",
    body="주문하신 상품이 발송되었습니다.",
    type="mms",
    subject="배송 알림",
    media_url=["https://my-server.com/delivery-photo.jpg"],
)
print(f"첨부 이미지: {msg.num_media}장")
print(f"Media URLs: {msg.media_url}")

이미지 제약:

  • 지원 형식: jpg, jpeg, png, bmp
  • 최대 용량: 장당 300KB 이하
  • 최대 개수: 3장

여러 이미지를 첨부하려면:

msg = client.messages.create(
    to="01012345678",
    from_="07052351234",
    body="현장 사진을 보내드립니다.",
    type="mms",
    subject="현장 사진",
    media_url=[
        "https://my-server.com/photo1.jpg",
        "https://my-server.com/photo2.jpg",
        "https://my-server.com/photo3.jpg",
    ],
)

대량 발송

여러 수신자에게 문자를 보내려면 반복문을 사용합니다:

from clawops import ClawOps
import time

client = ClawOps()

recipients = [
    {"name": "김철수", "phone": "01012345678", "time": "오후 2시"},
    {"name": "이영희", "phone": "01087654321", "time": "오후 3시"},
    {"name": "박민수", "phone": "01055556666", "time": "오후 4시"},
]

for r in recipients:
    msg = client.messages.create(
        to=r["phone"],
        from_="07052351234",
        body=f"[강남내과] {r['name']}님, 내일 {r['time']} 검진 예약 안내드립니다.",
    )
    print(f"{r['name']}: {msg.message_id} ({msg.status})")
    time.sleep(0.5)  # 발송 간격 준수

비동기 대량 발송

더 빠르게 보내려면 비동기 클라이언트를 사용합니다:

from clawops import AsyncClawOps
import asyncio

async def send_bulk():
    async with AsyncClawOps() as client:
        tasks = []
        for r in recipients:
            task = client.messages.create(
                to=r["phone"],
                from_="07052351234",
                body=f"[강남내과] {r['name']}님 검진 안내",
            )
            tasks.append(task)

        results = await asyncio.gather(*tasks)
        for msg in results:
            print(f"{msg.message_id}: {msg.status}")

asyncio.run(send_bulk())

발송 상태 조회

# 발송 내역 목록 조회
page = client.messages.list(type="sms", status="sent", page=0)
for msg in page.data:
    print(f"{msg.message_id} | {msg.to} | {msg.status}")

# 단건 조회
msg = client.messages.get("MSG1a2b3c4d5e")
print(f"To: {msg.to}")
print(f"Status: {msg.status}")
print(f"Type: {msg.type}")

수신 문자 처리 (웹훅)

고객이 070 번호로 문자를 보내면 웹훅으로 수신할 수 있습니다:

from fastapi import FastAPI, Request

app = FastAPI()

@app.post("/sms-received")
async def handle_incoming_sms(request: Request):
    data = await request.json()
    sender = data.get("from")
    body = data.get("body")

    print(f"수신: {sender}{body}")

    # 자동 응답 로직
    if "예약" in body:
        # 예약 확인 SMS 자동 발송
        from clawops import ClawOps
        client = ClawOps()
        client.messages.create(
            to=sender,
            from_="07052351234",
            body="예약 문의 감사합니다. 예약은 전화(070-5235-1234)로 접수 가능합니다.",
        )

    return {"status": "ok"}

웹훅 URL은 번호 설정에서 등록합니다:

client.numbers.update(
    "07052351234",
    webhook_url="https://my-server.com/sms-received",
)

AI 에이전트 + 문자 발송 조합

AI 전화 에이전트가 통화 후 문자로 내용을 정리해서 보내는 워크플로우:

from clawops import ClawOps
from clawops.agent import ClawOpsAgent, OpenAIRealtime
import asyncio

client = ClawOps()

agent = ClawOpsAgent(
    from_="07052351234",
    session=OpenAIRealtime(
        system_prompt="""식당 예약 안내원입니다. 예약을 받으면 다음 정보를 확인합니다:
- 이름, 날짜, 시간, 인원
통화가 끝나면 확인 문자를 발송한다고 안내합니다.""",
        voice="marin",
        language="ko",
    ),
)

asyncio.run(agent.serve())

통화 후 트랜스크립트를 분석해서 문자를 발송하는 로직은 웹훅으로 구현합니다. 통화 종료 이벤트를 수신하면 트랜스크립트에서 예약 정보를 추출하고 확인 문자를 보내는 방식입니다.

한국 문자 발송 시 주의사항

발신번호 사전등록제

한국 전기통신사업법 시행규칙에 따라 문자 발신 번호는 반드시 사전등록되어야 합니다. ClawOps에서 발급받은 070 번호는 자동으로 발신번호로 등록되므로 별도 절차가 필요 없습니다.

야간 발송 제한

정보통신망법에 따라 밤 9시~오전 8시에는 광고성 문자를 보낼 수 없습니다. 예약 확인 같은 정보성 문자는 해당되지 않습니다.

광고 문자 표기

광고성 문자는 반드시 (광고) 표기와 수신거부 방법을 포함해야 합니다:

msg = client.messages.create(
    to="01012345678",
    from_="07052351234",
    body="(광고) [강남내과] 5월 건강검진 20% 할인!\n무료 수신거부: 080-000-1234",
)

비용

항목Individual (월 19,000원)Business (월 99,000원)
SMS 포함량100건/월1,000건/월
SMS 추가건당 과금건당 과금
LMS 추가건당 과금건당 과금
MMS 추가건당 과금건당 과금

정확한 단가는 claw-ops.com/#pricing의 월 요금 계산기에서 확인하세요.

요약

작업코드
SMS 발송client.messages.create(to=, from_=, body=)
LMS 발송+ type="mms", subject=
MMS 발송+ media_url=[...]
발송 조회client.messages.list()
번호 발급client.numbers.create()

다음 단계


한국에서 문자 API, 이제 Python 한 줄이면 됩니다. 지금 시작하세요.

관련 글 더 보기

ClawOps AI 전화 API로 시작하기

070 번호 발급부터 AI 음성 통화까지, REST API 몇 줄이면 됩니다.