견적내용 장문이 들어 올시 문자가 단문으로 들어 오는데 작성한 내용 다 문자로 보내게 할수 있수 없는까요?
<?php
/**
* 무료 방문견적 게시판 관리자 SMS/LMS 자동 전환 발송 API
*/
header('Content-Type: application/json; charset=utf-8');
// 그누보드 공통 파일 경로 자동 탐색
$dir = __DIR__;
$loaded = false;
for ($i = 0; $i < 8; $i++) {
if (is_file($dir . '/common.php')) {
include_once($dir . '/common.php');
$loaded = true;
break;
}
$parent = dirname($dir);
if ($parent === $dir) {
break;
}
$dir = $parent;
}
if (!$loaded || !defined('_GNUBOARD_')) {
http_response_code(500);
echo json_encode(array('success' => false, 'message' => '그누보드 공통 파일을 불러오지 못했습니다.'), JSON_UNESCAPED_UNICODE);
exit;
}
if ($_SERVER['REQUEST_METHOD'] !== 'POST') {
http_response_code(405);
echo json_encode(array('success' => false, 'message' => 'POST 요청만 허용됩니다.'), JSON_UNESCAPED_UNICODE);
exit;
}
$allowed_bo_table = isset($_POST['bo_table']) ? preg_replace('/[^a-zA-Z0-9_]/', '', $_POST['bo_table']) : '';
if ($allowed_bo_table === '') {
http_response_code(400);
echo json_encode(array('success' => false, 'message' => '게시판 정보가 없습니다.'), JSON_UNESCAPED_UNICODE);
exit;
}
// 관리자 수신 번호 고정
$admin_phone = preg_replace('/[^0-9]/', '', '0100000000');
// 입력값 정제
$wr_subject = isset($_POST['wr_subject']) ? clean_xss_tags(trim($_POST['wr_subject'])) : '';
$wr_name = isset($_POST['wr_name']) ? clean_xss_tags(trim($_POST['wr_name'])) : '';
$wr_phone = isset($_POST['wr_phone']) ? preg_replace('/[^0-9]/', '', trim($_POST['wr_phone'])) : '';
$wr_service = isset($_POST['wr_2']) ? clean_xss_tags(trim($_POST['wr_2'])) : '';
$wr_date = isset($_POST['wr_3']) ? clean_xss_tags(trim($_POST['wr_3'])) : '';
$wr_from = isset($_POST['wr_4']) ? clean_xss_tags(trim($_POST['wr_4'])) : '';
$wr_to = isset($_POST['wr_5']) ? clean_xss_tags(trim($_POST['wr_5'])) : '';
$wr_content = isset($_POST['wr_content']) ? clean_xss_tags(trim($_POST['wr_content'])) : '';
if ($wr_name === '' || $wr_phone === '') {
http_response_code(400);
echo json_encode(array('success' => false, 'message' => '고객 성함 또는 연락처가 없습니다.'), JSON_UNESCAPED_UNICODE);
exit;
}
// 아이코드 설정 확인
if (empty($config['cf_icode_id']) || empty($config['cf_icode_pw']) || empty($config['cf_icode_server_ip']) || empty($config['cf_icode_server_port'])) {
http_response_code(500);
echo json_encode(array('success' => false, 'message' => '그누보드 관리자 아이코드 SMS 설정을 확인해주세요.'), JSON_UNESCAPED_UNICODE);
exit;
}
// 1. 발송할 문자 내용 구성
$msg_lines = array();
$msg_lines[] = "성함: " . $wr_name;
$msg_lines[] = "연락처: " . $wr_phone;
if ($wr_service !== '') $msg_lines[] = "서비스: " . $wr_service;
if ($wr_date !== '') $msg_lines[] = "일정: " . $wr_date;
if ($wr_from !== '') $msg_lines[] = "출발: " . $wr_from;
if ($wr_to !== '') $msg_lines[] = "도착: " . $wr_to;
if ($wr_content !== '') $msg_lines[] = "내용: " . $wr_content;
$sms_content = implode("\n", $msg_lines);
$send_number = !empty($config['cf_phone']) ? preg_replace('/[^0-9]/', '', $config['cf_phone']) : $admin_phone;
// 2. EUC-KR 변환 및 바이트 계산 (아이코드 규격 맞춤)
if (!function_exists('iconv')) {
http_response_code(500);
echo json_encode(array('success' => false, 'message' => '서버에서 iconv를 사용할 수 없습니다.'), JSON_UNESCAPED_UNICODE);
exit;
}
$sms_content_utf8 = mb_convert_encoding($sms_content, 'UTF-8', 'UTF-8');
$sms_msg_euc = @iconv('UTF-8', 'EUC-KR//TRANSLIT', $sms_content_utf8);
if ($sms_msg_euc === false) $sms_msg_euc = iconv('UTF-8', 'EUC-KR//IGNORE', $sms_content_utf8);
// 바이트 계산 (한글 2바이트, 영문/숫자/공백 1바이트 기준)
$msg_bytes = strlen($sms_msg_euc);
try {
include_once(G5_LIB_PATH . '/icode.sms.lib.php');
$SMS = new SMS;
$con_result = $SMS->SMS_con($config['cf_icode_server_ip'], $config['cf_icode_id'], $config['cf_icode_pw'], $config['cf_icode_server_port']);
if ($con_result === false || (isset($SMS->Result) && $SMS->Result < 0)) {
http_response_code(500);
echo json_encode(array('success' => false, 'message' => 'SMS 서버 연결에 실패했습니다.'), JSON_UNESCAPED_UNICODE);
exit;
}
// 80바이트 초과 시 LMS, 이하 시 SMS(단문) 자동 분기
if ($msg_bytes > 80) {
// LMS인 경우 제목 필수 지정
$sms_title = "[방문견적신청] " . $wr_name . "님 접수 안내";
$sms_title_euc = @iconv('UTF-8', 'EUC-KR//TRANSLIT', $sms_title);
if (method_exists($SMS, 'AddLMS')) {
$SMS->AddLMS($admin_phone, $send_number, $sms_title_euc, $sms_msg_euc, '');
} else {
// AddLMS 메서드가 없을 경우 기존 Add 사용 시 단문으로 짤릴 수 있음
$SMS->Add($admin_phone, $send_number, $config['cf_icode_id'], $sms_msg_euc, '');
}
$send_type = "LMS (장문)";
} else {
// 80바이트 이하 단문 SMS
$SMS->Add($admin_phone, $send_number, $config['cf_icode_id'], $sms_msg_euc, '');
$send_type = "SMS (단문)";
}
$send_result = $SMS->Send();
echo json_encode(array('success' => true, 'message' => $send_type . ' 전송 완료', 'bytes' => $msg_bytes, 'debug' => $send_result), JSON_UNESCAPED_UNICODE);
} catch (Exception $e) {
http_response_code(500);
echo json_encode(array('success' => false, 'message' => '발송 오류: ' . $e->getMessage()), JSON_UNESCAPED_UNICODE);
}
?> 해당 소스 적용시 장문 으로 작성해서 단문문자 크기만큼만 문자가 옵니다. 조언 좀 부탁 드립니다.
답변 8개
소스를 확인해 보니 장문으로 작성했는데 단문 길이만큼만 전송되는 원인이 될 만한 부분이 있습니다.
현재 코드에서 80바이트를 초과하면 LMS(장문)로 전송하도록 분기하고 있지만, 사용 중인 아이코드 라이브러리에 AddLMS() 함수가 없으면 기존 Add() 함수로 대체해서 발송하도록 되어 있습니다. 이 경우 단문으로 전송되면서 내용이 잘릴 수 있습니다.
우선 다음 사항을 확인해 보시는 것이 좋겠습니다.
-
/lib/icode.sms.lib.php파일에AddLMS()함수가 실제로 있는지 확인 -
사용 중인 아이코드 서비스가 LMS(장문 문자)를 지원하는지 확인
-
LMS 전송 시 제목과 본문이 정상적으로 전달되는지 확인
현재 소스는 장문과 단문을 구분하는 부분 자체는 들어가 있지만, 실제 LMS 발송 기능이 지원되지 않으면 정상적으로 장문이 전송되지 않습니다.
결론적으로 PHP 코드만 수정하기보다는 아이코드 라이브러리의 LMS 지원 여부부터 확인하는 것이 좋겠습니다.
원인은 이 코드가 단문 전용 라이브러리를 쓰고 있기 때문입니다. 그래서 장문으로 작성해도 80바이트에서 잘려 단문으로 나갑니다. 서버의 그누보드 아이코드 라이브러리 두 개를 열어 확인했습니다.
왜 단문으로 가는지
1. icode.sms.lib.php의 SMS 클래스는 단문 전용입니다
- 이 클래스의
Add()는 내용을 무조건 80바이트로 자릅니다. 토큰 방식이어도 90바이트에서 자릅니다.$msg=cut_char($msg,80); // 80자 제한 ← lib/icode.sms.lib.php 137줄
- 장문은 별도 파일 lib/icode.lms.lib.php의
LMS클래스로 보내야 합니다.
2. AddLMS()라는 메서드는 그누보드에 없습니다
method_exists($SMS, 'AddLMS')는 항상 false입니다. 그래서 80바이트가 넘어도 늘else쪽의 단문Add()로 빠집니다.- 결국 80바이트에서 잘린 단문이 나갑니다.
3. 접속 인자도 다릅니다
LMS클래스의SMS_con()네 번째 인자는 포트번호(7295)가 아닙니다. 요금제 코드(1 = 충전제, 2 = 정액제)이고,get_icode_port_type()으로 구합니다.Add()의 인자 개수와 순서도 다릅니다. 받는 번호는 배열로 넘기고, 제목·URL·발송 건수($nCount) 인자가 따로 있습니다.
4. SMS·LMS 분기는 직접 할 필요가 없습니다
LMS클래스가 90바이트 이하면 단문, 넘으면 장문으로 알아서 보냅니다(icode.lms.lib.php67줄).
고치는 방법
try { ... } 블록 안의 발송 부분을 아래처럼 바꾸면 됩니다. 위쪽의 입력값 정제와 문자 내용 구성 부분은 그대로 두면 됩니다.
try {
include_once(G5_LIB_PATH . '/icode.lms.lib.php');
// 요금제 구분(1:충전제 2:정액제, 토큰키면 1)
$port_setting = get_icode_port_type($config['cf_icode_id'], $config['cf_icode_pw']);
if ($port_setting === false) {
http_response_code(500);
echo json_encode(array('success' => false, 'message' => '아이코드 계정 정보를 확인해주세요.'), JSON_UNESCAPED_UNICODE);
exit;
}
$strDest = array($admin_phone); // 받는 번호는 배열
$strCallBack = $send_number; // 아이코드에 등록된 발신번호여야 함
$strCaller = iconv_euckr(trim($config['cf_title']));
$strSubject = iconv_euckr('방문견적 접수'); // 제목은 30바이트(한글 15자) 이내로 짧게
$strURL = '';
$strData = $sms_msg_euc; // 위에서 만든 EUC-KR 본문
$strDate = ''; // 즉시 발송
$nCount = count($strDest);
$SMS = new LMS;
$SMS->SMS_con($config['cf_icode_server_ip'], $config['cf_icode_id'], $config['cf_icode_pw'], $port_setting);
$res = $SMS->Add($strDest, $strCallBack, $strCaller, $strSubject, $strURL, $strData, $strDate, $nCount);
if ($res) {
$SMS->Send();
}
$send_result = $SMS->Result;
$SMS->Init();
$send_type = ($msg_bytes > 90) ? 'LMS (장문)' : 'SMS (단문)';
echo json_encode(array('success' => true, 'message' => $send_type . ' 전송 완료', 'bytes' => $msg_bytes, 'debug' => $send_result), JSON_UNESCAPED_UNICODE);
} catch (Exception $e) {
...
}
같이 확인할 것
- 관리자 설정: 기본환경설정에서 ‘SMS 전송유형'을 LMS로 해 두는 게 좋습니다. 위 코드는
LMS클래스를 직접 부르므로 이 설정과 상관없이 장문으로 나가지만, 그누보드 내장 알림을 장문으로 보내려면 이 설정이 필요합니다. - 설정 확인 조건: 아이코드 토큰키 방식이면 비밀번호가 비어 있을 수 있습니다. 그러면 위쪽
empty($config['cf_icode_pw'])검사에서 막힙니다. 토큰을 쓴다면 이 조건을 다음처럼 바꿔 주세요.if (empty($config['cf_icode_token_key']) && (empty($config['cf_icode_id']) || empty($config['cf_icode_pw']))) { - 발신번호:
$send_number가 아이코드에 등록되지 않은 번호면 발송이 실패합니다.cf_phone은 그누보드 기본 설정에 없는 필드라 비어 있을 가능성이 큽니다. 그러면 관리자 수신번호(0100000000)가 발신번호로 들어가니, 등록된 발신번호를 직접 넣는 걸 권장합니다. - 글자 수 한도: 장문 본문은 구버전(아이디/비번) 방식이면 1500바이트, 토큰 방식이면 2000바이트까지이고, 넘는 부분은 잘립니다. 상담 '내용'이 아주 길면 앞부분만 갈 수 있습니다.
설치본에도 LMS 클래스가 있는지 먼저 확인해 보세요. 공식 소스 기준으로 LMS::Add의 네 번째 인자가 제목, 다섯 번째가 URL, 여섯 번째가 본문입니다. 지금 SMS용 Add 호출과 순서가 달라 클래스명만 교체하면 본문이 엉뚱한 자리에 들어갑니다. 연결할 때도 설치본의 get_icode_port_type과 SMS_con 사용 방식을 맞추셔야 합니다. 테스트 번호로 끝에 ‘본문끝’ 표시를 붙인 긴 문자를 한 건 보내서 아이코드 접수 내역과 휴대폰 끝부분을 같이 확인해 보시면 됩니다.
공식 구현: https://github.com/gnuboard/gnuboard5/blob/master/lib/icode.lms.lib.php
올려주신 코드에는 실제 발송 방식과 성공 안내가 달라질 수 있는 부분도 있습니다. 장문 분기에서 AddLMS가 없어 Add로 내려가도, 그 아래에서 $send_type을 무조건 "LMS (장문)"으로 지정하고 마지막에는 success를 항상 true로 반환합니다. 화면에 장문 전송 완료가 떠도 LMS로 접수됐다는 근거가 되지 않습니다.
긴 내용을 단문으로 조용히 보내지 않도록, AddLMS가 없는 경우에는 Send 호출 전에 오류로 종료하는 편이 좋겠습니다. 기존 method_exists의 else 블록을 다음처럼 바꾸면 원인 확인 중 잘린 문자가 발송되는 것을 막을 수 있습니다.
http_response_code(500);
echo json_encode(array(
"success" => false,
"message" => "현재 문자 라이브러리는 이 코드에서 요구하는 LMS 발송 메서드를 지원하지 않습니다."
), JSON_UNESCAPED_UNICODE);
exit;
이것은 장문 지원을 추가하는 코드가 아니라, 장문 지원이 안 되는 상태를 명확하게 알리는 보완입니다. 실제 장문 전송은 사용 중인 아이코드 라이브러리의 공식 LMS 예제에 맞춰 연결·접수 인자까지 확인해야 합니다. 이름이 같은 메서드만 추가하거나 분기 기준만 바꾸면 해결되지 않을 수 있습니다.
마지막 success도 Send의 반환 규약과 수신번호별 접수 결과를 확인한 뒤 결정해 주세요. 서버 접수와 휴대폰 실제 수신은 별개이며, 응답에 요청자 이름·연락처나 계정정보를 그대로 출력하지 않는 편이 좋습니다. 원문 코드 기준의 검토이며 해당 서버에서 발송 테스트를 한 것은 아닙니다.
PHP method_exists 공식 설명: https://www.php.net/manual/en/function.method-exists.php
if (method_exists($SMS, 'AddLMS')) { // 항상 false
$SMS->AddLMS(...);
} else {
$SMS->Add(...); // 여기로 떨어짐
}
$msg = cut_char($msg, 80); // 80자 제한
답변을 작성하려면 로그인이 필요합니다.