sendgo-python 1.0.1__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,428 @@
1
+ Metadata-Version: 2.4
2
+ Name: sendgo-python
3
+ Version: 1.0.1
4
+ Summary: Sendgo Python SDK — 카카오 알림톡/친구톡, SMS/LMS/MMS
5
+ Author-email: Sendgo <dev@sendgo.io>
6
+ License: MIT
7
+ Project-URL: Homepage, https://sendgo.io
8
+ Project-URL: Repository, https://github.com/sendgo-dev/sendgo-python
9
+ Keywords: sendgo,kakao,alimtalk,sms,notification,korea
10
+ Classifier: Development Status :: 5 - Production/Stable
11
+ Classifier: Intended Audience :: Developers
12
+ Classifier: License :: OSI Approved :: MIT License
13
+ Classifier: Programming Language :: Python :: 3
14
+ Classifier: Programming Language :: Python :: 3.10
15
+ Classifier: Programming Language :: Python :: 3.11
16
+ Classifier: Programming Language :: Python :: 3.12
17
+ Requires-Python: >=3.10
18
+ Description-Content-Type: text/markdown
19
+ Requires-Dist: requests>=2.28.0
20
+ Provides-Extra: dev
21
+ Requires-Dist: pytest>=8.0; extra == "dev"
22
+ Requires-Dist: pytest-mock>=3.12; extra == "dev"
23
+ Requires-Dist: mypy>=1.9; extra == "dev"
24
+ Requires-Dist: ruff>=0.4; extra == "dev"
25
+ Provides-Extra: async
26
+ Requires-Dist: httpx>=0.27; extra == "async"
27
+
28
+ # sendgo-python
29
+
30
+ > **Python / Django / FastAPI에서 카카오 알림톡, 친구톡, SMS를 가장 쉽게 발송하는 SDK**
31
+
32
+ [![PyPI version](https://img.shields.io/pypi/v/sendgo-python?logo=pypi)](https://pypi.org/project/sendgo-python/)
33
+ [![Python](https://img.shields.io/badge/Python-3.10%2B-3776AB?logo=python)](https://python.org)
34
+ [![Downloads](https://img.shields.io/pypi/dm/python)](https://pypi.org/project/sendgo-python/)
35
+ [![License](https://img.shields.io/badge/license-MIT-blue)](LICENSE)
36
+
37
+ `sendgo-python`은 [Sendgo](https://sendgo.io) 알림 API를 위한 공식 Python SDK입니다.
38
+ **`requests` 하나만 의존하며**, 완전한 타입 힌트(Type Hints)를 제공합니다.
39
+ Django, FastAPI, Flask, Celery 등 모든 Python 환경에서 사용할 수 있습니다.
40
+
41
+ ---
42
+
43
+ ## 목차
44
+
45
+ - [Sendgo란?](#sendgo란)
46
+ - [주요 기능](#주요-기능)
47
+ - [설치](#설치)
48
+ - [빠른 시작](#빠른-시작)
49
+ - [상세 사용법](#상세-사용법)
50
+ - [카카오 알림톡](#카카오-알림톡)
51
+ - [카카오 친구톡](#카카오-친구톡)
52
+ - [SMS / LMS / MMS](#sms--lms--mms)
53
+ - [프레임워크 통합](#프레임워크-통합)
54
+ - [Django](#django)
55
+ - [FastAPI](#fastapi)
56
+ - [Celery 비동기 발송](#celery-비동기-발송)
57
+ - [예외 처리](#예외-처리)
58
+ - [설정 옵션](#설정-옵션)
59
+ - [자주 묻는 질문](#자주-묻는-질문-faq)
60
+ - [관련 패키지](#관련-패키지)
61
+
62
+ ---
63
+
64
+ ## Sendgo란?
65
+
66
+ [Sendgo](https://sendgo.io)는 대한민국 기업과 개발자를 위한 **통합 알림 발송 플랫폼**입니다.
67
+
68
+ - **카카오 알림톡**: 카카오톡 채널을 통한 정보성 메시지 (주문 확인, 배송 안내, 예약 확인 등)
69
+ - **카카오 친구톡**: 마케팅/이벤트 메시지 (쿠폰, 프로모션 등)
70
+ - **SMS / LMS / MMS**: 전통적인 문자 메시지
71
+ - **자동 대체 발송**: 알림톡 실패 시 SMS로 자동 전환
72
+
73
+ ---
74
+
75
+ ## 주요 기능
76
+
77
+ | 기능 | 설명 |
78
+ |------|------|
79
+ | **최소 의존성** | `requests` 하나만 필요 |
80
+ | **완전한 타입 힌트** | 모든 파라미터와 반환값에 타입 정의 |
81
+ | **스레드 안전 토큰 관리** | `threading.Lock` 기반, 멀티스레드 환경 안전 |
82
+ | **토큰 자동 캐싱(50분)** | 매 요청마다 토큰을 발급하지 않음 |
83
+ | **401/403 자동 재시도** | 토큰 만료 시 자동 갱신 후 재발송 |
84
+ | **다건 동시 발송** | 수신자 리스트로 대량 발송 |
85
+ | **예약 발송** | 원하는 시각에 발송 예약 |
86
+ | **SMS 자동 대체 발송** | 알림톡 실패 시 SMS로 자동 전환 |
87
+ | **v1 / v2 API 지원** | 설정 한 줄로 버전 전환 |
88
+
89
+ ---
90
+
91
+ ## 설치
92
+
93
+ ```bash
94
+ pip install sendgo-python
95
+ ```
96
+
97
+ 또는 `pyproject.toml`:
98
+ ```toml
99
+ [project]
100
+ dependencies = ["sendgo-python>=1.0.0"]
101
+ ```
102
+
103
+ ---
104
+
105
+ ## 빠른 시작
106
+
107
+ ### 1단계 — 환경변수 설정
108
+
109
+ ```bash
110
+ # .env
111
+ SENDGO_ACCESS_KEY=your_access_key
112
+ SENDGO_SECRET_KEY=your_secret_key
113
+ SENDGO_KAKAO_SENDER_KEY=your_kakao_key
114
+ SENDGO_SMS_SENDER_KEY=your_sms_key
115
+ SENDGO_API_VERSION=v2
116
+ ```
117
+
118
+ ### 2단계 — 클라이언트 초기화
119
+
120
+ ```python
121
+ import os
122
+ from sendgo import Sendgo
123
+
124
+ client = Sendgo(
125
+ access_key=os.environ["SENDGO_ACCESS_KEY"],
126
+ secret_key=os.environ["SENDGO_SECRET_KEY"],
127
+ kakao_sender_key=os.environ.get("SENDGO_KAKAO_SENDER_KEY"),
128
+ sms_sender_key=os.environ.get("SENDGO_SMS_SENDER_KEY"),
129
+ api_version="v2",
130
+ )
131
+ ```
132
+
133
+ ### 3단계 — 알림톡 전송
134
+
135
+ ```python
136
+ client.alimtalk.send(
137
+ template_code="ORDER_CONFIRM_001",
138
+ contacts=[
139
+ {
140
+ "contact": "01012345678", # 수신자 전화번호 (필수)
141
+ "name": "홍길동", # 수신자 이름 (선택)
142
+ "var1": "ORD-20260723-001", # 템플릿 변수 #{var1}
143
+ "var2": "스프링 부트 가이드", # 템플릿 변수 #{var2}
144
+ "var3": "29,000원", # 템플릿 변수 #{var3}
145
+ }
146
+ ],
147
+ )
148
+ ```
149
+
150
+ ---
151
+
152
+ ## 상세 사용법
153
+
154
+ ### 카카오 알림톡
155
+
156
+ ```python
157
+ # 다건 발송
158
+ client.alimtalk.send(
159
+ template_code="ORDER_CONFIRM_001",
160
+ contacts=[
161
+ {"contact": "01011111111", "name": "홍길동", "var1": "ORD-001"},
162
+ {"contact": "01022222222", "name": "김철수", "var1": "ORD-002"},
163
+ {"contact": "01033333333", "name": "이영희", "var1": "ORD-003"},
164
+ ],
165
+ )
166
+
167
+ # 예약 발송
168
+ client.alimtalk.send(
169
+ template_code="PROMO_SUMMER_2026",
170
+ schedule_type="SCHEDULED",
171
+ at="2026-07-28 09:00:00",
172
+ contacts=[{"contact": "01012345678", "var1": "여름 한정 50% 할인"}],
173
+ )
174
+
175
+ # 알림톡 실패 시 SMS 자동 대체 발송
176
+ client.alimtalk.send(
177
+ template_code="DELIVERY_START_001",
178
+ contacts=[{"contact": "01012345678", "var1": "ORD-001", "var2": "1234567890"}],
179
+ replace_sms="Y",
180
+ sms_subject="[배송 시작 안내]",
181
+ sms_content="주문하신 상품이 출고되었습니다.\n송장번호: #{var2}",
182
+ )
183
+ ```
184
+
185
+ ### 카카오 친구톡
186
+
187
+ ```python
188
+ # 텍스트형
189
+ client.friendtalk.send(
190
+ content="안녕하세요! 7월 한정 특가 이벤트를 확인해보세요.",
191
+ contacts=[{"contact": "01012345678"}],
192
+ )
193
+
194
+ # 이미지형
195
+ client.friendtalk.send(
196
+ message_type="FI",
197
+ content="이번 주 특가 상품을 확인하세요!",
198
+ image_url="https://cdn.example.com/banner.jpg",
199
+ image_link="https://example.com/event",
200
+ contacts=[{"contact": "01012345678"}],
201
+ )
202
+ ```
203
+
204
+ ### SMS / LMS / MMS
205
+
206
+ ```python
207
+ # SMS
208
+ client.sms.send_sms(
209
+ content="[Sendgo] 인증번호: 123456 (5분 이내 입력)",
210
+ contacts=[{"contact": "01012345678"}],
211
+ )
212
+
213
+ # LMS — 장문 (2,000자 이하)
214
+ client.sms.send_lms(
215
+ subject="[중요] 서비스 점검 안내",
216
+ content="""안녕하세요. 서비스 점검이 예정되어 있습니다.
217
+
218
+ ■ 점검 일시: 2026-07-25 02:00 ~ 06:00
219
+ ■ 영향 범위: 전체 서비스
220
+
221
+ 이용에 불편을 드려 죄송합니다.""",
222
+ contacts=[{"contact": "01012345678"}],
223
+ )
224
+
225
+ # MMS — 이미지 포함
226
+ client.sms.send_mms(
227
+ subject="[이벤트] 7월 특가",
228
+ content="이번 달 특가 상품을 확인하세요!",
229
+ contacts=[{"contact": "01012345678"}],
230
+ )
231
+ ```
232
+
233
+ ---
234
+
235
+ ## 프레임워크 통합
236
+
237
+ ### Django
238
+
239
+ ```python
240
+ # settings.py
241
+ SENDGO = {
242
+ "access_key": env("SENDGO_ACCESS_KEY"),
243
+ "secret_key": env("SENDGO_SECRET_KEY"),
244
+ "kakao_sender_key": env("SENDGO_KAKAO_SENDER_KEY", default=None),
245
+ "sms_sender_key": env("SENDGO_SMS_SENDER_KEY", default=None),
246
+ "api_version": env("SENDGO_API_VERSION", default="v2"),
247
+ }
248
+ ```
249
+
250
+ ```python
251
+ # apps/notifications/services.py
252
+ from django.conf import settings
253
+ from sendgo import Sendgo
254
+
255
+ _sendgo: Sendgo | None = None
256
+
257
+ def get_sendgo() -> Sendgo:
258
+ global _sendgo
259
+ if _sendgo is None:
260
+ _sendgo = Sendgo(**settings.SENDGO)
261
+ return _sendgo
262
+
263
+ def send_order_confirm(phone: str, order_number: str) -> None:
264
+ get_sendgo().alimtalk.send(
265
+ template_code="ORDER_CONFIRM_001",
266
+ contacts=[{"contact": phone, "var1": order_number}],
267
+ )
268
+ ```
269
+
270
+ ```python
271
+ # apps/orders/signals.py
272
+ from django.db.models.signals import post_save
273
+ from django.dispatch import receiver
274
+ from .models import Order
275
+ from apps.notifications.services import send_order_confirm
276
+
277
+ @receiver(post_save, sender=Order)
278
+ def on_order_created(sender, instance, created, **kwargs):
279
+ if created:
280
+ send_order_confirm(instance.user.phone, instance.number)
281
+ ```
282
+
283
+ ### FastAPI
284
+
285
+ ```python
286
+ # core/sendgo.py
287
+ from functools import lru_cache
288
+ from sendgo import Sendgo
289
+ from .config import settings
290
+
291
+ @lru_cache
292
+ def get_sendgo() -> Sendgo:
293
+ return Sendgo(
294
+ access_key=settings.SENDGO_ACCESS_KEY,
295
+ secret_key=settings.SENDGO_SECRET_KEY,
296
+ kakao_sender_key=settings.SENDGO_KAKAO_SENDER_KEY,
297
+ api_version="v2",
298
+ )
299
+ ```
300
+
301
+ ```python
302
+ # routers/notify.py
303
+ from fastapi import APIRouter, Depends
304
+ from sendgo import Sendgo
305
+ from core.sendgo import get_sendgo
306
+
307
+ router = APIRouter(prefix="/api")
308
+
309
+ @router.post("/notify/order")
310
+ async def notify_order(
311
+ phone: str,
312
+ order_number: str,
313
+ sendgo: Sendgo = Depends(get_sendgo),
314
+ ):
315
+ sendgo.alimtalk.send(
316
+ template_code="ORDER_CONFIRM_001",
317
+ contacts=[{"contact": phone, "var1": order_number}],
318
+ )
319
+ return {"success": True}
320
+ ```
321
+
322
+ ### Celery 비동기 발송
323
+
324
+ ```python
325
+ # tasks/notifications.py
326
+ from celery import shared_task
327
+ from sendgo import Sendgo, SendgoError
328
+ import logging
329
+
330
+ logger = logging.getLogger(__name__)
331
+
332
+ @shared_task(bind=True, max_retries=3, default_retry_delay=10)
333
+ def send_alimtalk_task(self, template_code: str, contacts: list[dict]) -> None:
334
+ """카카오 알림톡 비동기 발송 Celery 태스크"""
335
+ sendgo = Sendgo(
336
+ access_key=settings.SENDGO_ACCESS_KEY,
337
+ secret_key=settings.SENDGO_SECRET_KEY,
338
+ kakao_sender_key=settings.SENDGO_KAKAO_SENDER_KEY,
339
+ )
340
+ try:
341
+ sendgo.alimtalk.send(template_code=template_code, contacts=contacts)
342
+ except SendgoError as e:
343
+ logger.error("알림톡 발송 실패: %s [%s]", e, e.error_code)
344
+ if e.error_code not in ("INVALID_TEMPLATE_CODE", "PAYMENT_REQUIRED"):
345
+ raise self.retry(exc=e)
346
+ ```
347
+
348
+ ```python
349
+ # 사용
350
+ send_alimtalk_task.delay("ORDER_CONFIRM_001", [{"contact": "01012345678", "var1": "ORD-001"}])
351
+ ```
352
+
353
+ ---
354
+
355
+ ## 예외 처리
356
+
357
+ ```python
358
+ from sendgo import SendgoError
359
+
360
+ try:
361
+ client.alimtalk.send(
362
+ template_code="ORDER_CONFIRM_001",
363
+ contacts=[{"contact": "01012345678"}],
364
+ )
365
+ except SendgoError as e:
366
+ print(f"발송 실패: HTTP {e.status_code} [{e.error_code}]")
367
+ print(f"엔드포인트: {e.endpoint}, API 버전: {e.api_version}")
368
+
369
+ match e.error_code:
370
+ case "INVALID_ACCESS_KEY" | "INVALID_SECRET_KEY":
371
+ alert_ops("Sendgo 인증키를 확인하세요.")
372
+ case "INVALID_TEMPLATE_CODE":
373
+ logger.warning("존재하지 않는 템플릿: %s", template_code)
374
+ case "PAYMENT_REQUIRED":
375
+ alert_ops("Sendgo 크레딧이 부족합니다.")
376
+ case "IP_NOT_ALLOWED":
377
+ alert_ops("허용되지 않은 IP에서 요청이 발생했습니다.")
378
+ ```
379
+
380
+ ---
381
+
382
+ ## 설정 옵션
383
+
384
+ | 파라미터 | 타입 | 필수 | 기본값 | 설명 |
385
+ |---------|------|------|--------|------|
386
+ | `access_key` | `str` | **필수** | — | Sendgo 액세스 키 |
387
+ | `secret_key` | `str` | **필수** | — | Sendgo 시크릿 키 |
388
+ | `kakao_sender_key` | `str \| None` | 선택 | `None` | 카카오 발신프로필 키 |
389
+ | `sms_sender_key` | `str \| None` | 선택 | `None` | SMS 발신자 키 |
390
+ | `api_version` | `str` | 선택 | `'v1'` | API 버전 (`v1` \| `v2`) |
391
+ | `base_url` | `str` | 선택 | `'https://sendgo.io'` | API 기본 URL |
392
+
393
+ ---
394
+
395
+ ## 자주 묻는 질문 (FAQ)
396
+
397
+ **Q. 비동기(async/await)를 지원하나요?**
398
+ A. 현재 버전은 동기(`requests` 기반)만 지원합니다. FastAPI 등 비동기 환경에서는 `asyncio.get_event_loop().run_in_executor()`로 스레드풀에서 실행하거나, Celery 태스크로 위임하는 방법을 권장합니다. 비동기 버전(`httpx` 기반)은 향후 추가될 예정입니다.
399
+
400
+ **Q. 멀티스레드 환경에서 안전한가요?**
401
+ A. 토큰 관리에 `threading.Lock`을 사용하여 멀티스레드 환경에서도 안전합니다.
402
+
403
+ **Q. 알림톡 템플릿은 어디서 등록하나요?**
404
+ A. [Sendgo 콘솔](https://sendgo.io) → 알림톡 템플릿 → 템플릿 작성 → 카카오 심사 신청 (보통 1~3일 소요)
405
+
406
+ **Q. 대량 발송 시 rate limit이 있나요?**
407
+ A. Sendgo 플랜별로 TPS 제한이 있습니다. [요금 정책](https://sendgo.io/pricing) 참조.
408
+
409
+ ---
410
+
411
+ ## 관련 패키지
412
+
413
+ | 언어/프레임워크 | 패키지 | GitHub |
414
+ |----------------|--------|--------|
415
+ | Spring Boot | `io.sendgo:sendgo-spring` | [sendgo-spring-boot-starter](https://github.com/send-go/spring) |
416
+ | Node.js | `@sendgo/node` | [sendgo-node](https://github.com/send-go/node) |
417
+ | Go | `github.com/send-go/go` | [sendgo-go](https://github.com/send-go/go) |
418
+ | 전체 목록 | — | [send-go GitHub 조직](https://github.com/send-go) |
419
+
420
+ ---
421
+
422
+ ## 라이선스
423
+
424
+ MIT License © 2026 [Sendgo](https://sendgo.io)
425
+
426
+ ---
427
+
428
+ *키워드: 카카오 알림톡 Python, 카카오 친구톡 Django, SMS 발송 FastAPI, 알림톡 SDK pip, Python 카카오 API 연동, Django 문자 발송, FastAPI 알림톡, Celery 알림톡 비동기, Sendgo Python SDK*