Gooday Note Scrap Source Android login
 
작성일 : 11-03-03 09:58
[PHP]SMTP에서 메일을 보내보자
 글쓴이 : 관리자 (124.♡.25.162)
조회 : 2,921  
   http://wizard.ncafe.net/wt/2 [875]
메일을 보내기 위해서는 메일을 보낼수 있는 프로그램(데몬, 서버)이 실행중이어야 합니다.
당연한 말같지만 처음 웹프로그램을 접하시는 분들은 잘 이해하지 못하는 부분입니다.
저도 처음에 웹프로그램을 접했을때.. 어디선 메일을 보낼수 있고 어디선 메일을 못보내고.. 뭐가 이래?.. 이런생각을 했었습니다.

책에서도 이런점 감안해서 IIS에서 SMTP 설치하는 방법등을 다룰려고 했었는데 빼먹었나 봅니다.

시스템사양은 다양합니다.
1. linux(unix) 시스템에서 sendmail(<== 이건 리눅스 데몬입니다. PHP와 상관없습니다.)이 설치 되어 있고 데몬이 실행중인경우 (리눅스 서버의 경우 대부분 실행해 놓습니다.)
☞ PHP에서 mail() 함수를 이용해서 메일을 보내는데 문제없습니다.
PHP의 mail()함수는 책이나 메뉴얼을 참조하시면됩니다.

2. linux(unix) 시스템에서 sendmail이 실행되고 있지 않고 qmail 이나 기타 smtp 서비스가 되고 있는경우
☞ 이경우는 PHP의 mail() 함수를 이용해서 메일을 보낼 수 없습니다.
이경우는 smtp 서버에 소켓으로 연결해서 소켓통신해야 합니다.
소켓통신방법은 밑에서...

3. linux(unix) 시스템에서 sendmail이 실행되고 있지 않고 qmail 이나 기타 smtp 서비스가 실행되고 있지 않는경우
☞ 아마 이런경우는 극히 드물겠지만 그래도 있을 수 있습니다.
이경우는 다른 smtp서버를 이용해야 합니다.
이것도 밑에서

4. Win32 계열에서 ...
☞ PHP로 메일을 보내는 부분에서 가장 많은 질문이 들어오는 부분입니다.
이경우는 리눅스의 2,3번 경우와 같이 smtp 서버를 이용해야 합니다.
우선 win32 계열에서 자체서버에 smtp 서비스를 실행하는 것과 다른 smtp서버를 이용하는 방법이 있습니다.
요것도 밑에서

5. 기타.. 문제들..
☞ 뭐가 있을까요?

===============================================
문제 해결 #1 : Win32 계열에서 자체서버에 SMTP서비를 깐다.
☞ 보통 쓰는 방법입니다.
WinNT 이상. 즉, WinNT, Win2000모두, WinXP 등등 IIS를 지원하는 Win32 OS에서는 다음과 같이 SMTP서비스를 실행할 수 있습니다.

제어판 > 관리도구 에 들어가 보세요.
여기에 "인터넷 정보 서비스(IIS)" 라는 항목이 있으면 IIS가 설치 된것입니다.
만약 없다면 설치해야 합니다.
만약 설치 되어 있다면 설치방법 단계 뛰어 넘으세요.. 휘릭.

★ 설치 방법 (Win XP 기준.. Win2000이상은 비슷합니다.)
제어판 > 프로그램 추가/제거 에 가시면 (NT는 잘 기억이 나지 않네요..) 왼쪽에 "Windows 구성요소 추가/제거" 라는 항목이 있습니다.
이거 선택하면 OS 자체적으로 시스템 점검을 하고 사용할 서비스를 항목을 찾습니다.
"Windows 구성요소 마법사" 라는 창이 뜨면서 "구성요소"를 선택할 수 있는 항목이 나타납니다. 여기서 다른건 그대로 두시고 "인터넷 정보 서비스(IIS)"를 더블클릭해보세요.
FTP, SMTP, WWW 서비스 등이 있는데요 여기서 필요한것은 SMTP이나까 이것만 선택하고 확인을 클릭해도 됩니다.
어째꺼나 SMTP는 꼭 선택하셔야 합니다.
이렇게 선택하고 다음을 클릭해서 설치를 합니다. 이때 OS CD가 필요하게 됩니다.

이렇게하면 IIS의 SMTP 의 설치는 끝났습니다.
이제 SMTP서비스를 실행하고 사용하는 방법을 간단히 알아보겠습니다.

★ SMTP 운영 방법
제어판>관리도구>인터넷 정보 서비스(IIS)를 선택하세요.
그러면 "인터넷 정보 서비스" 창이 뜨고요
로컬 컴퓨터.. 어쩌구 뜨면 + 를 누르면 기본 SMTP 가상서버라는 항목이 보입니다.
만약 안보이면 잘찾아보시고 그래도 안보이면 위에 SMTP 설치방법을 다시 보시기 바랍니다.
"기본 SMTP 가상 서버" 의 등록정보(오른쪽마우스 누르고 등록정보 또는 속성)를 여시면
여러가지 항목이 있는데 중요한 몇가지만 알아보겠습니다. (저도 다 알지 못해서)
처음에 일반 탭에서 고급을 클릭하면 IP주소와 TCP 포트항목이 있으며
아마 하나 추가되어 있을 겁니다.
만약 고정아이피를 쓰시는 분이라면 자신의 아이피와 포트는 25로 하나 추가되어 있을 꺼고요 .. ADSL .. 즉 유동IP를 쓰시는 분이라면
IP주소는 "할당되지 않은 주소 모두"라고 되어 있을 겁니다.
그냥 놔두시면 됩니다. SMTP는 기본 포트가 25번이니까 그냥 두시면 됩니다.
고급 창 닫고요.

엑세스 탭으로 가시면 여러가지 있는데 이중에 연결 제어 릴레이 제한이란 항목이 있습니다. 우선 연결제어를 클릭해봅니다.
아래 목록만... 아래목록만 제외.. 라고 되어 있는데요.
무슨 말인고 하니 이 SMTP에 연결할수 있는 IP를 설정해주는 것입니다.
아무나 쓰게 하고 싶지 않다면 IP주소를 추가해서 아래목록만 을 선택하면 추가된 IP만 SMTP를 사용할 수 있습니다. 일단 그냥 넘어갑니다.

릴레이 제한을 선택하면
역시 위와 비슷한데.. 여기는 디폴트가 아래목록만으로 되어 잇는데 아래 목록에 아무것도 없으니까 메일을 보낼수없습니다.
따라서 아래목록만 제외를 선택하고 확인을 하시던지 자신의 IP를 등록하던지 하면 됩니다.

이렇게 SMTP설정을 했고요 SMTP 재시작합니다.

원래 그림과 같이 설명드려가 쉬운데.. 여건상..

이렇게 SMTP를 설정했습니다.

그러면 SMTP를 이용해서 메일을 보낼수 있게 됩니다.
방법은 아래..

문제해결 #2 : 자신의 서버나 남의 서버나 SMTP를 이용해서 메일을 보내보자
자신의 서버에 SMTP를 깔아서 보내면 가장 쉬운방법이겠지만 여건상 그러지 못하는 경우가 있다.. win98일경우 다른 SMTP를 깔아야되는데 만만치 않을 것이다. 이럴경우 다른곳의 SMTP를 이용하면 됩니다.
자신이 가입되어 있는 포탈사이트나 PC통신 사이트에 문의 하시면 SMTP서버의 주소를 알수 있습니다.
자신의 서버에 SMTP를 깔아 운영하는 분이라면.. SMTP주소는 localhost 나 자신의 IP주소가 되겠습니다.

★ SMTP를 이용해서 메일 보내는 방법

다음과 같이 쓰면 되겠습니다.

<?
    $host 
"localhost"// 이건 자신의 컴터에 깔려있다면 이고 다른 SMTP를 이용하는 분이라면 다른 주소를 써주시면 됩니다.
    
$port 25;
    
$tomail "받는 사람 메일주소";
    
$frommail ="보내는 사람 메일주소";
    
$webid="보내는 사람 이름 또는 ID";
    
$subject "제목";
    
$type "text/html"// 이건 html 형식으로 보낼때 씁니다.
    
$message "내용";

    
$fp fsockopen($host$port, &$errno, &$errstr30); 

    if(
$fp) {

        
fgets($fp128); 
        
fputs($fp"helo $HTTP_HOSTrn"); 
        
fgets($fp128); 
        
fputs($fp"mail from: <$frommail>rn"); 
        
$returnvalue[0] = fgets($fp128); 
        
fputs($fp"rcpt to: <$tomail>rn"); 
        
$returnvalue[1] = fgets($fp128);
        
fputs($fp"datarn"); 
        
fgets($fp128); 
        
fputs($fp"Return-Path: $frommailrn"); 
        
fputs($fp"From: "$webid" <$frommail>rn"); 
        
fputs($fp"To: <$tomail>rn"); 
        
fputs($fp"Subject: $subjectrn"); 
        
fputs($fp"Content-Type: ".$type."; charset="euc-kr"rn"); 
        
fputs($fp"Content-Transfer-Encoding: base64rn"); 
        
fputs($fp"rn"); 

        
$messagechunk_split(base64_encode($message)); 
        
fputs($fp$message); 
        
fputs($fp"rn"); 
        
fputs($fp"rn.rn"); 
        
$returnvalue[2] = fgets($fp128); 
        
fclose($fp); 

        if (
ereg("^250"$returnvalue[0])&&ereg("^250"$returnvalue[1])&&ereg("^250"$returnvalue[2])) {
            
$sendmail_flag true;
        }
    }

    if (
$sendmail_flag) {
        echo 
"메일 보내기 성공";
    } else {
        echo 
"메일 보내기 실패";
    }
?>


이런식으로 보내면 됩니다.
자세한 각 라인에 대한 설명은 책에 되어 있습니다.

☆★ 만약 야후나 기타 SMTP 에서 인증을 요구 하는 경우가 있습니다 이경우에는 다음과 같이 사용하면 되겠습니다.
위와 같고요. 인증부분만 추가해주면 됩니다.

<?
    $smtp_id 
"smtp 아이디";
    
$smtp_pwd "smtp 패스워드";

    
$host "smtp.mail.yahoo.co.kr"// 이건 자신의 컴터에 깔려있다면 이고 다른 SMTP를 이용하는 분이라면 다른 주소를 써주시면 됩니다.
    
$port 25;
    
$tomail "받는 사람 메일주소";
    
$frommail ="보내는 사람 메일주소";
    
$webid="보내는 사람 이름 또는 ID";
    
$subject "제목";
    
$type "text/html"// 이건 html 형식으로 보낼때 씁니다.
    
$message "내용";

    
$fp fsockopen($host$port, &$errno, &$errstr30); 

    if(
$fp) {

        
fgets($fp128); 
        
fputs($fp"helo $HTTP_HOSTrn"); 
        
fgets($fp128); 

        
// 이부분에 다음과 같이 로긴과정만 들어가면됩니다.
        
fputs($fp"auth loginrn");
        
fgets($fp,128);
        
fputs($fpbase64_encode($smtp_id)."rn");
        
fgets($fp,128);
        
fputs($fpbase64_encode($smtp_pwd)."rn");
        
fgets($fp,128);

        
fputs($fp"mail from: <$frommail>rn"); 
        
$returnvalue[0] = fgets($fp128); 
        
fputs($fp"rcpt to: <$tomail>rn"); 
        
$returnvalue[1] = fgets($fp128);
        
fputs($fp"datarn"); 
        
fgets($fp128); 
        
fputs($fp"Return-Path: $frommailrn"); 
        
fputs($fp"From: "$webid" <$frommail>rn"); 
        
fputs($fp"To: <$tomail>rn"); 
        
fputs($fp"Subject: $subjectrn"); 
        
fputs($fp"Content-Type: ".$type."; charset="euc-kr"rn"); 
        
//fputs($fp, "Content-Transfer-Encoding: base64rn"); 
        
fputs($fp"rn"); 

        
$messagechunk_split(base64_encode($message)); 
        
fputs($fp$message); 
        
fputs($fp"rn"); 
        
fputs($fp"rn.rn"); 
        
$returnvalue[2] = fgets($fp128); 
        
fclose($fp); 

        if (
ereg("^250"$returnvalue[0])&&ereg("^250"$returnvalue[1])&&ereg("^250"$returnvalue[2])) {
            
$sendmail_flag true;
        }
    }

    if (
$sendmail_flag) {
        echo 
"메일 보내기 성공";
    } else {
        echo 
"메일 보내기 실패";
    }
?>


☆☆ 참고사항
다음은 야후메일 telnet 으로 smtp 접속한 예입니다.

C:> telnet smtp.mail.yahoo.co.kr 25

220 smtp018.mail.yahoo.com ESMTP
HELO YA
250 smtp018.mail.yahoo.com
AUTH LOGIN
334 VXNlcm5hbWU6  // 이건 서버에서 반환된 값인데 base64로 디코딩하면 Username: 입니다.
dAdesDsadfefDwMDRrcg==        // 이부분은 base64로 인코딩한 부분입니다. (smtp_id)
334 UGFzc3dvcmQ6  // 이건 서버에서 반환된 값인데 base64로 디코딩하면 Password: 입니다.
AdfEfadsfdDNDU=        // 이부분은 base64로 인코딩한 부분입니다. (smtp_pwd)
235 ok, go ahead (#2.0.0)
MAIL FROM: <test@mail.com>
250 ok
RCPT TO: <test@mail.com>
250 ok
DATA
354 go ahead
Return-Path: test@mail.com
From: TEST <test@mail.com>
To:<test@mail.com>
Subject:  제목
Content-Type: text/html; chareset=euc-kr
Content-Transfer-Encoding: base64

내용

.
250 ok 1045917446 qp 9339
quit
221 smtp018.mail.yahoo.com


++ 여기까지가 직접 연결해본 것입니다.

 
 

Total 121
번호 제   목 글쓴이 날짜 조회
16 [PHP] 접속 정보 확인 기리 03-31 3314
15 [JavaScript] 날자계산 (1) 관리자 03-29 3155
14 [MySql] mysql - 외부접속 허용하기 기리 03-16 3843
13 [JavaScript] JavaScript (6) 기리 07-12 20386
12 [PHP] php (7) 관리자 06-23 5464
11 [MySql] Mysql 함수 기리 06-23 4305
10 [PHP] PHP xls, csv 출력 (1) 관리자 06-17 5553
9 [MySql] mysqldump (2) 기리 03-27 2518
8 [Linux] 리눅스 du (1) 관리자 03-23 2481
7 [Linux] crontab 관리 및 사용 관리자 03-08 2503
6 [PHP] PHP.INI 의 옵션 관리자 03-03 2629
5 Apache, MySQL, PHP 설치 가이드 (Linux) 관리자 03-03 1853
4 [PHP]SMTP에서 메일을 보내보자 관리자 03-03 2922
3 svn 변경된 파일만 export 하기 (1) 관리자 02-28 12984
2 [Linux] 리눅스 - 복사 강제 덮어쓰기 (3) 관리자 02-23 10304
 1  2  3  4  5  6  7  8  9