2015-03-13 32 views
6

最近我們對Outlook有一個奇怪的問題,影響了一些用戶。Outlook ReportItem.Body爲某些用戶返回編碼錯誤

如果某些用戶使Outlook客戶端自動化查看共享收件箱中的退回/ ReportItems,而不是按文檔所示返回消息的明文,我們會返回一個unicode字符串,該字符串已被解析爲UTF- 8字符串 - 所以它看起來像中文。

現在我可以通過一些代碼瞭解一些情況,但是另外一個問題是,此更改發生在Outlook中以及所有有權訪問該收件箱的用戶。在Outlook中查看的消息本身顯示爲中文字符 - 最初的unicode html解析爲UTF-8。

看起來這可能是一個已知的問題,但我想看看我能否在這裏得到一些建議。

我們使用的是正常的方法來訪問的報表項目:

For Counter as Integer = Inbox.Items.Count To 1 Step -1 
    Dim Report As Outlook.ReportItem = Inbox.Items(Counter) 
    Dim Body As String = Report.Body 

最後一行是我們得到的garbaled文本。在VBA中,它試圖將它解析爲ASCII並返回一大塊「?」而在.Net中它返回解析爲UTF-8的值,並且我們得到出現中文的字符。無論哪種情況,收件箱中的原始報告項目都會以中文字符顯示,並繼續爲該收件箱的所有用戶執行此操作。

任何想法?

更新:我想分享一個更新,因爲它似乎有幾個人仍然看到它。

我想快速強調一下,編碼問題在這裏討論得很好,並且通過代碼訪問消息的正文文本被覆蓋並且相當容易。 但是,Outlook客戶端中的編碼問題仍然存在,並且從未解決,並且此問題是我的問題。 .Body屬性中存在一些錯誤,這些錯誤對Exchange服務器上的原始郵件對象進行編碼。對於需要解決特定問題的任何人祝好運。

再次更新:對該問題的回答和更詳細的說明張貼如下,並選擇作爲答案。

回答

3

是的,ReportItem存在問題。在Outlook對象模型(存在於Outlook 2013中ABD 2016)Body屬性 - 你可以看到它在OutlookSpy:選擇一個NDR消息,請單擊項目按鈕,選擇Body屬性 - 它會出現亂碼。更糟糕的是,一旦報告項目被OOM觸及,Outlook將在預覽窗格中顯示相同的垃圾。

報告文本存儲在不同的MAPI收件人屬性(點擊即時聊天按鈕OutlookSpy並轉到GetRecipientTable標籤)。問題是ReportItem對象不公開收件人集合。該解決方法是使用擴展MAPI(C++或Delphi)或Redemption(任何語言) - 其ReportItem .ReportText屬性不會有這樣的問題:

set oItem = Application.ActiveExplorer.Selection(1) 
set oSession = CreateObject("Redemption.RDOSession") 
oSession.MAPIOBJECT = Application.Session.MAPIOBJECT 
set rItem = oSession.GetRDOObjectFromOutlookObject(oItem) 
MsgBox rItem.ReportText 
+0

不錯。雖然解決方案可能對所有人都不實用,但這是對我所見到的問題的最詳細解釋。而且由於這是一個解決缺陷的工作,所以我認爲你不能期望它在任何情況下都能正常工作。感謝您添加新信息! – MattB 2016-01-27 19:56:46

0

確定Inbox.Items(Counter)調用返回ReportItem類的實例嗎?你有沒有機會查看MessageClass屬性?

很可能您嘗試將MailItem類的實例轉換爲ReportItem類。是這樣嗎?

另外我會建議使用任何低級別的屬性查看器,如MFCMAPI或OutlookSpy觀察屬性在運行時。你在那裏看到「中國」特徵嗎?

+0

我上面提供的例子是有點簡單,但我使用反射來檢查代碼中的項目類型。在這種情況下,該代碼被設置爲在僅包含1個報告項目的收件箱上運行。對不起,如果這造成了混淆。我正在考慮切換到Exchange Web服務。我們已經遠離這一點,因爲我們不是IT的一部分,他們擔心我們會更深入地挖掘他們的系統。 – MattB 2015-03-15 18:30:43

+0

另外,要明確一點,中文真的只是一個解析錯誤。取一個unicode流並解析爲UTF-8,你會明白我的意思。獲取任意HTML文檔並添加一些英文,並獲取unicode字節並解析爲UTF-8。你會看到一些看起來像「中國人」的東西。這就是我們在運行代碼後查看報告項目時在我們的應用程序和Outlook中看到的內容。 – MattB 2015-03-15 18:33:27

7

我剛剛發生了這種情況,我的Outlook中的VBA功能處理電子郵件退回訂單並將這些訂單標記爲需要注意。在Outlook中的原始電子郵件看起來很好,但是當我嘗試處理它時,字符變成中文,Report.Body只顯示問號。

我發現使用StrConv轉換爲Unicode可以讓我正確的正文內容進行處理。

Dim strBody as String 
strBody = StrConv(Report.Body, vbUnicode) 
+2

這幾乎是我發現的,因爲某些原因,unicode顯示爲UTF8。但我的問題仍然存在。我們可以以編程方式訪問郵件,但我們仍然需要能夠以可讀的方式在收件箱中顯示郵件,所以我所拍攝的內容不會導致問題出現。 – MattB 2015-04-20 18:51:20

+0

這裏是我使用的c#等價物:System.Text.Encoding.UTF8.GetString(new UnicodeEncoding()。GetBytes(report.Body)) – 2016-01-22 03:59:54

+0

StrConv(vbUnicode)在.NET中不存在。下面是我使用的等價物:'Function UnsquishString(ByVal squished As String)As String Dim len As Double = str.Length * 2.0 Dim b(len - 1)As Byte System.Buffer.BlockCopy(str.ToCharArray( ),0,b,0,b.Length) Return System.Text.Encoding.GetEncoding(1252).GetString(b) End Function' – Brain2000 2018-02-23 17:29:53

相關問題