2010-02-09 1 views
1

스노우 레오파드에 로컬 개발 환경을 설정했고, isp 메일 서버를 통해 이메일을 보내기 위해 postfix를 설정했습니다.Postfix가 전자 메일 헤더를 망쳤습니다!

필자는 결국 많은 좌절감을 느낀 후 포스트 픽스를 얻었지만, 지금은 내 이메일이 헤더 정보를 보낸다.

나는 다음과 같은 PHP 코드를 사용하고 있습니다 :

 
$email = "[email protected]"; 
$subject = "Email tester"; 
$body = "Simple test"; 
$header = "From: [email protected] \r\n"; 
$header .= "MIME-VERSION: 1.0\r\n"; 
$header .= 'Content-type: text/html; charset=iso-8859-1' . "\r\n"; 
$phpversion = phpversion(); 
$header .= "X-Mailer: PHP v$phpversion\r\n"; 
mail($email,$subject,$body,$header); 

echo "message sent!"; 

받는 사람 : 및 제목 : 헤더가 표시 그들이해야로서, 헤더!하지만 전자 메일 본문의 나머지 표시한다. 이렇게하면 이메일 클라이언트의 보낸 사람 필드가 비어있는 것처럼 보입니다.

나는 아주 간단한 PHP 스크립트를 여러 번 시도했지만 똑같은 헤더가 항상 이메일 본문에 표시됩니다.

나는 그것이 후위 문제 일 수 있다고 생각하지만 확실하지는 않습니다. 누구든지 이런 유형의 문제가 발생 했습니까?

+0

줄 끝은 아무 쓸모가 없었습니다. ( –

답변

3

예를 들어 * additional_headers *, 즉 $ header에 \ r \ n 대신 PHP_EOL을 사용하십시오. PHP_EOL은 실행중인 OS에 따라 개행 문자를 대체합니다.

또한 메시지에는 LN 만 포함되어야합니다 (예 : \ n). 이것은 PHP 문서에 따라 다릅니다. 각 줄은 LF (\ n)로 구분해야합니다. 행은 70자를 넘지 않아야합니다.

스크립트에서 두 가지 기준을 모두 충족하는지 확인하십시오.이를 달성하려고 시도했지만 마침내 Postfix의 기본 구성으로 작동하게되었습니다.

+0

RFC 821에서 CRLF로 줄 바꿈이 명확하게 요구되므로 일부 메일 서버는 비표준 줄 끝 기호로 된 메시지를 거부합니다. LN 만 (iirc qmail은 그렇습니다.) – Cedric

+0

여기 RFC에서는 말하지 않지만 PHP와 Postfix는 PHP가 mail() 함수로 전송되는 본문 메시지에 LN 만 사용해야한다는 것을 명확히 정의하고 있습니다. 그 이상으로 - 올바른 형식으로 Postfix로 보내지는 최종 메시지를 변환 할 수 있습니다 –

+0

헤더 본문에는 yes이지만 메시지 본문에는 없습니다 : PHP 문서에서 발췌 : "여러 개의 추가 헤더는 CRLF (\ r \ n). " – Cedric

2

거의 100 % 포스트 픽스 문제가 아니지만 코드로 인해 발생하는 문제입니다. 헤더 뒤에 빈 CRLF가 표시되면 본문이 시작됩니다.

전자 메일 본문을 덤프하고 실수로 추가 CRLF를 도입하지 않는지 확인하십시오.

0

(이 때문에 많은 스크립트를 개선하고 싶지 않기 때문에)이 문제를 자세히 조사한 결과, PHP와 Postfix 개발자 간에는 큰 갈등이 있다는 것을 알게되었습니다. 지금까지. 당신은 여기에 다양한 정보를 읽을 수 있습니다 : 유닉스에 센드 메일에서 메일을 따기와 가 CRLF로 보낼 때 것을 대체 할 때

http://www.mail-archive.com/[email protected]/msg03226.html

후위는 EOL가 LF가 될 것으로 기대하고있다. CRLF를 얻으면 여전히 LF를 대체하며 CRCRLF을 얻습니다.

깨진 헤더를 설명합니다. 이를 해결하기 위해서는 Postfix와 PHP/mail 시스템이 어떻게 작동하는지 정확히 알아야합니다. 위에서 설명한 문제가 발생하면 "\ r \ n"대신 "\ n"을 사용하십시오. Windows/Unix에서 모두 실행될 수있는 복잡한 시스템을 프로그래밍하는 경우 $ eeol = "\ r \ n"과 같은 추가 매개 변수를 추가하십시오. 직접 "\ r \ n"태그 대신에 붙여지며 모든 시스템에 대해이 방법을 쉽게 구성 할 수 있습니다.

그게 후위 저자가 추천하는 접근 방식 가정 : PHP 애플리케이션 프로그래머 일관된 방식으로 전자 메일 메시지를 포맷하는 경우

정말 좋은 것입니다.예를 들어, LF 또는 CRLF 행 종결자를 하드 코딩하지 않고 END-OF-LINE 종결자를 포함하는 변수를 사용할 수 있습니다.