PHP 메일(mail) 함수를 이용한 첨부화일 전송하기

리눅스/Mail|2015. 1. 23. 09:35
반응형

[PHP 메일(mail) 함수를 이용한 첨부화일 전송하기]

여기서는 PHP 메일함수를 이용하여 첨부화일을 전송하는 가장 간단한 폼메일(Form mail)예제를 알아보겠습니다.
웹호스팅을 이용하고 계시다면 대부분 셋팅이 되어 있겠지만 시스템을 직접 설치 사용하고 계시다면 PHP의 mail()함수를 사용하기 위해서 아래의 사항을 체크해 봐야 합니다.

1.유닉스/리눅스 환경
php.ini 파일의 변수중 sendmail_path 가 완전한 경로로 잡혀 있는지 체크해 봐야 합니다.
php.ini 의 경로를 모른다면, php 파일을 하나 만들어서 <? phpinfo(); ?> 로 확인 하실 수 있습니다. )

sendmail_path = usr/sbin/sendmail -t -i

위의 환경변수는 저희 서버의 php.ini 에 있는 값을 확인한 결과입니다.

2.윈도우즈 환경
윈도우즈 환경은 두가지 값을 체크해 봐야 합니다. 첫번째로 php.ini 파일의 변수중 SMTP 변수에 SMTP 서버의 DNS 이름또는 IP 주소가 잡혀 있는지 체크해 봐야 하며, 두번째는 sendmail_from 변수에 디폴트 이메일 전송자의 
email 주소 값이 있는지 체크해 봐야 합니다.

메일함수의 기본구조

mail( 받는 이메일주소, 제목, 내용, header정보 );

메일함수의 기본구조는 위와 같이 아주 간단한 구조를 가지고 있으며 이상이 없을시 1을 리턴합니다. 이상이 없다는 것은 메일함수가 인자로 받는 파라미터의 값들을 무난하게 받아 들였다는 것을 의미하며, 메일전송의 성공을 의미하는 것은 아닙니다.

아래의 예제는 첨부파일이 있는 폼메일(form mail) 전송의 가장 간단한 예제이며, 앞단의 폼(form)에서 넘겨받은 값들
을 이용해 메일을 전송하게 됩니다. 아래의 예제에서 살펴 보실 부분은 헤더작성, 이메일 본문 생성, 파일 첨부 부분
이며 앞단의 form 부분을 포함한 전체 소스는 zip 파일로 올려 놓겠습니다.

<?
// 폼에서 넘어오는 값들
//-- $mailTo : 수신자 이메일주소
//-- $mailFrom : 송신자 이메일주소
//-- $fromName : 송신자명 또는 정보
//-- $title : 메일제목
//-- $content : 메일내용
//-- $upfile : 첨부파일명
//*******************************


$boundary = "----" . uniqid("part"); // 구분자 생성

// --- 헤더작성 --- //
$header = "Return-Path: $mailFromrn"; // 반송 이메일 주소
$header .= "from: $fromName <$mailFrom>rn"; // 송신자명, 송신자 이메일 주소

// --- 첨부화일이 있을경우 --- //
if($upfile && $upfile_size) {
$filename=basename($upfile_name); // 파일명 추출
$fp = fopen($upfile,"r"); // 파일 열기
$file = fread($fp,$upfile_size); // 파일 읽기
fclose($fp); // 파일 닫기
if ($upfile_type == ""){
$upfile_type = "application/octet-stream";
}

// --- 헤더작성 --- //
$header .= "MIME-Version: 1.0rn"; // MIME 버전 표시
$header .= "Content-Type: Multipart/mixed; boundary="$boundary""; // 구분자 설정, Multipart/mixed 일 경우 첨부화일

// --- 이메일 본문 생성 --- // 
$mailbody = "This is a multi-part message in MIME format.rnrn";
$mailbody .= "--$boundaryrn";
$mailbody .= "Content-Type: text/html; charset=euc-krrn";
$mailbody .= "Content-Transfer-Encoding: 8bitrnrn";
$mailbody .= nl2br(addslashes($content)) . "rn";

// --- 파일 첨부 ---// 
$mailbody .= "--$boundaryrn"; 
$mailbody .= "Content-Type: ".$upfile_type."; name="".$filename.""rn"; // 내용
$mailbody .= "Content-Transfer-Encoding: base64rn"; // 암호화 방식 
$mailbody .= "Content-Disposition: attachment; filename="".$filename.""rnrn"; // 첨부파일인 것을 알림
$mailbody .= base64_encode($file)."rnrn";

$mailbody .= "--$boundary--"; //내용 구분자 마침
} else {
// --- 헤더작성 --- // 
$header .= "MIME-Version: 1.0rn"; 
$header .= "Content-Type: Multipart/alternative; boundary = "$boundary"";

// --- 이메일 본문 생성 --- //
$mailbody = "--$boundaryrn"; 
$mailbody .= "Content-Type: text/html; charset=euc-krrn";
$mailbody .= "Content-Transfer-Encoding: 8bitrnrn";
$mailbody .= nl2br(addslashes($content)) . "rn";

$mailbody .= "--$boundary--rnrn"; 
}

$result = mail($mailTo,$title,$mailbody,$header);
if($result){
echo "메일 전송에 성공하였습니다.";
}else {
echo "메일 보내기 실패";
}

?>



[출처] 웹마당넷 (http://www.webmadang.net/develop/develop.do?action=read&boardid=1003&page=3&seq=29)



formail.zip


반응형

댓글()