2015-03-13 54 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

相关问题