세이박스

[PHP] 보안서버(ssl)에서 메일 발송 하기

웹프로그램
보안 서버로 ssl 적용 후 부터 php 메일 발송시 발송이 안되기 시작하였다.

원인을 확인 해보니 보안 smtp 로 발송해야 한다는 사실을 알게 되었다.

그래서, 이래저래 알아보니 메일 서버가 별도로 있는경우 보안 릴레이 방식으로 발송을 하면 된다는것을 알게되어 적용 하였다.

먼저, 메일서버의 릴레이 발송할 개정이 하나 있어야 한다.

다음 함수에 메일서버 ip 및 릴레이 개정 정보를 입력하시면 됩니다.

function sendmail($name, $from, $to, $subject, $body, $html, $charset ) {
 $smtp_server   = "아이피"; //stmp ip를 입력
 $smtp_user = "아이디"; //smtp id 입력
 $smtp_passwd = "비밀번호"; //smtp 비밀번호 입력

 if(!$smtp_sock = fsockopen("$smtp_server", 25)) {
  return false;
 }
 fputs($smtp_sock, "AUTH LOGIN\n");
 fputs($smtp_sock, base64_encode($smtp_user)."\n");
 fputs($smtp_sock, base64_encode($smtp_passwd)."\n");
 fputs($smtp_sock, "HELO $smtp_server\n");
 fputs($smtp_sock, "VRFY $stmp_user\n");
 fputs($smtp_sock, "MAIL FROM:$from\n");
 fputs($smtp_sock, "RCPT TO:$to\n");
 fputs($smtp_sock, "DATA\n");
 fputs($smtp_sock, "From: $name<$from>\n");
 fputs($smtp_sock, "X-Mailer: miplus\n");  
 if($html) fputs($smtp_sock, "Content-Type: text/html;");
 else fputs($smtp_sock, "Content-Type: text/plain;");  
 fputs($smtp_sock, "charset=$charser\n");
 fputs($smtp_sock, "MIME-Version: 1.0\n");
 fputs($smtp_sock, "Subject: $subject\n");
 fputs($smtp_sock, "To: $to\n");
 fputs($smtp_sock, "$body");
 fputs($smtp_sock, "\n.\nQUIT\n");
 fclose($smtp_sock);
 return true;
}

$text = "<html><body>test</body></html>"; //html 방식으로 발송 가능
$subject = "메일제목";
$from = "
custom@test.co.kr"; //발송자 이메일 주소
$from_name = "이름"; //발송자 이름
$to =
member@test.co.kr" //수신자 이메일 주소
$html = 1; //HTML 테그 1:사용, 0:사용안함
$charset = "UTF-8"; //언어 EUC-KR, UTF-8

if(sendmail($from_name,$from,$to,$subject,$text,$html,$charset)) {
   echo "발송완료";
} else {
   echo "발송실패";
}

빨간색으로 표시한 부분만 설정에 맞게 고쳐서 이용하시면 됩니다.

SMTP 서버 릴레이 방지

서버,보안

SMTP 가상 서버를 통해 전자 메일 메시지를 릴레이하는 사용자나 컴퓨터의 경우 다음 두 조건을 충족시켜야 합니다.
- 사용자나 컴퓨터는 SMTP 가상 서버에 액세스할 수 있어야 합니다.
- SMTP 가상 서버가 다른 도메인에 전자 메일 메시지를 릴레이하도록 구성되어 있어야 합니다.

IIS SMTP 가상 서버가 전자 메일 메시지를 릴레이하는 것을 방지하는 방법
1. 인터넷 정보 서비스 관리자를 시작하거나 인터넷 정보 서비스(IIS)
스냅인을 엽니다.
2. Server_name을 확장한 다음(여기서 Server_name은 서버 이름임) 기본
SMTP 가상 서버를 마우스 오른쪽 단추로 누른 다음 속성을 누릅니다.
3. 액세스 탭을 누른 다음 액세스 제어에서 인증을 누릅니다.
4. 기본 인증과 Windows 통합 인증 확인란 중 하나 또는 둘 모두를
선택하고 익명 액세스 확인란이 선택된 경우 선택을 취소한 다음
확인을 누릅니다.

이렇게 하면 인증을 해야 SMTP 가상 서버에 대한 액세스를 부여받을
수 있습니다. 이 경우 사용자나 컴퓨터가 성공적으로 인증되지 않으면
해당 사용자나 컴퓨터는 서버에 메일을 보낼 수 없습니다.

참고: 익명 액세스 확인란을 선택하고 기본 인증과 Windows 통합 인증
확인란 선택을 취소한 경우 모든 사용자와 컴퓨터가 SMTP 가상 서버에
액세스할 수 있습니다.

이렇게 하면 인증이 해제됩니다.
5. 릴레이 제한에서 릴레이를 누릅니다.
6. 릴레이 제한 대화 상자에서 사용할 수 있는 옵션을 확인합니다.
기본적으로 아래 목록만 옵션이 선택되어 있고 이 목록은 비어
있습니다. 또한 위 목록과 상관없이 인증한 모든 컴퓨터에 릴레이
가능 옵션이 선택되어 있습니다. 이 기능을 사용하면 서버에 인증을
받을 수 있는 사용자와 컴퓨터는 서버를 통해 릴레이할 수 있습니다.
액세스 탭의 인증 대화 상자에서 구성한 인증 요구 사항을 충족시키는
컴퓨터를 제외한 모든 컴퓨터가 차단됩니다.

익명 액세스만 허용할 경우에는 서버가 사용자나 컴퓨터를 인증하지
않습니다.
7. 추가를 누른 다음 단일 컴퓨터, 컴퓨터 그룹 또는 도메인을
추가합니다.
- 단일 컴퓨터를 누릅니다.
IP 주소 상자에서 원하는 컴퓨터의 IP 주소를 입력한 다음 확인을
누릅니다.
- 컴퓨터 그룹을 누릅니다.
해당하는 상자에 그룹의 서브넷 주소와 서브넷 마스크를 입력한
다음 확인을 누릅니다.
- 도메인을 누릅니다.
이름 상자에 원하는 도메인 이름을 입력한 다음 확인을 누릅니다.
- 컴퓨터, 컴퓨터 그룹 또는 도메인을 추가하지 않으려면 취소를
누릅니다.

8. 확인을 차례로 두 번 누릅니다.
 

제가 썼던 방법은 릴레이 가능한 IP만 등록해서 해결했습니다..  ^^

ASP 메일발송시 오류 Microsoft VBScript 런타임 오류 error '800a0046' 사용 권환이 없습니다.

웹프로그램
윈도우서버의 SMTP 를 이용한 메일 발송시 사용권환이 없다는 오류가 발생 하는 경우

Microsoft VBscript 런타임 오류 error '800a0046'
사용 권한이 없습니다.

.........
set objmail = server.CreateObject("cdonts.newmail") '메일 객체 선언
objmail.from=strfrom
objmail.to=strto
objmail.subject=strsubject
objmail.body=strbody
objmail.importance=1 '중요도
objmail.bodyformat = 0
objmail.mailformat = 0
objmail.send '메일 보내기
set objmail=nothing '메일 객체 닫기
..............
objmail.send '메일 보내기 <-- 요부분이 오류가 발생


비슷한 코딩으로 사용했을 겁니다.
정확한 해결방법인지는 모르겠지만 저의 경우 다음과 같은 이유로 해결되었습니다.


c:\inetput\mailroot\ 폴더에 보안 설정에 쓰기 권환을 주는것으로써
폴더의 등록정보 > 보안 에서
인터넷 게스트 개정 (IUSER_ ), IIS 프로세스 시작 개정 (IWAM_ )
두 개정에 쓰기권환을 주셔야합니다.

IIS가 메일 발송처리 되면서 임시로 메일을 기록하거나 실패한 메일 보관또는 수신메일 저장 권환이 없어서 생긴 오류더군요.

그럼 같은 증상으로 해결되길 바랍니다. 

Telnet을 이용한 SMTP 테스트 방법

서버,보안
 
Rational ClearQuest는 SMTP를 이용해서 메일을 전달합니다(다른 방법이 있기는 한데, 제가 아직 이쪽에 경험이 부족한지라 생략).
SMTP의 간편함을 적용한 것인데, 문제는...
대개의 ClearQuest admin께서 SMTP 사용하기 위한 SMTP설정이나 네트웍환경에 대해서는 잘모르시고 경험도 부족하기에
제대로된 메일 전달 테스트를 하기가 어렵습니다.
(대개의 고객 사이트를 확인해보면 시스템관리자분들이 메일서버나 네트웍환경까지 관리하십니다만).
특히 윈도우 2000이나 2003의 SMTP서비스를 가지고 몇일 몇밤을 고생하십니다.
(모든 경우수를 동원해서 설정값을 바꿔보게 되지요).
 
그래서 ClearQuest 엔지니어가 해야할 작업(역할)은 아니지만, 이런 상황에서 도움을 드리고자 한가지 방법을 설명하겠습니다.
 
Telent을 이용해서 SMTP 정상작동하는지 확인하는 방법입니다.
(윈도우 2000에서도 확인을 해보았는데, 아래 설명과는 유사하지 않게 결과가 보여집니다.  SMTP가 정상작동하지 않는다는 거죠).
 
 
cmd창에서.
 
>>> 윈도우 2000의 경우입니다.  <<<
1. telnet 25 를 입력 합니다.
( 예 : telnet smtp.xxx.com 25 )

다음과 비슷한 출력이 표시됩니다.
220 computername.microsoft.com ESMTP Server (Microsoft Exchange Internet Mail Service 5.5.2651.58) ready
                   
2. helo me를 입력하고 Enter 키를 누릅니다.
다음과 비슷한 출력이 표시됩니다.
250 OK

3. mail from:email@domain.com을 입력하고 Enter 키를 누릅니다. 다음과 비슷한 출력이 표시됩니다.
250 OK - mail from
                   
4. rcpt to:youremail@yourdomain.com을 입력하고 Enter 키를 누릅니다. 다음과 비슷한 출력이 표시됩니다.
250 OK - Recipient

5. Data를 입력하고 Enter 키를 누릅니다. 다음과 비슷한 출력이 표시됩니다.
354 Send data. End with CRLF.CRLF

6. Subject:This is a test를 입력하고 Enter 키를 두 번 누릅니다.

7. Testing을 입력하고 Enter 키를 누릅니다.

8. Enter 키를 누르고 마침표(.)를 입력한 후 Enter 키를 누릅니다. 다음과 비슷한 출력이 표시됩니다.
250 OK

10. quit를 입력하고 Enter 키를 누릅니다. 다음과 비슷한 출력이 표시됩니다.
221 Closing Port / Mail queued for delivery
 
그러나 대개의 경우 이렇게 진행하지 못하실 겁니다.  윈도우 2000에서 SMTP 설정하는 방법을 모르기 때문에 정상동작하지 않으므로 위와 같은 결과가 뿌려지지 않겠죠.
 
>>> OK SMTP Server <<<
SMTP 를 제공하는 별도의 모듈을 사용합니다(쉐어웨어입니다).
(이 모듈에 대한 셋업방법은 윈도우 2000보다는 간단하기에 여기서는 설명하지 않습니다).
 
순서는 위에 설명된 윈도우 2000의 경우를 참고하세요.
유사한 결과가 나오기 때문에 확인하실 수 있을 겁니다.