겸손한 개발을 위한 자양분

PHP 에서 mail 함수 정상 동작하는지 확인하는 소스
<?php
 //$mailto="받는주소";
 $mailto="sample@a.com";
 $subject="mail test";
 $content="test";
 $result=mail($mailto, $subject, $content);
 if($result){
  echo "mail success";
  }else  {
  echo "mail fail";
 }
?>

test.php 로 저장하여,
웹페이지에서 로드했을때
mail success 가 찍혀야 정상

만약, 위 소소에서 mail success 가 찍히는데
각종 커스텀 보드에서 메일 발송이 되지 않는다면,
php소스에서 mail 함수의 각 인자들을 확인해본다.

error_log($mailto, 0);  // mailto 변수를 서버의 에러로그에 찍는다.
error_log($subject, 0);

가령,
<?php
 //$mailto="받는주소";
 $mailto="sample@a.com";
 $subject="mail test";
 $content="test";
 $result=mail($mailto, $subject, $content);
 if($result){
  echo "mail success";
  }else  {

  error_log($mailto, 0); 

  echo "mail fail";
 }
?>
일 경우,
Apache 서버를 구동중이라면,
Apache\logs\error.log
파일에 mailto 변수의 내용이 찍힌다.

지금 내가 사용중인 환경은
Apache2.2.8 + SMTP(W2K3 R2) + PHP5.2.5

위와 같이 테스트에서 이상이 없었으나,
제로보드에서는 메일을 보내지 못하는 현상이 발생한다.

따라서,
제로보드의 메일발송 소스를 확인해보니,
받는 사람(Receiptor) 변수에

위의 예제에서는 "sample@a.com" 이지만,
제로보드는 "받는사람 이름 <sample@a.com>"을 설정한다.

Receiptor 변수를 임의로 "sample@a.com"으로 수정하고
정상 작동하는 것을 확인
해당 소스를 수정해주었다.

제로보드\classes\mail\Mail.class.php
function getReceiptor() {
  //if($this->receiptor_name) return sprintf("%s <%s>", '=?utf-8?b?'.base64_encode($this->receiptor_name).'?=', $this->receiptor_email);
  return $this->receiptor_email;
}

수정이후 정상 발송 확인
끝~!

Outlook Express에서 메일 발송이 되지 않는다.

기술 자료 ID : 601904
마지막 검토 : 2003년 7월 28일 월요일
수정 : 1.3
이 문서는 이전에 다음 ID로 출판되었음: KR601904

현상

Exchange 2000을 설치 후 클라이언트에서 Outlook Express을 설정하고 외부로 메일을 보낼 때 다음과 같은 에러가 발생합니다.
"받는 사람 중 한 사람이 서버에서 거부되었으므로 메시지를 보낼 수 없습니다. 
거부된 전자 메일 주소는 'mgkim7@hotmail.com'입니다. 
제 목 'Test', 계정: '157.60.8.33', 서버: '157.60.8.33', 프로토콜: SMTP, 
서버 응답: '550 5.7.1 Unable to relay for mgkim7@hotmail.com', 포트: 25, 
보안(SSL): 아니오, 서버 오류: 550, 오류 번호: 0x800CCC79"
					

위로 가기

원인

SMTP 가상 서버에서 릴레이(Relay)가 거부되었기 때문입니다.

위로 가기

해결 방법

방법 1 : Outlook Express를 실행하는 컴퓨터가 릴레이가 가능하도록 다음의 단계를 실행하여 SMTP 가상서버의 Relay Restrictions에 클라이언트 컴퓨터를 추가합니다.

1. Exchange System Manager를 열고 Administrative Group - First Administrative Group – Servers - COMPUTER_NAME – Protocols - SMTP 아래로 확장합니다.
2. Default SMTP Virtual Server의 등록정보를 엽니다.
3. Access 탭에서 Relay 단추를 클릭합니다.
4. Relay Restrictions 화면에서 클라이언트 컴퓨터를 추가합니다.
방법 2 : SMTP 가상 서버에서 Allow all computers which successfully authenticate to relay, regardless of the list above가 활성화되어 있는 경우에는 다음과 같이 Outlook Express에서 보내는 메일 서버에 로그온 하도록 설정합니다.

1. Outlook Express를 실행하고 도구 메뉴에서 계정을 선택합니다.
2. 메일 계정을 선택하고 등록 정보 단추를 선택합니다.
3. 서버 탭을 선택하고 보내는 메일 서버에서 인증 필요 체크 박스를 선택하고 설정 단추를 누릅니다.
4. 보내는 메일 서버 화면에서 보내는 사람의 계정이 받는 메일 서버의 계정과 같은 경우에는 받는 메일서버와 동일한 설정 사용 라디오 단추를 선택합니다. 계정이 다른 경우에는 로그온 정보에 계정이름과 암호를 입력합니다.

앞서
WebSVN 에서 특정 저장소에 PREFIX 를 설정하여,
나타나지 않도록 하게 하였었다.

특정 저장소 리스트 숨기는 방법 보러가기

업무를 진행하다보니,
이번에는 공개된 저장소에서도 특정 폴더를
나타나지 않게 할 필요성이 있게 되었다.

WebSVN 은 저장소와 폴더(파일)의 개념이 독립적이기 때문에
수정 위치가 다르다.

다음과 같이 설정하여,
 "_preserve_" 라는 문자열로 시작되는 폴더를 숨길 수 있다.

< WebSVN \ listing.php >

function showDirFiles($svnrep, $subs, $level, $limit, $rev, $listing, $index, $treeview = true)
{
   global $rep, $passrev, $showchanged, $config, $lang;
   $path = "";
   if (!$treeview)
      $level = $limit;
   for ($n = 0; $n <= $level; $n++)
   {
      $path .= $subs[$n]."/";
   }
   $contents = $svnrep->dirContents($path, $rev);
   // List each file in the current directory
   $loop = 0;
   $last_index = 0;
   $openDir = false;
   $fullaccess = $rep->hasReadAccess($path, false);
  
   foreach($contents as $file)
   {
      $isDir = ($file{strlen($file) - 1} == "/"?1:0);
      $access = false;
      if( $isDir                              &&
          strncmp($file,"_preserve_",10) == 0 )
         continue;
      if ($isDir)
      {
         if ($rep->hasReadAccess($path.$file, true))

 ...
붉은색 코드가 추가된 부분이다.

만약, 폴더 뿐만이 아니라 파일까지 숨기고 싶다면,
위 코드 대신 아래의 코드를 삽입하면 된다.
      if( strncmp($file,"_preserve_",10) == 0 )
         continue;

마찬가지로,
특정 헤더에 설정값을 받도록 할 수 있겠지만,
귀차니즘...

끝!

osr에서 배포한 확장 모듈 사용.
KD> !osrexts.sst

사용자 삽입 이미지