2010-07-16 74 views
0

我已經設置了一個處理傳入電子郵件並在Blogger上創建博客條目的腳本。我正在使用PEAR的Mail_Mime庫(現在)來讀取傳入的消息。這些消息通常包含無法被瀏覽器讀取的字符 - 當人們使用Outlook或從MS Word剪切/粘貼時,這種情況經常發生。如何格式化傳入的電子郵件文本以顯示HTML

因此,在另一端的輸出是這樣的:

下面是測試後用「引號」和「apostrophesfor什麼它的價值,它也有dashesand其他奇怪從MS Word格式化剪切和粘貼。

你也可以在野外see the output

修復任何特定的實例並不難,但每個客戶端(hotmail,gmail,outlook等)似乎處理事情有點不同。 Mail_Mime似乎只能輸出輸出,如果我關閉Mail_Mime的解析並嘗試使用mb_convert_encoding自己翻譯編碼的字符或對其進行手動模擬,那更糟糕。

請注意,這不會通過選擇正確的編碼類型和使用解碼/編碼/轉換功能來解決。傳入的格式從Windows-1252到UTF8不同,幾乎任何郵件客戶端都可以想到。

有沒有人在此之前編寫腳本,可以通過提供最佳方法的示例或建議來節省一些時間?我已經嘗試了所有簡單的答案並做了大量的實驗,所以請不要麻煩回答,除非您已成功處理類似問題或對編碼問題有深入的瞭解。

+0

電子郵件必須解釋爲在標題中指定(請參閱*內容中的* charset *參數類型*字段)。如果缺少,RFC 5322意味着US-ASCII。 – Gumbo 2010-07-16 16:13:26

+0

這是由Mail_Mime自動完成的。這個問題比簡單理解協議複雜得多。 – Kato 2010-07-19 02:30:44

+0

這篇文章有一些有趣的想法:http://stackoverflow.com/questions/2686515/problem-with-character-encoding-on-email-sent-via-php 我無法弄清楚它如何適用於但我的問題。 – Kato 2010-07-19 18:44:17

回答

0

爲了解決這個問題,並將我的消息轉換爲可從瀏覽器讀取的有效UTF-8,我發現這個PHP lib,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庫已經拉入字符集並相應地轉換它。一些符號,特別是從Word中複製的符號,仍然會消失。這不是不理解該做什麼的問題,這是他們不遵守他們聲稱要發送的字符集的問題。 – Kato 2010-07-19 02:29:52

相關問題