본문 바로가기

개 발코딩

[PHP] mail() 함수로 메일 보내기

메일을 보내는 방법에는 메일보내는 서버(웹서버가 구동하고 있는 서버)에 SMTP서버 통해 보내는 방법과 외부 메일서버의 SMTP 서버를 이용하여(relay 방식) 보내는 방법이 있다.


이번에 내가 한 방법은 Relay  방식이다. 여기서 소개할 소스는 Relay든지 아니든지 상관은 없는 소스이다.

메일 소스를 작성하기 이전에 사전에 해야 할 작업들이 있다.


먼저, Relay할 메일 시스템에서 웹서버IP에 대한 접근허용 설정을 해야한다. 구글이나 네이버 등은 따로 메일로 요청해야 하는 것으로 알고 있다. 나 같은 경우는 회사메일에 설정을 해서 사용하였다. 


다음으로 Relay를 위한 php 설정으로 php.ini 의 'SMTP' 값을 수정해줘야 한다. 기본적으로 localhost로 설정되어 있을 것이다. 

이것을 외부 SMTP서버의 IP로 변경해 주고 아파치를 재시작해야 한다.


php.ini의 위치를 잘 모른다면, phpinfo() 함수를 통해 웹에서 경로를 확인할 수 있다.

<?php
phpinfo();
?>



php 소스코드는 아래와 같다.

<html>
<
head>


<?php
// 메일발송 시작
$nameFrom = "발신자";
$mailFrom = "발신주소";
$nameTo = "수신자";
$mailTo = "수신주소";
$cc = "참조";
$bcc = "숨은참조";
$subject = "제목";
$content = "메일내용";

$charset = "UTF-8";


$nameFrom = "=?$charset?B?".base64_encode($nameFrom)."?=";
$nameTo = "=?$charset?B?".base64_encode($nameTo)."?=";
$subject = "=?$charset?B?".base64_encode($subject)."?=";

$header = "Content-Type: text/html; charset=utf-8\r\n";
$header .= "MIME-Version: 1.0\r\n";

$header .= "Return-Path: <". $mailFrom .">\r\n";
$header .= "From: ". $nameFrom ." <". $mailFrom .">\r\n";
$header .= "Reply-To: <". $mailFrom .">\r\n";
if ($cc) $header .= "Cc: ". $cc ."\r\n";
if ($bcc) $header .= "Bcc: ". $bcc ."\r\n";

$result = mail($mailTo, $subject, $content, $header, $mailFrom);

if(!$result) {
?>

<script>
alert(
'메일전송실패!!! \n 다시 작성하세요');
</script>

<?php
}
else {
?>

<script>
alert(
'메일전송성공!!!');
</script>

<?php
}
?>

</head>
<
body></body>
</html>


소스를 보면, "=?UTF-8?B?".base64_encode($subject)."?=" 이런 구문이 있다. 

제목과 이름에만 이 코드를 넣어 주는데, 이렇게 하면 메일 수신시 한글이 깨지지 않는다.(메일내용 부분에는 이 코드를 넣으면 안된다. 오히려 깨진다.)

이유는 메일 전송시 전송되는 단위바이트가 다르다. 메일의 경우 7바이트 ASCII 코드로 전송하기 때문에 8바이트 이상되는 한글의 경우, 이런 문제가 발생한다. 


깨짐처리 루틴에 대해 더 자세히 알고 싶으시다면, 아래 링크로 가보시길...

http://keepingstar.tistory.com/22