PR_ATTACH_DATA_BIN的Attachment.PropertyAccessor.GetProperty返回包含所有项0

时间:2017-12-18 17:11:01

标签: c# office365 outlook-addin mapi outlook-2016

我创建了一个用于发送大型文件附件的Outlook加载项。当用户尝试附加文件时,它实际上附加了一个占位符“.txt”文件,其内容是实际附件的路径。当用户发送电子邮件时,加载项会尝试读取占位符附件的内容,以获取实际附件的路径。它在传递值Attachment.PropertyAccessor.GetProperty(PR_ATTACH_DATA_BIN)时使用"http://schemas.microsoft.com/mapi/proptag/0x37010102"方法执行此操作。

byte[] attachmentData = attachment.PropertyAccessor.GetProperty(
  "http://schemas.microsoft.com/mapi/proptag/0x37010102");

这已经工作了好几年了,我没有更新我的插件4个月,但从今天开始它的表现不同。现在,此方法的返回值返回一个正确长度的字节数组(在我的情况下为93字节的占位符文件为93),但字节数组中的所有项都为0.如果我打开占位符文件的所有内容看起来正确所以我不明白这个问题。我们目前正在使用Outlook 2016的最新版本(版本1711 Build 8730.2127),我甚至尝试恢复到最后的2版本,但问题仍然存在。

有人知道Outlook 2016中有关MAPI的内容是否发生了变化?

注意 - 我尝试使用OutlookSpy查找正在发生的事情,但GetAttachmentTable标签显示没有条目,即使从Outlook UI我可以清楚地看到有附件。

2 个答案:

答案 0 :(得分:0)

我从OutlookSpy执行以下脚本没有问题(单击脚本按钮,粘贴脚本,单击运行)

set msg = Application.ActiveExplorer.Selection(1)
set attach = msg.Attachments(1)
set ps = attach.PropertyAccessor
v = ps.GetProperty("http://schemas.microsoft.com/mapi/proptag/0x37010102")
debug.print ps.BinaryToString(v)

答案 1 :(得分:0)

我能够通过在添加附件之后但在发送之前保存新电子邮件来解决此问题。

mailItem.Attachments.Add(filePath, OlAttachmentType.olByValue, Type.Missing, Type.Missing);
mailItem.Save();

我在阅读了备注中所述的description for the Attachments.Add method之后尝试了这个:

  

当附件被添加到项目的附件集合中时,附件的类型属性将始终返回olOLE(6),直到项目被保存。为确保结果一致,始终在添加或删除“附件”集合中的对象之前保存项目

我在添加附件之前尝试保存,但没有效果。这导致我在添加后尝试保存,当我这样做时,我能够从" PR_ATTACH_DATA_BIN"中获得正确的值。属性。