웹에서 메일 보내기
웹에서 메일을 보내면 제목이 Mail Delivery Subsystem 이런 메세지가 날라옵니다.
내용은..
The original message was received at Fri, 2 Mar 2007 08:26:24 +0900 from apache@localhost ----- The following addresses had permanent fatal errors ----- @localhost ----- Transcript of session follows ----- 553 5.1.3 @localhost... User address required Final-Recipient: RFC822; @localhost X-Actual-Recipient: rfc822; "553 User address required"@localhost.localdomain Action: failed Status: 5.1.3 Last-Attempt-Date: Fri, 2 Mar 2007 08:26:24 +0900
sendmail 설정에 문제가 있는건지 php로 만든 스크립트에 문제가 있는건지
아니면 다른 문제인지 모르겠습니다.
sendmail 설정은 별다른게 없고 access에 릴레이 할 호스트명들을 적어줬습니다.
대신 iptables로 접근제한을 했습니다.
이렇게 하고나니 access에 등록한 호스트에서 smtp를 사용할때는
아이디와 비밀번호 없이도 메일전송이 되더군요.
혹시 이게 문제의 발단인지 모르겠습니다.
그리고 php로 만든 스크립트는 예전부터 잘 쓰던거라 문제가 없을꺼라 보지만
한번도 남에게 검증받은 적이 없어서 혹시나해서 올려봅니다.
<?php
require_once('Mail.php');
require_once('Mail/mime.php');
$body = $_POST['body_mail'];
$headers = array(
'From' => 'manager@gmail.com',
'To' => $_POST['to_mail'],
'Subject' => $_POST['subject_mail']
);
// 참조자에는 항상 메일관리자 이메일주소를 추가하여 모니터링.
$recipients = $_POST['bcc_mail'] . ",postmaster@gmail.com";
$mime = new Mail_mime();
$mime->setHTMLBody($body);
$encoded_body = $mime->get($msg_build_param);
$encoded_headers = $mime->headers($headers);
$params['sendmail_path'] = '/usr/lib/sendmail';
$mail =& Mail::factory('sendmail', $params);
$mail->send("", $encoded_headers, $encoded_body);
?>
무엇이 문제일까요?
아래처럼
아래처럼 보낸사람주소(회신주소)가 'apache@localhost'로 잘못 지정되어 나가면서 발생하는 문제로 추측됩니다만...
http://passkorea.net/support/FAQ/ViewDoc.aspx?cat=11&docNo=28977
헤더에는 분명히
헤더에는 분명히 From에 실제 존재하는 이메일 주소가 붙어있었습니다.
문제는 return-path 에
문제는 return-path 에 apache@localdoamin.localhost 가 붙는다는 얘기죠.
그리고, 일단 localhost.localdomain 이 붙었다는 얘기는 님의 서버의 hostname 이 FQDN 으로 설정이 안되어 있다는 것으로 이것도 문제중에 하나 입니다.
Header 는 user define hedaer 이고, return-path 는 MTA 가 붙이는 헤더 입니다. 아, 물론 return-path 도 위조가 가능하기는 합니다. :-)
김정균님이 잘
김정균님이 잘 설명해주셨네요.
보낸사람주소(회신주소)... 즉 return-path 를 제가 알려드린 주소의 방법을 참고하셔서
실제 존재하는 메일계정으로 지정해서 다시 발송테스트를 해보셔야 할겁니다.
헤더에 return-path를 쓴
헤더에 return-path를 쓴 상태이고 알려주신 방법을 써봤지만 여전히 동일한 오류 메일이 날라옵니다.
메일로그를 통해
메일로그를 통해 보낸사람 주소가 어떻게 기록되는지 확인해보셔야 할 것 같습니다.
tail -n50 /var/log/maillog
로그에도 @localhost..
로그에도 @localhost.. 와 같이 User address가 없다는 동일한 오류메세지가 남아있습니다.
다른 방법을 쓸수없는 상황이라서 해결되면 이곳에 다시 쓰겠습니다.
참고로 웹에서 php와 같은 스크립트를 사용하면 이런 오류가 발생하지만
이메일 에이젼트나 프로그램을 사용하면 정상적으로 메일이 발송됩니다.
PHP의 PEAR Class를
PHP의 PEAR Class를 사용하신 듯 한데 이 경우 문제없이 발송이 되어야 정상인데 이상하군요.
지금처럼 발송방법을 sendmail 을 사용하도록 해두었다면
'From'헤더의 값을 MTA에서 return-path로 사용하도록 설정됩니다.
ex) /usr/lib/sendmail -fUserID@domain.com
PEAR Class가 문제(구버젼 등)가 있거나 sendmail 에서 '-f'옵션을 인식하지 못하는게 아닐까 추측됩니다.
PEAR Class 문제가 아니라면 발송방법을 'sendmail'이 아닌 소켓방식으로 변경해서 테스트해보시는게 어떨까요?
호스트명을 FQDN으로
호스트명을 FQDN으로 변경하고나서는 잘 되네요.
PEAR의 Mail_Mime 클래스내에서 헤더를 설정해놓은게 무시되는것 같습니다.
정확한건 아니지만 $mime->headers() 메소드는 잘 동작하는데 Mail 클래스의 send 메소드에서는
헤더가 무시되고 sendmail 서버의 설정을 따르는것 같습니다.
FQDN으로 해보니
FQDN으로 해보니 스팸으로 처리가 되는듯 하네요.
일단 성공이다 싶었는데.. 잠시 기다리니 역시 동일한 오류메세지가 날라옵니다.
댓글 달기