Mail() 함수를 사용한 간단한 메일보내기
다음의 내용들은 모두 정확하다고 할 수 없으며, 여기에서 언급되는 내용외에도 많은 내용들
이 있으니
아래의 내용들은 공부하는데 참고정도만 하기 바라며 좀더 깊이 있는 내용을 알고 싶은 사람
은 하단에
있는 사이트들을 참고하기 바랍니다.
여기저기 찾아보면서 하는데 제대로 번역되어 있는 문서도 없고, 영문사이트는 이건 간단한
메뉴얼
수준이 아니라 영어가 제대로 해석이 안되서 시간만 끌고 내용은 졸작이 되어버렸네요.
먼저 메일 발송 프로그램을 제작을 하기에 앞서 mail() 함수를 사용하기 위한 준비부터 알아
보자.
php.ini 파일을 열어서 다음부분을 확인한다.
[mail function]
; 윈도 계열에서 사용시에만 사용
SMTP = localhost
; 윈도 계열에서 사용시에만 사용
sendmail_from = me@localhost.com
; 이 부분은 유닉스나 리눅스 계통에서 사용시에 설장부분 (default: 'sendmail -t -i').
;sendmail_path =
윈도에서 사용시에는 SMTP 와 sendmail_from 부분의 주석을 제거하고 리눅스에서 사용시에는
sendmail_path 의 주석을 제거하고 나머지 부분은 주석처리해준다.
리눅스에서 사용시
[mail function]
; 유닉스나 리눅스 사용시에 이부분에 sendmail의 경로를 적어준다. (default: 'sendmail -
t -i').
sendmail_path = /usr/bin/sendmail -t -i
만일 sendmail이 아니라 qmail을 설치하여 사용한다면 다음과 같이 qmail의 경로를 적어준다
.
sendmail_path = /var/qmail/bin/qmail-inject
윈도에서 mail() 함수를 사용하기 위한 방법으로는 두가지가 있다.
하나는 자신의 서버에 SMTP 메일 서버를 설치하는 것이다.
공개된 프로그램들이 있으니 필요한 사람들은 설치해 보고 테스트 해보기 바란다.
그런다음 php.ini 의 설정을 다음과 같이 한다.
[mail function]
SMTP = localhost
sendmail_from = me@localhost.com
두번째는 공개용 SMTP 서버를 사용하는 방법이다. 이 방법은 php.ini의 설정만으로 이용할
수 있다.
[mail function]
SMTP = mail.kornet.net ; 이 부분을 자신이 가입한 ISP 의 메일서버나 공개 메일 서버를 확
인해서 적어주면 된다.
sendmail_from = modulang@netian.com
이 방법을 이용하면서 주의해야 할점은 공개 메일 서버를 이용할 경우 몇몇 메일 제공 업체
에 메일이 보내지지
않는 경우가 있다. 이를 주의해야 한다.
그럼 지금부터는 소스를 같이 보면서 조금 자세히 살펴보도록 하겠다.
소스는 두 개의 파일로 이루어져 있다.
내용 입력폼은 그냥 보면 알 수 있으니 살펴보기 바란다.
현재 내용 입력폼에 추가할것은 메일발송 파일에 폼을 넘기기전에 폼의 입력내용을 체크하는
부분이 생략되었다.
메일 발송 파일에 이 부분이 있기는 하지만 필요하면 간단하니 각자 추가해 보기 바란다.
// 메일 내용 입력 폼
<html>
<head>
<title>메일 폼</title>
<style>
body { text-align:center; }
td {font:9pt; }
.th { font:9pt; text-align:right; color:#778899; font-weight:bold; }
.form { font:9pt; border-style:solid; border-width:1; border-color:#778899; height:16
; }
.form2 { font:9pt; border-style:solid; border-width:1; border-color:#778899; }
.button { font:9pt; border-style:solid; border-width:1; border-color:#778899; backgro
und-Color:#778899; color:#ffffff; }
</style>
</head>
<body>
<table>
<form method='post' action='send.php' enctype='multipart/form-data'>
<tr><td class='th'>받는 사람 : </td><td><input class='form' name='to'
size='25'></td></tr>
<tr><td class='th'>보내는 사람 : </td><td><input class='form' name='fr
om_name' size='15'></td></tr>
<tr><td class='th'>보내는 사람 메일 : </td><td><input class='form' nam
e='from_email' size='25'></td></tr>
<tr><td class='th'>제 목 : </td><td><input class='form' name='title' s
ize='50'></td></tr>
<tr><td class='th' valign='top'>내 용 : </td><td><textarea class='form
2' name='memo' cols='50' rows='10'></textarea></td></tr>
<tr><td class='th'>첨부파일 : </td><td><input class='form' type='file'
name='attach'></td></tr>
<tr><td class='th'>중요도 : </td><td><input type='checkbox' name='impo
rtance' value='1'> 중요함</td></tr>
<tr><td colspan='2' height=15></td></tr>
<tr><td colspan='2' align='center'><input class='button' type='submit' value
=' 전 송 '> <input class='button' type='reset' value=' 다 시
'></td></tr>
</form>
</table>
</body>
</html>
<?php
// send.php -- 메일 발송 파일
// 아래의 Err_msg_back() 이외의 함수들의 자세한 사용법은 PHP 함수 메뉴에서 찾아보기 바
란다.
// 에러 메시지 출력창을 보여주고 이전 페이지로 이동하는 함수
function Err_msg_back($msg)
{
echo("<script>
alert('$msg');
history.back();
</script>");
exit;
}
// 넘어온 폼값들이 유효한지 체크한다.
// 불필요한 공백을 제거한다.
$to = chop($to);
$title = chop($title);
$from_name = chop($from_name);
$from_email = chop($from_email);
$memo = chop($memo);
// 받는 사람의 메일주소를 확인한다.
// 정규표현식의 자세한 내용은 PHP 배우기 게시판에 있는 내용을 참고하기 바란다.
if( empty($to) || !ereg("(^[_0-9a-zA-Z-]+(\.[_0-9a-zA-Z-]+)*@[0-9a-zA-Z-]+(\.[0-9a-zA
-Z-]+)*$)", $from_email) ) {
Err_msg_back("받는 사람 메일주소를 입력하세요");
}
// 보내는 사람의 이름이 비어있는지 확인한다.
if( empty($from_name) ) {
Err_msg_back("보내는 사람 이름을 입력하세요");
}
// 보내는 사람메일주소를 확인한다.
if( empty($from_email) || !ereg("(^[_0-9a-zA-Z-]+(\.[_0-9a-zA-Z-]+)*@[0-9a-zA-Z-]+(\.
[0-9a-zA-Z-]+)*$)", $from_email) ) {
Err_msg_back("보내는 사람 이메일을 입력하세요.");
}
// 제목이 비어 있는지 확인한다.
if( empty($title) ) {
Err_msg_back("제목을 입력하세요");
}
// 보내는 메일 내용을 확인한다.
if( empty($memo) ) {
Err_msg_back("내용을 입력하세요");
}
$memo = nl2br($memo);
// 첨부파일이 있으면 첨부파일을 읽어온다.
if( $attach_size ) {
// 순수한 파일명을 구한다.
$filename = basename($attach_name);
// 파일을 읽어온다.
$fp = fopen($attach, "r");
$file = fread($fp, $attach_size);
fclose($fp);
// 첨부파일의 파일형태가 없으면 파일형태를 applocation/octet-stream 으로 지정
if ($attach_type == ""){
$attach_type = "application/octet-stream";
}
// 멀티형식의 메일을 발송할때 각 영영을 나타내기위한 코드를 만든다.
$boundary = "----" . uniqid("part");
}
// 메일의 내용을 처리한다.
// 요기는 알아서 예쁘게 꾸미세요.
$mail = "
<html>
<table width=100% bgcolor=#909090 cellspacing=1 cellpadding=0>
<tr><td bgcolor=#FEFEFE><PREV>$memo</PREV></td></tr>
</table>
</html>";
// 공통으로 사용되는 메일 헤더를 처리한다.
// 에러발생시 반송할 메일주소를 발송자의 메일주소로 설정한다.
$add_header = "Return-Path: $from_email\n";
// 보내는 사람이 누구인지 설정한다.
$add_header .= "From: $from_name<$from_email>\n";
// 회신시 사용할 메일 주소를 발송자의 메일주소로 설정한다.
$add_header .= "Reply-To: $from_email\n";
// 메일의 중요도를 설정한다.
// 아래의 내용을 이용해서 select 박스를 사용해서 다양한 선택을 하는건 직접해보기 바란
다.
// 메일 중요도에서 사용되는 숫자 / 의미
// 1 = Highest Priority
// 2 = High Priority
// 3 = Normal Priority
// 4 = Low Priority
if( $importance ) {
$add_header .= "X-Priority: $importance (Highest)\n";
}
// 첨부파일이 있을경우의 헤더 및 본문 처리
if( $attach_size ) {
// 메일의 형식
$add_header .= "MIME-Version: 1.0\n";
// 보내지는 메일의 내용이 여러가지 형태를 포함하고 있음과 각영역에 대한 구분자가
무엇인지 알린다.
$add_header .= "Content-Type: Multipart/mixed; boundary = \"$boundary\"";
$bodytext = "This is a multi-part message in MIME format.\n";
// 시작부분 임을 나타내는 구분코드. 형태는 "--코드"
$bodytext .= "--$boundary\n";
// 메일 내용
// 전송되는 내용이 html 형식이면 8bit로 인코딩되어 있음을 알린다.
$bodytext .= "Content-Type: text/html; charset=euc_kr\n";
$bodytext .= "Content-Transfer-Encoding: 8bit\n\n";
$bodytext .= $mail . "\n\n";
// 형태를 구분하는 구분코드.
$bodytext .= "--$boundary\n";
// 파일첨부
// 첨부파일의 형태와 파일명을 알린다.
$bodytext .= "Content-Type: $attach_type; name=$filename\n";
// 전송되는 내용이 base64 형태로 인코딩되어 있음을 알린다.
$bodytext .= "Content-Transfer-Encoding: base64\n";
$bodytext .= "Content-Disposition: filename=$filename\n\n";
// chunk_split() 함수는 base64로 인코딩된 내용을 RFC 2045형태의 새로운 문자열로 변
환한다.
// 일반 파일의 경우에는 chunk_split() 을 사용하지 않을경우 영문 텍스트 파일은 정상
적으로 전송이 되지만
// 기타 이진형태의 파일이나 한글이 포함된 파일에서는 내용이 깨지는 현상이 발생한다
.
$bodytext .= chunk_split(base64_encode($file))."\n\n";
// 마지막에는 반드시 --코드--이다.
$bodytext .= "--$boundary--";
// 첨부 파일이 없을 경우의 헤더 및 본문 처리
} else {
$add_header .= "MIME-Version: 1.0\n";
$add_header .= "Content-Type: text/html; charset=euc_kr";
$bodytext = $mail;
}
// 메일을 발송한다.
if( mail($to, $title, $bodytext, $add_header) ) {
// 메일 발송 성공시
echo("<script>
alert('메일 전송 완료');
</script>
<meta http-equiv='refresh' content='0; URL=mail.html'>");
} else {
// 메일 발송 실패시
Err_msg_back("메일 전송 실패");
}
?>
다음은 위의 메일 발송 소스로 메일을 발송해서 받은 메일의 헤더 내용이다.
// 부분은 임의로 주석을 첨가한 내용이다. (물론 아는것만 ^^)
// 에러 발생시 반송할 메일의 주소, 받은 서버에서는 필요가 없으니 비어있다.
Return-Path:
// 메일을 받은 서버의 정보
// 메일을 받은 서버명, 받은 사람 메일주소, 날짜/시간 내부에서 사용되는 고유 ID
X-Internal-ID: 3B6357C1005765DF
Received: from relay04.netian.com (203.231.231.194) by mail02.netian.com (5.1.048.1k)
id 3B6357C1005765DF for modulang@netian.com; Mon, 3 Sep 2001 02:26:19 +0900
// 메일을 보낸 서버의 정보
// 메일을 보낸 서버명, 메일을 받을 서버명, 받은 사람 메일주소, 날짜/시간 내부에서 사용
되는 고유 ID
X-Internal-ID: 3B90FBF50001E712
Received: from ns1.iwebschool.net (211.62.58.45) by relay04.netian.com (5.1.034K)
id 3B90FBF50001E712 for modulang@netian.com; Mon, 3 Sep 2001 02:27:00 +0900
// 메일을 접수한 서버에 대한 정보
// 접수받은 서버명, 접수 날짜/시간, 메일에 대한 고유 ID
Received: (from nobody@localhost)
by ns1.iwebschool.net (8.11.0/8.11.0) id f82HQN817104;
Mon, 3 Sep 2001 02:26:23 +0900
// 최초 메일을 발송한 시간
Date: Mon, 3 Sep 2001 02:26:23 +0900
// 메일 발송 날짜/시간, 메일을 보낸서버 / 해당 서버에서의 메일의 고유 ID
Message-Id: <200109021726.f82HQN817104@ns1.iwebschool.net>
// 받는 사람
To: modulang@netian.com
// 제목
Subject: 메일 제목
// 보낸 사람
From: 모두랑
// 회신시 사용할 메일 주소
Reply-To: modulang@netian.com
X-Priority: 1 (Highest)
// 메일 파일의 형식
MIME-Version: 1.0
// 메일 내용의 형태 / 각 영역에 대한 구분자
Content-Type: Multipart/mixed; boundary = "----part3b926bbf28e6c"
만일 메일에 첨부하는 파일이 하나가 아니라 두 개 일경우에는 다음과 같이 할 수 있다.
$bodytext .= "--$boundary\n";
$bodytext .= "Content-Type: $attach_type; name=$filename2\n";
$bodytext .= "Content-Transfer-Encoding: base64\n";
$bodytext .= "Content-Disposition: filename=$filename2\n\n";
$bodytext .= chunk_split(base64_encode($file2))."\n\n";
$bodytext .= "--$boundary\n";
$bodytext .= "Content-Type: $attach_type; name=$filename2\n";
$bodytext .= "Content-Transfer-Encoding: base64\n";
$bodytext .= "Content-Disposition: filename=$filename2\n\n";
$bodytext .= chunk_split(base64_encode($file2))."\n\n";
$bodytext .= "--$boundary--";
여러개의 파일이 첨부되는 경우 다음과 같이 이루어져있다고 생각하면 된다.
--구분코드
메일 내용
--구분코드
첨부파일 내용
--구분코드
첨부파일 내용
--구분코드
첨부파일 내용
--구분코드--
위의 메일소스에서 빠진 내용이 있는데 참조 와 숨은 참조에 대한 것이다.
이 내용까지 포함을 할려고 했으나 작성된 소스가 정상적으로 작동하지 않아서 이번 내용에
서 제외했다.
** 더 자세한 내용을 알고싶다면 다음 사이트를 참고하기 바란다.
http://php.net/manual/en/function.mail.php
http://www.oac.uci.edu/indiv/ehood/MIME/MIME.html
http://www.rfc-editor.org/rfc-index2.html
다음의 내용들은 모두 정확하다고 할 수 없으며, 여기에서 언급되는 내용외에도 많은 내용들
이 있으니
아래의 내용들은 공부하는데 참고정도만 하기 바라며 좀더 깊이 있는 내용을 알고 싶은 사람
은 하단에
있는 사이트들을 참고하기 바랍니다.
여기저기 찾아보면서 하는데 제대로 번역되어 있는 문서도 없고, 영문사이트는 이건 간단한
메뉴얼
수준이 아니라 영어가 제대로 해석이 안되서 시간만 끌고 내용은 졸작이 되어버렸네요.
먼저 메일 발송 프로그램을 제작을 하기에 앞서 mail() 함수를 사용하기 위한 준비부터 알아
보자.
php.ini 파일을 열어서 다음부분을 확인한다.
[mail function]
; 윈도 계열에서 사용시에만 사용
SMTP = localhost
; 윈도 계열에서 사용시에만 사용
sendmail_from = me@localhost.com
; 이 부분은 유닉스나 리눅스 계통에서 사용시에 설장부분 (default: 'sendmail -t -i').
;sendmail_path =
윈도에서 사용시에는 SMTP 와 sendmail_from 부분의 주석을 제거하고 리눅스에서 사용시에는
sendmail_path 의 주석을 제거하고 나머지 부분은 주석처리해준다.
리눅스에서 사용시
[mail function]
; 유닉스나 리눅스 사용시에 이부분에 sendmail의 경로를 적어준다. (default: 'sendmail -
t -i').
sendmail_path = /usr/bin/sendmail -t -i
만일 sendmail이 아니라 qmail을 설치하여 사용한다면 다음과 같이 qmail의 경로를 적어준다
.
sendmail_path = /var/qmail/bin/qmail-inject
윈도에서 mail() 함수를 사용하기 위한 방법으로는 두가지가 있다.
하나는 자신의 서버에 SMTP 메일 서버를 설치하는 것이다.
공개된 프로그램들이 있으니 필요한 사람들은 설치해 보고 테스트 해보기 바란다.
그런다음 php.ini 의 설정을 다음과 같이 한다.
[mail function]
SMTP = localhost
sendmail_from = me@localhost.com
두번째는 공개용 SMTP 서버를 사용하는 방법이다. 이 방법은 php.ini의 설정만으로 이용할
수 있다.
[mail function]
SMTP = mail.kornet.net ; 이 부분을 자신이 가입한 ISP 의 메일서버나 공개 메일 서버를 확
인해서 적어주면 된다.
sendmail_from = modulang@netian.com
이 방법을 이용하면서 주의해야 할점은 공개 메일 서버를 이용할 경우 몇몇 메일 제공 업체
에 메일이 보내지지
않는 경우가 있다. 이를 주의해야 한다.
그럼 지금부터는 소스를 같이 보면서 조금 자세히 살펴보도록 하겠다.
소스는 두 개의 파일로 이루어져 있다.
내용 입력폼은 그냥 보면 알 수 있으니 살펴보기 바란다.
현재 내용 입력폼에 추가할것은 메일발송 파일에 폼을 넘기기전에 폼의 입력내용을 체크하는
부분이 생략되었다.
메일 발송 파일에 이 부분이 있기는 하지만 필요하면 간단하니 각자 추가해 보기 바란다.
// 메일 내용 입력 폼
<html>
<head>
<title>메일 폼</title>
<style>
body { text-align:center; }
td {font:9pt; }
.th { font:9pt; text-align:right; color:#778899; font-weight:bold; }
.form { font:9pt; border-style:solid; border-width:1; border-color:#778899; height:16
; }
.form2 { font:9pt; border-style:solid; border-width:1; border-color:#778899; }
.button { font:9pt; border-style:solid; border-width:1; border-color:#778899; backgro
und-Color:#778899; color:#ffffff; }
</style>
</head>
<body>
<table>
<form method='post' action='send.php' enctype='multipart/form-data'>
<tr><td class='th'>받는 사람 : </td><td><input class='form' name='to'
size='25'></td></tr>
<tr><td class='th'>보내는 사람 : </td><td><input class='form' name='fr
om_name' size='15'></td></tr>
<tr><td class='th'>보내는 사람 메일 : </td><td><input class='form' nam
e='from_email' size='25'></td></tr>
<tr><td class='th'>제 목 : </td><td><input class='form' name='title' s
ize='50'></td></tr>
<tr><td class='th' valign='top'>내 용 : </td><td><textarea class='form
2' name='memo' cols='50' rows='10'></textarea></td></tr>
<tr><td class='th'>첨부파일 : </td><td><input class='form' type='file'
name='attach'></td></tr>
<tr><td class='th'>중요도 : </td><td><input type='checkbox' name='impo
rtance' value='1'> 중요함</td></tr>
<tr><td colspan='2' height=15></td></tr>
<tr><td colspan='2' align='center'><input class='button' type='submit' value
=' 전 송 '> <input class='button' type='reset' value=' 다 시
'></td></tr>
</form>
</table>
</body>
</html>
<?php
// send.php -- 메일 발송 파일
// 아래의 Err_msg_back() 이외의 함수들의 자세한 사용법은 PHP 함수 메뉴에서 찾아보기 바
란다.
// 에러 메시지 출력창을 보여주고 이전 페이지로 이동하는 함수
function Err_msg_back($msg)
{
echo("<script>
alert('$msg');
history.back();
</script>");
exit;
}
// 넘어온 폼값들이 유효한지 체크한다.
// 불필요한 공백을 제거한다.
$to = chop($to);
$title = chop($title);
$from_name = chop($from_name);
$from_email = chop($from_email);
$memo = chop($memo);
// 받는 사람의 메일주소를 확인한다.
// 정규표현식의 자세한 내용은 PHP 배우기 게시판에 있는 내용을 참고하기 바란다.
if( empty($to) || !ereg("(^[_0-9a-zA-Z-]+(\.[_0-9a-zA-Z-]+)*@[0-9a-zA-Z-]+(\.[0-9a-zA
-Z-]+)*$)", $from_email) ) {
Err_msg_back("받는 사람 메일주소를 입력하세요");
}
// 보내는 사람의 이름이 비어있는지 확인한다.
if( empty($from_name) ) {
Err_msg_back("보내는 사람 이름을 입력하세요");
}
// 보내는 사람메일주소를 확인한다.
if( empty($from_email) || !ereg("(^[_0-9a-zA-Z-]+(\.[_0-9a-zA-Z-]+)*@[0-9a-zA-Z-]+(\.
[0-9a-zA-Z-]+)*$)", $from_email) ) {
Err_msg_back("보내는 사람 이메일을 입력하세요.");
}
// 제목이 비어 있는지 확인한다.
if( empty($title) ) {
Err_msg_back("제목을 입력하세요");
}
// 보내는 메일 내용을 확인한다.
if( empty($memo) ) {
Err_msg_back("내용을 입력하세요");
}
$memo = nl2br($memo);
// 첨부파일이 있으면 첨부파일을 읽어온다.
if( $attach_size ) {
// 순수한 파일명을 구한다.
$filename = basename($attach_name);
// 파일을 읽어온다.
$fp = fopen($attach, "r");
$file = fread($fp, $attach_size);
fclose($fp);
// 첨부파일의 파일형태가 없으면 파일형태를 applocation/octet-stream 으로 지정
if ($attach_type == ""){
$attach_type = "application/octet-stream";
}
// 멀티형식의 메일을 발송할때 각 영영을 나타내기위한 코드를 만든다.
$boundary = "----" . uniqid("part");
}
// 메일의 내용을 처리한다.
// 요기는 알아서 예쁘게 꾸미세요.
$mail = "
<html>
<table width=100% bgcolor=#909090 cellspacing=1 cellpadding=0>
<tr><td bgcolor=#FEFEFE><PREV>$memo</PREV></td></tr>
</table>
</html>";
// 공통으로 사용되는 메일 헤더를 처리한다.
// 에러발생시 반송할 메일주소를 발송자의 메일주소로 설정한다.
$add_header = "Return-Path: $from_email\n";
// 보내는 사람이 누구인지 설정한다.
$add_header .= "From: $from_name<$from_email>\n";
// 회신시 사용할 메일 주소를 발송자의 메일주소로 설정한다.
$add_header .= "Reply-To: $from_email\n";
// 메일의 중요도를 설정한다.
// 아래의 내용을 이용해서 select 박스를 사용해서 다양한 선택을 하는건 직접해보기 바란
다.
// 메일 중요도에서 사용되는 숫자 / 의미
// 1 = Highest Priority
// 2 = High Priority
// 3 = Normal Priority
// 4 = Low Priority
if( $importance ) {
$add_header .= "X-Priority: $importance (Highest)\n";
}
// 첨부파일이 있을경우의 헤더 및 본문 처리
if( $attach_size ) {
// 메일의 형식
$add_header .= "MIME-Version: 1.0\n";
// 보내지는 메일의 내용이 여러가지 형태를 포함하고 있음과 각영역에 대한 구분자가
무엇인지 알린다.
$add_header .= "Content-Type: Multipart/mixed; boundary = \"$boundary\"";
$bodytext = "This is a multi-part message in MIME format.\n";
// 시작부분 임을 나타내는 구분코드. 형태는 "--코드"
$bodytext .= "--$boundary\n";
// 메일 내용
// 전송되는 내용이 html 형식이면 8bit로 인코딩되어 있음을 알린다.
$bodytext .= "Content-Type: text/html; charset=euc_kr\n";
$bodytext .= "Content-Transfer-Encoding: 8bit\n\n";
$bodytext .= $mail . "\n\n";
// 형태를 구분하는 구분코드.
$bodytext .= "--$boundary\n";
// 파일첨부
// 첨부파일의 형태와 파일명을 알린다.
$bodytext .= "Content-Type: $attach_type; name=$filename\n";
// 전송되는 내용이 base64 형태로 인코딩되어 있음을 알린다.
$bodytext .= "Content-Transfer-Encoding: base64\n";
$bodytext .= "Content-Disposition: filename=$filename\n\n";
// chunk_split() 함수는 base64로 인코딩된 내용을 RFC 2045형태의 새로운 문자열로 변
환한다.
// 일반 파일의 경우에는 chunk_split() 을 사용하지 않을경우 영문 텍스트 파일은 정상
적으로 전송이 되지만
// 기타 이진형태의 파일이나 한글이 포함된 파일에서는 내용이 깨지는 현상이 발생한다
.
$bodytext .= chunk_split(base64_encode($file))."\n\n";
// 마지막에는 반드시 --코드--이다.
$bodytext .= "--$boundary--";
// 첨부 파일이 없을 경우의 헤더 및 본문 처리
} else {
$add_header .= "MIME-Version: 1.0\n";
$add_header .= "Content-Type: text/html; charset=euc_kr";
$bodytext = $mail;
}
// 메일을 발송한다.
if( mail($to, $title, $bodytext, $add_header) ) {
// 메일 발송 성공시
echo("<script>
alert('메일 전송 완료');
</script>
<meta http-equiv='refresh' content='0; URL=mail.html'>");
} else {
// 메일 발송 실패시
Err_msg_back("메일 전송 실패");
}
?>
다음은 위의 메일 발송 소스로 메일을 발송해서 받은 메일의 헤더 내용이다.
// 부분은 임의로 주석을 첨가한 내용이다. (물론 아는것만 ^^)
// 에러 발생시 반송할 메일의 주소, 받은 서버에서는 필요가 없으니 비어있다.
Return-Path:
// 메일을 받은 서버의 정보
// 메일을 받은 서버명, 받은 사람 메일주소, 날짜/시간 내부에서 사용되는 고유 ID
X-Internal-ID: 3B6357C1005765DF
Received: from relay04.netian.com (203.231.231.194) by mail02.netian.com (5.1.048.1k)
id 3B6357C1005765DF for modulang@netian.com; Mon, 3 Sep 2001 02:26:19 +0900
// 메일을 보낸 서버의 정보
// 메일을 보낸 서버명, 메일을 받을 서버명, 받은 사람 메일주소, 날짜/시간 내부에서 사용
되는 고유 ID
X-Internal-ID: 3B90FBF50001E712
Received: from ns1.iwebschool.net (211.62.58.45) by relay04.netian.com (5.1.034K)
id 3B90FBF50001E712 for modulang@netian.com; Mon, 3 Sep 2001 02:27:00 +0900
// 메일을 접수한 서버에 대한 정보
// 접수받은 서버명, 접수 날짜/시간, 메일에 대한 고유 ID
Received: (from nobody@localhost)
by ns1.iwebschool.net (8.11.0/8.11.0) id f82HQN817104;
Mon, 3 Sep 2001 02:26:23 +0900
// 최초 메일을 발송한 시간
Date: Mon, 3 Sep 2001 02:26:23 +0900
// 메일 발송 날짜/시간, 메일을 보낸서버 / 해당 서버에서의 메일의 고유 ID
Message-Id: <200109021726.f82HQN817104@ns1.iwebschool.net>
// 받는 사람
To: modulang@netian.com
// 제목
Subject: 메일 제목
// 보낸 사람
From: 모두랑
// 회신시 사용할 메일 주소
Reply-To: modulang@netian.com
X-Priority: 1 (Highest)
// 메일 파일의 형식
MIME-Version: 1.0
// 메일 내용의 형태 / 각 영역에 대한 구분자
Content-Type: Multipart/mixed; boundary = "----part3b926bbf28e6c"
만일 메일에 첨부하는 파일이 하나가 아니라 두 개 일경우에는 다음과 같이 할 수 있다.
$bodytext .= "--$boundary\n";
$bodytext .= "Content-Type: $attach_type; name=$filename2\n";
$bodytext .= "Content-Transfer-Encoding: base64\n";
$bodytext .= "Content-Disposition: filename=$filename2\n\n";
$bodytext .= chunk_split(base64_encode($file2))."\n\n";
$bodytext .= "--$boundary\n";
$bodytext .= "Content-Type: $attach_type; name=$filename2\n";
$bodytext .= "Content-Transfer-Encoding: base64\n";
$bodytext .= "Content-Disposition: filename=$filename2\n\n";
$bodytext .= chunk_split(base64_encode($file2))."\n\n";
$bodytext .= "--$boundary--";
여러개의 파일이 첨부되는 경우 다음과 같이 이루어져있다고 생각하면 된다.
--구분코드
메일 내용
--구분코드
첨부파일 내용
--구분코드
첨부파일 내용
--구분코드
첨부파일 내용
--구분코드--
위의 메일소스에서 빠진 내용이 있는데 참조 와 숨은 참조에 대한 것이다.
이 내용까지 포함을 할려고 했으나 작성된 소스가 정상적으로 작동하지 않아서 이번 내용에
서 제외했다.
** 더 자세한 내용을 알고싶다면 다음 사이트를 참고하기 바란다.
http://php.net/manual/en/function.mail.php
http://www.oac.uci.edu/indiv/ehood/MIME/MIME.html
http://www.rfc-editor.org/rfc-index2.html
다음검색