2009-05-07 6 views
3

이 코드가 있습니다. 예 : Zend Reading Mail입니다.왜이 메일 메시지가 제대로 디코딩되지 않습니까?

$message = $mail->getMessage(1); 

// output first text/plain part 
$foundPart = null; 
foreach (new RecursiveIteratorIterator($mail->getMessage(1)) as $part) { 
    try { 
     if (strtok($part->contentType, ';') == 'text/plain') { 
      $foundPart = $part; 
      break; 
     } 
    } catch (Zend_Mail_Exception $e) { 
     // ignore 
    } 
} 
if (!$foundPart) { 
    echo 'no plain text part found'; 
} else { 
    echo $foundPart->getContent(); 
} 

메시지가 제대로 작동합니다. 그러나 메시지를 읽을 수있는 것으로 디코딩하려고 시도해도 작동하지 않습니다. Zend_Mime, imap_mime 및 iconv를 사용해 보았습니다.

은 = 지금까지

가가 이

은 내가 원하는 것 것은 그냥 "안녕의 heimúr"입니다

그것은 말을해야 내가 $foundPart->getContent();

홀 = F3의 하임으로 무엇을 얻을의 예입니다 라이브러리에서 실제로 "버튼을 누르고 베이컨을받을 수"있습니다. 즉, 라이브러리를 POP3 전자 메일 상자로 지정하고 전자 메일을 읽을 수있는 형식 (인코딩 문제없이) 및 첨부 파일로 가져 오려고합니다.

imap_mime_header_decode() 동일한 데이터가있는 배열을 제공합니다.
iconv_ mime_ decode() 누군가가 이런 일이 왜 어떤 아이디어 나 난 도망이 단지 추상적 (PHP/파이썬이나 펄)

답변

2

이 때문에 base64 인코딩이 될 수있는 수있는 라이브러리가 있습니까 같은

않습니다. Zend_Mail 워드 프로세서 ('인코딩'아래) 말 : 다른 인코딩이 MIME 부 객체 에 할당 addAttachment() 호출 또는 주어진 없으면

중 ... 다른 첨부베이스 64로 를 부호화 후에.

같은 것을보십시오 :

또한
echo base64_decode($foundPart->getContent()); 

가 읽기 : 어떻게 든 도움이 http://framework.zend.com/manual/en/zend.mail.encoding.html

희망을.

+0

imap_qprint()가 트릭이었다. 감사합니다 :) –

+2

그것은 base64로 인코딩되지 않았습니다. 인용 부호가있는 인쇄 가능 : http://en.wikipedia.org/wiki/Quoted-printable –

+0

Pawel이 맞습니다. 대답은 간단하지 않습니다. 보다 완벽한 해결책은 내 대답을 참조하십시오. – Andrew

13

Zend_Mail을 사용하여 전자 메일을 읽는 방법을 배우는 동안 비슷한 문제가 발생했습니다. Zend_Mail이 구현하지 않은 추가 된 로직 (예 : 인코딩 된 이메일의 디코딩 및 문자 세트의 변환)을 추가해야합니다. 여기에 평범한 텍스트 부분을 찾은 후에 내가하고있는 일이있다.

$content = $foundPart->getContent(); 

switch ($foundPart->contentTransferEncoding) { 
    case 'base64': 
     $content = base64_decode($content); 
     break; 
    case 'quoted-printable': 
     $content = quoted_printable_decode($content); 
     break; 
} 

//find the charset 
preg_match('/charset="(.+)"$/', $foundPart->contentType, $matches); 
$charset = $matches[1]; 

if ($charset == 'iso-8859-1') { 
    $content = utf8_encode($content); //convert to utf8 
} 
+2

당신은 남자입니다! 이것은 base64와 quoted-printable 인코딩을 다루기 때문에 받아 들여진 대답이어야합니다 (필자의 경우는 후자였습니다). –

관련 문제