| multiSendMail |
본 라이브러리는 PHP로 제작되었으며 SMTP 방식을 기준으로 메일 발송을 도와주는 프로그램으로 설정에 따라 PHP 기본 mail() 함수도 함께 지원됩니다.
초기에 smtpSendMail 라이브러리로 시작하였으나 해당 라이브러리가 오래되다 보니 버전을 업데이트해도 간헐적인 문제가 있었고, 기존 소스를 유지하는 조건하에 개발하다 보니 어려움이 많아 기능을 추가하여 새로운 메일 발송 프로그램으로 다시 개발하게 되었습니다.
다만 다른 곳에서 제공되는 PHP 메일발송 프로그램처럼 수많은 환경을 전부 체크할 수는 없어, 최소한의 환경을 기준으로 커스텀하여 사용하기 위한 목적으로 만든 프로그램이다 보니 부족한 부분이 많습니다.
전문적인 PHP 라이브러리가 필요하시다면 하단에 게시된 PHPMailer 라이브러리를 사용해 주시기 바랍니다.
| 라이브러리 다운로드 (2.0 최신버전) |
| 변경사항) 2026-07-01 1) 비동기 소켓통신 데이터 포맷을 unserialize() -> JSON 으로 변경 (PHP Object Injection / RCE 취약점 패치) 2) viewConfig() 에서 smtp.password 등 민감정보 마스킹 처리 3) SMTP TLS 연결 시 인증서 검증 옵션 추가 (MITM 방지) 4) $_SERVER['HTTP_HOST'] 직접참조 제거 -> CLI(cron) 환경에서도 동작 5) Message-ID 생성 시 mt_rand() -> random_int() (예측 가능성 차단) 6) async.encrypt 기본값 md5 -> sha256 7) PHP 8.x 호환성 보정 (동적 프로퍼티 / 배열 접근 경고 제거) |
신규 버전에 문제가 있으셨거나 기존 환경 호환이 필요하신 경우)
| 라이브러리 다운로드 (1.0 이전버전) |
multiSendMail 특징
- multiSendMail은 지원되는 기능이 적은 대신 심플하게 작성되어 커스텀하기 용이합니다.
- SMTP 인증 방식으로 메일을 발송하면 PHP 기본 메일 함수로 발송했을 때보다 수신률이 높지만, 속도 면에서는 생각보다 빠르지 않습니다.
- 이러한 SMTP 인증 방식의 속도를 보완하고자 비동기 소켓통신 기능을 추가하여, 발송 응답 수신 여부와 상관없이 발송 처리를 진행할 수 있습니다.
- PHP 기본 메일 함수도 지원되어 SMTP와 동일한 방식으로 사용할 수 있습니다.
- 다른 라이브러리에 비해 쉽게 접근하고 쉽게 사용할 수 있다는 큰 장점이 있습니다.
- PHP 7 이상에서 개발되어 안정적으로 사용 가능하며, 2.0부터는 PHP 8 환경 호환성도 보강되었습니다.
- 받는이, 참조, 숨은참조는 멀티 지정이 가능하여 손쉽게 설정해 보낼 수 있습니다.
- 파일첨부 또한 멀티로 지원됩니다.
저작권
해당 프로그램의 라이선스는 REDINFO 그룹에 있으나, 파일 소스코드 상단에 포함된 제작자 정보 주석을 삭제하지 않는 조건으로 수정 및 재배포가 가능합니다.
개발자가 만든 소스코드에 제작자 표기가 없으면, 수고를 들여 만든 개발자의 노력이 무의미해지기 마련입니다. 소스를 가져다 쓰는 것은 자유지만, 많은 시간을 투자해 만든 개발자를 배려하는 차원에서 제작자 정보가 포함된 주석은 남겨두셨으면 합니다.
사용예제
본 라이브러리를 다운로드하고 실행하는 방법은 아래와 같습니다.
SMTP를 이용한 예제 (DAUM 설정 시)
<?php
use multiSendMailmultiSendMail;
require "/경로/multiSendMail.php";
/* multiSendMail 라이브러리 초기화 */
$msm = new multiSendMail();
/* 기본설정 */
$msm->setConfig('module','smtp'); // 모듈을 지정합니다. smtp 또는 phpmail
$msm->setConfig('smtp.host','smtp.daum.net'); // 호스트를 지정합니다.
$msm->setConfig('smtp.username','계정아이디'); // 계정 아이디를 지정합니다.
$msm->setConfig('smtp.password','계정비밀번호'); // 계정 비밀번호를 지정합니다. (2단계 계정보호가 있을 경우 별도 설정 필요)
$msm->setConfig('smtp.port',465); // 다음의 기본 SMTP 포트는 465
/* 옵션 */
$msm->setOption('from','보낸사람@이메일','보내는이이름'); // 보내는이 이메일과 이름을 설정합니다.
$msm->setOption('to','받는사람@이메일','받는이이름'); // 받는이 이메일과 이름을 설정합니다.
$msm->setOption('cc','참조@이메일','참조이름'); // 참조 이메일과 이름을 설정합니다.
$msm->setOption('bcc','숨은참조@이메일','숨은참조이름'); // 숨은참조 이메일과 이름을 설정합니다.
$msm->setOption('subject','제목'); // 제목을 설정합니다.
$msm->setOption('body','내용'); // 내용을 설정합니다.
/* 첨부파일 */
$msm->setAttach('/enfile.zip','enfile.zip'); // 첨부파일을 설정합니다. (경로, 파일명, 파일컨텐츠타입[생략가능])
/* 메일발송 */
$result = $msm->sendmail();
/* 결과출력 */
if( $result !== true){
echo '전송 실패!';
}
else{
echo '전송 성공!';
}
PHP 기본 메일 함수를 이용하여 보낼 때
<?php
use multiSendMailmultiSendMail;
require "/경로/multiSendMail.php";
/* multiSendMail 라이브러리 초기화 */
$msm = new multiSendMail();
/* 기본설정 */
$msm->setConfig('module','phpmail'); // 모듈을 지정합니다. smtp 또는 phpmail
/* 옵션 */
$msm->setOption('from','보낸사람@이메일','보내는이이름'); // 보내는이 이메일과 이름을 설정합니다.
$msm->setOption('to','받는사람@이메일','받는이이름'); // 받는이 이메일과 이름을 설정합니다.
$msm->setOption('cc','참조@이메일','참조이름'); // 참조 이메일과 이름을 설정합니다.
$msm->setOption('bcc','숨은참조@이메일','숨은참조이름'); // 숨은참조 이메일과 이름을 설정합니다.
$msm->setOption('subject','제목'); // 제목을 설정합니다.
$msm->setOption('body','내용'); // 내용을 설정합니다.
/* 첨부파일 */
$msm->setAttach('/enfile.zip','enfile.zip'); // 첨부파일을 설정합니다. (경로, 파일명, 파일컨텐츠타입[생략가능])
/* 메일발송 */
$result = $msm->sendmail();
/* 결과출력 */
if( $result !== true){
echo '전송 실패!';
}
else{
echo '전송 성공!';
}
메일발송이 실패했을 때 자세한 내용을 확인하고 싶다면 아래 옵션을 사용해 보세요.
$msm->setConfig('debug',1); // 1로 설정 시 중간에 오류가 발생할 경우 디버깅 내용을 확인할 수 있습니다.
$msm->setConfig('msg',1); // 1로 설정 시 전송 과정을 시간대별로 볼 수 있습니다.
한 번에 여러 명에게 발송이 필요하신가요? 그렇다면 아래와 같이 설정을 계속 추가하기만 하면 됩니다. (참조, 숨은참조 발송도 동일합니다.)
$msm->setOption('to','받는사람@이메일','받는이이름'); // 받는이 이메일과 이름을 설정합니다.
$msm->setOption('to','받는사람2@이메일','받는이이름2'); // 받는이 이메일과 이름을 설정합니다.
$msm->setOption('to','받는사람3@이메일','받는이이름3'); // 받는이 이메일과 이름을 설정합니다.
첨부파일도 멀티 방식이 지원되어 아래와 같이 설정을 계속 추가하기만 하면 됩니다.
$msm->setAttach('/enfile.zip','enfile.zip'); // 첨부파일을 설정합니다. (경로, 파일명, 파일컨텐츠타입[생략가능])
$msm->setAttach('/enfile.zip2','enfile.zip2'); // 첨부파일을 설정합니다. (경로, 파일명, 파일컨텐츠타입[생략가능])
$msm->setAttach('/enfile.zip3','enfile.zip3'); // 첨부파일을 설정합니다. (경로, 파일명, 파일컨텐츠타입[생략가능])
첨부파일을 전송할 때 한글 파일명을 찾을 수 없다는 오류가 발생하시나요? 그렇다면 아래와 같이 설정해 보세요.
// 한글파일명 보정: 서버 언어셋이 UTF-8이고 파일명이 한글이라면
$msm->setAttach(@iconv("UTF-8","EUC-KR",'/파일경로/한글파일.txt'),'한글파일.txt');
SMTP 전송 시 속도가 저하되어 불편할 수 있습니다. 이를 보완하기 위한 기능이 비동기 소켓통신 옵션이며, 아래와 같이 사용할 수 있습니다. (서버 환경에 따라 동작하지 않을 수 있으니 주의해 주세요!)
$msm->setConfig('async.use',1); // 1로 설정 시 비동기 소켓통신으로 전송 (기본 0: 미사용)
$msm->setConfig('async.url','목적지URL'); // 비동기 소켓통신으로 전송할 URL 설정 (목적지 URL에서는 별도 처리 프로그램 필요)
$msm->setConfig('async.key','multiSendMail'); // (필수) 보안을 위한 키값 (기본: multiSendMail)
$msm->setConfig('async.encrypt','sha256'); // (필수) 키값 암호화 시 사용될 해시 방식 (기본: sha256, 2.0부터 md5에서 변경)
비동기 소켓통신 설정이 완료되면, 목적지URL 페이지는 아래 예제처럼 작성해 주세요.
<?php
use multiSendMailmultiSendMail;
require "/경로/multiSendMail.php";
ob_start();
/* multiSendMail 라이브러리 초기화 */
$msm = new multiSendMail();
/* 비동기 소켓통신 목적지에서는 별도의 설정이 필요없음 */
$rst = $msm->sendmail();
/* 내용을 변수에 저장 */
$debug = ob_get_clean();
$debug = strip_tags(htmlspecialchars_decode($debug));
/* 하단은 로그 파일저장이 필요할 경우 사용 */
$logdir = '디렉토리경로'; // 로그가 저장될 디렉토리 경로
if( is_dir($logdir) == false){ return false; }
$logfile = $logdir .'/'.date('Ymd')."-multimail-async-log.txt";
$logmsg = "======================================================n";
$logmsg .= date('Y-m-d H:i:s')."n";
$logmsg .= $debug;
$logmsg .= "n";
error_log(addslashes($logmsg), 3, $logfile); // 파일로그
설정 & 옵션 상세
설정 및 옵션 상세는 아래와 같습니다.
기본설정 (config)
| module |
메일 발송 시 사용할 모듈을 설정합니다. 설정 가능한 값은 아래 3가지를 참고해 주세요.
|
| smtp.* |
smtp 모듈 설정 시 필수로 입력해야 하는 항목입니다.
|
| debug |
디버깅 뷰 사용 여부를 1 또는 0으로 설정할 수 있습니다. 1로 설정 시 실행 페이지에서 실시간 에러 메시지를 확인할 수 있습니다. |
| msg |
메일 발송 진행 과정에 대한 메시지 뷰입니다. 1로 설정 시 실행 페이지에서 실시간으로 메시지 뷰를 확인할 수 있습니다. |
| charset |
사용할 언어셋을 설정합니다. (기본 UTF-8) |
| ctype |
메일 본문의 컨텐츠 타입을 설정합니다. |
| async.* |
비동기 소켓통신 시 필요한 옵션을 설정하는 항목입니다.
|
옵션 (option)
| to |
메일 발송 시 받는이 정보를 설정합니다. (멀티 지원 가능) 예제) $msm->setOption('to','받는사람@이메일','받는이이름'); |
| from |
메일 발송 시 보내는이 정보를 설정합니다. 예제) $msm->setOption('from','보낸사람@이메일','보내는이이름'); |
| cc |
메일 발송 시 참조 정보를 설정합니다. (멀티 지원 가능) 예제) $msm->setOption('cc','참조@이메일','참조이름'); |
| bcc |
메일 발송 시 숨은참조 정보를 설정합니다. (멀티 지원 가능) 예제) $msm->setOption('bcc','숨은참조@이메일','숨은참조이름'); |
| subject |
메일 제목을 설정합니다. 예제) $msm->setOption('subject','제목'); |
| body |
메일 본문 내용을 설정합니다. 예제) $msm->setOption('body','내용'); |
사용가능한 메서드
아래와 같이 사용 가능한 메서드가 있습니다.
| setConfig |
기본설정 예제) $msm->setConfig('설정키값','설정값'); |
| setOption |
옵션설정 예제) $msm->setOption('옵션키값','옵션1','옵션2'); |
| setAttach |
파일첨부 (멀티 지원). 반환값으로 해당 파일의 index 키값을 return 합니다. (추후 초기화 시 해당 키값 사용 가능) 예제) $msm->setAttach('/파일경로/파일명','파일명'); |
| viewSet |
기본설정/옵션/첨부파일 값을 모두 출력합니다. 예제) $msm->viewSet(); |
| clearSet |
기본설정/옵션/첨부파일 값을 모두 초기화할 때 사용합니다. 예제) $msm->clearSet(); |
| viewOption |
설정된 옵션값을 출력합니다. 예제) $msm->viewOption(true); // 설정된 모든 옵션값을 볼 경우 true 예제) $msm->viewOption('to'); // 특정 키값만 볼 경우 |
| clearOption |
설정된 옵션값을 초기화합니다. 예제) $msm->clearOption(true); // 설정된 모든 옵션값을 초기화할 경우 true 예제) $msm->clearOption('to'); // 특정 키값만 초기화 시 |
| viewConfig |
기본설정값을 출력합니다. 예제) $msm->viewConfig(true); // 모든 기본설정값을 볼 경우 true 예제) $msm->viewConfig('smtp.username'); // 특정 키값만 볼 경우 |
| clearConfig |
기본설정값을 초기화합니다. (전체 초기화는 신중히 사용하시기 바랍니다.) 예제) $msm->clearConfig(true); // 전체설정 초기화 예제) $msm->clearConfig('module'); // 특정 키값만 초기화 시 |
| viewAttach |
설정된 첨부파일 정보를 출력합니다. 예제) $msm->viewAttach(true); // 모든 첨부파일 설정값을 볼 경우 true 예제) $msm->viewAttach('1'); // 특정 키값만 볼 경우 (setAttach 메서드 실행 후 받은 키값) |
| clearAttach |
설정된 첨부파일 정보를 초기화합니다. 예제) $msm->clearAttach(true); // 설정된 모든 첨부파일 값을 초기화할 경우 true (파일 자체가 삭제되는 것은 아님) 예제) $msm->clearAttach('2'); // 특정 키값에 대한 첨부파일만 삭제 시 (setAttach 메서드 실행 후 받은 키값) |
| msg |
메시지 뷰를 개별적으로 사용할 수 있습니다. 예제) $msm->msg('메시지',__LINE__); // 메시지, 라인 번호 |
| debug |
디버그 뷰를 개별적으로 사용할 수 있습니다. 예제) $msm->debug('메시지',__LINE__,true); // 메시지, 라인 번호, return 값 |
버전 & 이력
본 multiSendMail 라이브러리의 현재 버전은 2.0입니다. 자세한 이력은 아래를 참고해 주세요.
|
서포트 & 기타
본 라이브러리를 통한 메일 발송이 잘 되지 않거나 오류 및 버그를 발견하신 경우 lcy@redinfo.co.kr 로 문의해 주시면 최대한 빠르게 답변드리겠습니다.
마지막으로, 현존하는 PHP 메일 발송 프로그램 중 가장 완성도 높게 구현된 라이브러리는 PHPMailer로, 아래 깃허브를 참고해 주시기 바랍니다.