2010-07-16 6 views
0

들어오는 전자 메일을 처리하고 Blogger에 블로그 항목을 만드는 스크립트를 설정했습니다. 들어오는 메시지를 읽으려면 PEAR의 Mail_Mime 라이브러리 (지금은)를 사용하고 있습니다. 메시지에는 브라우저에서 읽을 수없는 문자가 포함되어있는 경우가 종종 있습니다. 이는 사람들이 Outlook을 사용하거나 MS Word에서 잘라내 기/붙여 넣기를 할 때 가장 자주 발생합니다.HTML 표시 용 수신 전자 메일의 서식을 지정하는 방법

그래서 다른 쪽의 출력은 다음과 같은 것입니다 : 여기

는 "따옴표"와 '와 함께 테스트 게시물입니다 그 가치는, 또한 이상한 dashesand 다른 무슨 apostrophesfor MS Word에서 잘라내어 붙여 넣기를 포맷합니다.

야생에서는 see the output 일 수도 있습니다.

특정 인스턴스를 수정하는 것은 어렵지 않지만 각 클라이언트 (hotmail, gmail, Outlook 등)는 상황을 조금 다르게 처리하는 것처럼 보입니다. Mail_Mime은 출력을 무시하는 것처럼 보입니다. Mail_Mime의 구문 분석을 끄고 mb_convert_encoding이나 수동 시뮬레이션을 사용하여 인코딩 된 문자를 직접 번역하려고하면 오류가 더 심해집니다.

올바른 인코딩 유형을 선택하고 디코드/인코딩/변환 기능을 사용하면 해결되지 않을 수 있습니다. 들어오는 형식은 Windows-1252에서 UTF8까지 다양하며 메일 클라이언트가 생각할 수있는 모든 것까지 다양합니다.

이 방법으로 스크립트를 작성한 사람이라면 누구나 최선의 방법에 대한 샘플이나 조언을 제공하여 시간을 절약 할 수 있습니까? 모든 간단한 대답을 시도하고 실험을 많이 했으므로 유사한 문제를 성공적으로 처리하지 않았거나 인코딩 문제를 깊이 이해하지 않는 한 응답하지 마십시오.

+0

전자 메일 메시지는 헤더에 지정된대로 해석되어야합니다 (* Content의 * charset * 매개 변수 참조). - 유형 * 필드). 누락 된 경우 RFC 5322는 US-ASCII를 의미합니다. – Gumbo

+0

이것은 Mail_Mime에 의해 자동으로 수행됩니다. 문제는 단순히 프로토콜을 이해하는 것보다 훨씬 복잡합니다. – Kato

+0

이 게시물은 흥미로운 생각을 가지고 있습니다 : http://stackoverflow.com/questions/2686515/problem-with-character-encoding-on-email-sent-via-php 어떻게 적용 할 수 있는지 알 수 없었습니다. 그래도 내 문제. – Kato

답변

0

이 문제를 해결하고 브라우저에서 읽을 수있는 유효한 UTF-8로 메시지를 가져 오려면이 PHP 라이브러리 (ConvertCharset by Mikolaj Jedrzejak)가 거의 모든 것을 처리했습니다. Windows-1252 또는 iso-8859-1에서 변환 할 때 여전히 특정 기호 (= A0)와 관련된 문제가있었습니다. 그래서 코드를 느슨하게 설정하기 전에이 캐릭터를 수동으로 변환했습니다.

여기가 전체의 모습입니다 :

// decode using Mail_Mime 
require 'Mail.php'; 
require 'Mail/mime.php'; 
require 'Mail/mimeDecode.php'; 
$params['include_bodies'] = true; 
$params['decode_bodies'] = true; // this decodes it! 
$params['decode_headers'] = true; 
$decoder = new Mail_mimeDecode($input); 
$mime = $decoder->decode($params); 

// too much work to put in this example 
$charset = ...; //do some magic with $mime->parts to get the character set 
$text = ...; //do some magic with $mime->parts to get the text 

// fix the =A0 control character; it's already been decoded 
// by Mail_Mime, so we need the actual byte code now 
// this has to be done before trying to convert to UTF-8 
$char = chr(hexdec(substr('A0',1))); 
$text = str_replace($char, '', $text); 

// convert to UTF-8 using ConvertCharset 
require 'ConvertCharset.class.php'; 
if(strtolower($charset) != 'utf-8') { 
    $converter = new ConvertCharset($charset, 'utf-8', false); 
} 
$text = $converter->Convert($text); 

그리고 모든 깔끔한입니다. 심지어 악명 높은 Iñtërnâtiônàlizætiøn 변환, MS Word에서 직접 프랑스어, 스페인어 및 붙여 넣기를 허용합니다.

1

이 작업을 수행하는 유일한 방법은 'Content-Type'MIME 헤더를 가져올 때 무서워하는 문자셋 (Content-Type: text/plain; charset="us-ascii"처럼 보임)을 선택하는 것입니다. UTF-8을 사용하고 웹에서 출력물을 올바른 헤더가있는 UTF-8로 보내야합니다.

+0

Mail_Mime 라이브러리는 이미 charset을 가져 와서 그에 따라 변환합니다. Word에서 복사 된 기호 중 일부는 여전히 munged됩니다. 이것은 무엇을 해야할지 이해하지 못하는 문제는 아니며, 그들이 보내고 있다고 주장하는 문자 세트에 복종하지 않는 것이 문제입니다. – Kato

관련 문제