为什么嵌入图像大小在 Outlook VSTO 加载项中计算为 0?

Why do Embedded Image Sizes Evaluate to 0 in Outlook VSTO Add-In?

我们正在构建一个 VSTO Outlook 加载项,它可以扫描外发邮件中的附件以提醒用户并注意到一些意外行为。

考虑以下将文件添加到 Outlook 邮件的方法:

  1. 一个文件附件
  2. 屏幕截图
  3. 屏幕剪辑
  4. 邮件签名文件

当 Item Send 事件触发时,所有四个都被识别为附件:

  Private Sub Application_ItemSend(ByVal Item As Object, ByRef Cancel As Boolean) Handles Application.ItemSend

在下面的代码示例中:

For Each attachment As Outlook.Attachment In Item.Attachments
'do some stuff like check attachment size 
Next

我们正在检查签名文件中是否有不想通知用户的小嵌入图像。

在以下情况下:

我们注意到当添加的文件是嵌入图像(不是附件)时,我们看不到图像的正确大小 属性 使用:

attachment.Size

IE:假设我们正在发送包含以下内容的 Outlook 电子邮件:

我们的代码似乎可以识别正确数量的附件,但是如果我们检查屏幕截图或签名文件图像的附件大小,附件大小 属性 始终计算为 0,我们认为是因为该文件不存在于磁盘上,而附件存在。

For Each attachment As Outlook.Attachment In Item.Attachments
   if attachment.size > 755 then
       'ignore the image
   end if
Next

有没有办法检查 VB.Net 中的图像大小,或者我们是否需要将文件保存到临时目录才能执行此操作?

编辑 Outlook 间谍故障排除步骤:

  1. 新邮件消息
  2. 插入的屏幕截图和签名文件:

  1. OutlookSpy->IMessage

  2. IMessagewindow空白(下)

  1. 关闭 IMessage window.

  2. 重新打开 IMessage Window

  3. 插入(附加)文件出现(下)

8. 双击附件

  1. 选定的检查器按钮

  1. 当前项目:

  1. 浏览:

  1. 附件:

  1. 浏览:

  1. IEnumVariant:

我怀疑第 4 步和第 7 步之间的差异可能是因为 Outlook 可能保存了电子邮件的草稿?

额外编辑

添加代码以在检查 signature/embedded 图像大小之前保存邮件消息:

'convert generic object to Outlook.MailItem object.
Dim objMailItem As Outlook.MailItem = CType(Item, Outlook.MailItem)
'Save message
objMailItem.Save()
'quick check to see if message is saved (it is)
Dim saved As Boolean = objMailItem.Saved()

For Each attachment As Outlook.Attachment In objMailItem.Attachments
    'all items still evaluate to 0.
    If attachment.Size >= 20 Then
        'do some stuff
    End If
Next

谢谢。

附件大小(包括原始二进制数据以及每个附件的属性)在保存邮件时由商店提供商更新。请务必先致电 MailItem.Save

我们最终使用 Outlook Spy(很棒的工具..)找到了 PR_ATTACH_SIZE 属性:

然后使用 MS 模式设置如下:

'property access to get attachment sizes
 Const PR_ATTACH_SIZE As String = "http://schemas.microsoft.com/mapi/proptag/0x0E200003"

还有来自 this 的重要信息 SO Post。

然后按如下方式遍历我们的附件集合以找到我们的附件大小:

For Each attachment As Outlook.Attachment In Item.Attachments
  attSize = CType(attachment.PropertyAccessor.GetProperty(PR_ATTACH_SIZE), Integer)
  if attSize.size > 755 then
   'ignore the image
   end if
Next

谢谢..