为什么嵌入图像大小在 Outlook VSTO 加载项中计算为 0?
Why do Embedded Image Sizes Evaluate to 0 in Outlook VSTO Add-In?
我们正在构建一个 VSTO Outlook 加载项,它可以扫描外发邮件中的附件以提醒用户并注意到一些意外行为。
考虑以下将文件添加到 Outlook 邮件的方法:
- 一个文件附件
- 屏幕截图
- 屏幕剪辑
- 邮件签名文件
当 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 间谍故障排除步骤:
- 新邮件消息
- 插入的屏幕截图和签名文件:
OutlookSpy->IMessage
IMessagewindow空白(下)
关闭 IMessage window.
重新打开 IMessage Window
插入(附加)文件出现(下)
8. 双击附件
- 选定的检查器按钮
- 当前项目:
- 浏览:
- 附件:
- 浏览:
- 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
谢谢..
我们正在构建一个 VSTO Outlook 加载项,它可以扫描外发邮件中的附件以提醒用户并注意到一些意外行为。
考虑以下将文件添加到 Outlook 邮件的方法:
- 一个文件附件
- 屏幕截图
- 屏幕剪辑
- 邮件签名文件
当 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 间谍故障排除步骤:
- 新邮件消息
- 插入的屏幕截图和签名文件:
OutlookSpy->IMessage
IMessagewindow空白(下)
关闭 IMessage window.
重新打开 IMessage Window
插入(附加)文件出现(下)
- 选定的检查器按钮
- 当前项目:
- 浏览:
- 附件:
- 浏览:
- 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
谢谢..