$ baro fork west-woo97/messages-mass-send맥 메시지 앱으로 100명 이하 개별 안내문자를 무료 발송 (iMessage/RCS 자동 라우팅) — 발송·검증 스크립트와 실측 함정 노트
맥 메시지(Messages) 앱으로 다수 수신자에게 개별 1:1 안내 문자를 무료로 발송하는 도구. 아이폰 수신자는 iMessage, 안드로이드 수신자는 RCS로 자동 라우팅된다 — 문자 요금 0원.
실전 검증: 62명 발송 62명 전달 성공 (iMessage 25 + RCS 37), 요금 0원.
| 경로 | 결과 |
|---|---|
SMS 계정 직접 발송 (participant of account id <SMS>) | ❌ error=4 — SMS 릴레이가 죽어 있으면 실패, 아이폰 문자전달 토글이 없는 환경도 있음 |
| iMessage 계정 강제 발송 | ⚠️ 아이폰 수신자만 성공, 안드로이드는 error=22 (미등록) |
chat id ("any;-;" & 번호) 발송 | ✅ Messages가 상대별로 iMessage/RCS 자동 라우팅 |
단, any;-; chat id는 기존 대화방이 있어야 동작한다. 그래서 2단계로 발송한다:
any;-; chat으로 재발송 → RCS로 전달verify.py)에는 Full Disk Access 필요 (~/Library/Messages/chat.db 읽기)# 1. 수신자 파일: 한 줄에 한 번호 (+8210XXXXXXXX 국제 형식)
# 2. 메시지 파일: 보낼 내용 전문 (UTF-8)
# 테스트 1건 발송 (첫 번째 번호에만) — 반드시 먼저 실행하고 수신 확인할 것
python3 scripts/send.py --recipients numbers.txt --message msg.txt --test
# 본 발송 (2초 간격, 2단계 자동)
python3 scripts/send.py --recipients numbers.txt --message msg.txt
# 전달 검증 — osascript "OK"는 성공 증거가 아니다. 반드시 chat.db로 확인
python3 scripts/verify.py --recipients numbers.txt
chat.db의 message.is_sent=1 · error=0 기준.sent=0 · error=0은 미확정 상태 — 몇 분 뒤 RCS · sent=1로 확정되는 경우가 흔하다.
sent=0이라고 바로 재발송하지 말고 몇 분 대기 후 재조회할 것.error=22는 iMessage 미등록(안드로이드) — 2단계 대상.any;-; chat 발송은 반드시 실패한다. 같은 명단에 재발송할 땐
처음부터 2단계(iMessage로 챗 재생성 → 실패분 RCS)로 갈 것. (59/60 실패로 실증)while read 셸 루프 = 마지막 항목 누락. 이 도구의
파이썬 스크립트는 해당 없음. 작업 후 전수 검증이 답이다.\| alternation 미지원 — 로그 추출은 awk로.공지 발송으로 대화 목록에 방이 수십 개 쌓인다. AppleScript delete chat은 미지원(-10000)이라
UI 자동화로만 지울 수 있는데, 오삭제 위험이 있어 이 패키지엔 포함하지 않았다. 지울 때는:
chat.db로 "이번 공지 발신만 있는 방"만 분류하고, 답장·기존 이력 있는 방은 보존수신에 동의한 대상(수강생 안내, 참가자 공지 등)에게만 사용할 것. 스팸·광고성 대량 발송은 정보통신망법 위반이며 이 도구의 용도가 아니다.