2012-12-31 37 views
1

即時閱讀粘貼到電子郵件正文中一個日誌文件編碼俄羅斯語言,有些是在各種不同的語言和所有語言字符似乎除了俄羅斯的正確顯示。使用imap_fetch如果從Gmail

以下是對俄羅斯說,在日誌文件中的一個例子:

Ссылканаобъектнеуказываетнаэкземпляробъекта。

в

從我讀書,我需要對行指定mb_encoding的解碼和編碼的東西(UTF-8),但我是一個有點失去了實際結構而不會影響代碼怎麼說不是俄語。但是,當回波輸出它被轉換成這樣的:

СÑÑ

下面是使用已有的代碼的IM,我是一個PHP初學者和一些這個心不是我的代碼,我已經編輯,以適應,但不是100%的東西都是這樣做的:

$mailbox = "[email protected]"; 
$mailboxPassword = "xxx"; 

$mailbox = imap_open("{imap.gmail.com:993/imap/ssl}INBOX", 
        $mailbox, $mailboxPassword); 

mb_internal_encoding("UTF-8"); 
$subject = mb_decode_mimeheader(str_replace('_', ' ', $subject)); 

$body = imap_fetchbody($mailbox, $val, 1); 
$body = base64_decode($body); 

echo $body; 

有一次,我echo出身體從俄羅斯轉換成編碼,類似代碼的任何指針,我可以解剖,以瞭解如何解決這一問題?

請記住,從電子郵件中讀取了大量的語言,大部分只是它的幾個片段,其餘的是基本的日誌記錄,但我擔心的是如果我設置一個新的解碼,它會混亂高達其他語言的字符

回答

2

儘管其大收養,電子郵件仍是棘手的工作。如果您的IMAP客戶端具有一組有限的需求,那麼您的工作將很容易。否則,對於一個真正的通用GMail客戶端來說,沒有銀彈,你不得不理解email如何操作:SMTP,MIME和最後的IMAP。

基本MIME知識是絕對需要的,我不會糊整個維基百科的文章,但你確實應該read it並瞭解它是如何工作的。 IMAP比較容易理解。

一般,電子郵件消息包含單個純文本/體,或一個多/替代體既具有純文本/text/html的一部分。但是,你知道,有附件,所以你也可以很可能找到一個多/混合,它真的可以包含任何東西,如果它的二進制內容,你應該區別對待比文本。有兩個標題(您可以在全球消息中找到或部分在多部分信封內找到),這些標題涉及字符集問題:Content-TypeContent-Transfer-Encoding

從您的代碼中,我們必須假設您只對文本部件感興趣base64編碼。一旦你已經解碼的他們,他們是字節代表由的Content-Type頭的發送源,這是這裏的非ASCII,因此指定的字符集文字的順序是這樣的:

Content-Type: text/plain; charset=ISO-8859-1 

注那字符集可能是utf8或者其他任何你能想到的,你必須在你的程序中檢查這個。您的工作是在您的HTML頁面的輸出字符集中對這段輸入進行代碼轉換。如果你的頁面沒有使用Unicode編碼(比如UTF-8),那麼很可能你甚至不能正確顯示消息,'?'將被打印而不是缺少字符。既然你需要你的應用程序在世界範圍內使用(不僅僅是在俄羅斯),並且由於它無論如何都是好的做法,所以你應該在你的HTML響應中使用UTF-8,因此當你想回顯消息體時:

echo mb_convert_encoding(imap_base64($body), "UTF-8", $input_charset); 

其中$input_charset是在Content-Type標題中找到的處理零件。對於主題行,您應該使用imap_mime_header_decode(),它返回一個元組數組(二進制字符串,字符集),您必須以上述相同的方式輸出。

TL; DR

如果我們假定它是CP-1252編碼(也許你沒有複製一些非打印的)在UTF-8編碼輸入文本地圖字節相當不錯的輸出。這意味着輸入是UTF-8,但瀏覽器認爲該頁面是Windows-1252。可能這是爲您的區域設置默認的瀏覽器的行爲,你可以很容易地通過任何其他輸入之前發送適當的標題更正:

header("Content-Type: text/html; charset=utf-8"); 

這應該足以解決這個問題,但也很可能會造成問題與字符串文字和數據庫中的非ASCII字符(如果有的話)。如果你想要一個多語言應用程序,Unicode就是這樣,但你必須將你的數據庫和你的PHP文件從CP-1252轉換爲UTF-8。

+0

感謝您的詳細解答,我嘗試通過以下方式訪問電子郵件字符集: $ headers1 = imap_fetchstructure($ mailbox,$ val); 但即使俄羅斯的電子郵件都顯示爲UTF-8,所以我不知道如何找出哪些我必須做 – user1547410

+0

@ user1547410 mb_convert_encoding我不明白你說什麼,請重新說明它。另外,如果發件人程序在你的控制之下,你可以檢查它的方面知道郵件的編碼 – Raffaele

+0

基本上我試圖找到$ input_charset的正確值。我以爲我可能會在imap_fetch結構中找到它,但是一切都會返回說它的UTF-8。 我沒有控制發送原始郵件的程序 – user1547410