vba - 查看附件是嵌入的还是附加的

标签 vba outlook attachment

我正在编写一个小型 VBA 代码以在列表框中显示电子邮件的所有附件。

用户可以选择应从电子邮件中删除并存储在目标文件夹中的附件。

我还在电子邮件中添加了一个 HTML 文件,其中包含所有已删除文件的列表(包括指向目标文件夹的每个文件的链接)。

我对图像有疑问,因为它们可以是

  • 作为普通文件附加到电子邮件
  • 嵌入电子邮件正文(如签名中的公司 Logo )

我只想在我的列表框中显示那些作为文件附加到电子邮件的图像。

应忽略嵌入式邮件。

Sub SaveAttachment()

    Dim myAttachments           As Outlook.Attachments
    Dim olMailItem              As Outlook.MailItem
    Dim lngAttachmentCount      As Long
    Dim Attachment_Filename     As String

    Select Case True

        Case TypeOf Application.ActiveWindow Is Outlook.Inspector
            Set olMailItem = Application.ActiveInspector.CurrentItem
        Case Else

        With Application.ActiveExplorer.Selection
            If .Count Then Set olMailItem = .Item(1)
        End With

        If olMailItem Is Nothing Then Exit Sub

    End Select

    Set myAttachments = olMailItem.Attachments

    If myAttachments.Count > 0 Then

        For lngAttachmentCount = myAttachments.Count To 1 Step -1

            '-------------------------------------------------------------------------
            ' Add the attachment to the list of attachments (form)
            '-------------------------------------------------------------------------
            Attachment_Filename = myAttachments(lngAttachmentCount).FileName

            With UserForm1.lstAttachments

                .AddItem (Attachment_Filename)
                .List(lngAttachmentListPos, 1) = Attachment_Type_Text
                .List(lngAttachmentListPos, 2) = FormatSize(myAttachments(lngAttachmentCount).Size) & " KB"

            End With

        Next lngAttachmentCount

    End If

End Sub

我只添加了代码的相关部分,所以我希望我没有忘记任何东西。

目前我显示所有附件(也包括嵌入的图像)。

我如何知道附件是否已嵌入?

我在这里找到了一个可能的解决方案: Distinguish visible and invisible attachments with Outlook VBA
提供的源代码不工作,似乎第 2 行和第 3 行中的两个 URL 不再存在。

最佳答案

我不确定这是否是在所有情况下都有效的解决方案,但它适用于我的环境。这意味着“正确测试”。

Const PR_ATTACH_CONTENT_ID = "http://schemas.microsoft.com/mapi/proptag/0x3712001F"

Function IsEmbedded(Att As Attachment) As Boolean
    Dim PropAccessor As PropertyAccessor
    Set PropAccessor = Att.PropertyAccessor
    IsEmbedded = (PropAccessor.GetProperty(PR_ATTACH_CONTENT_ID) <> "")
End Function

调用它

If IsEmbedded(myAttachments(lngAttachmentCount)) Then
    ...
End If

神秘的 url-looking 常量不是 url,而是属性标识符。您可以在此处找到它们的列表:https://interoperability.blob.core.windows.net/files/MS-OXPROPS/%5bMS-OXPROPS%5d.pdf

如果嵌入,该属性将设置为附件的 url。如果没有嵌入,那么它是空的。

关于vba - 查看附件是嵌入的还是附加的,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59075501/

相关文章:

python - 在 python 3 中“尝试” 'duration'

ios - SLComposeViewController - SLServiceTypeTwitter、声音和视频

css - 使用 VBA 将 CSS 动画按钮添加到 Excel

vba - 带有 VBA 的 Word 中的单个源文档

vba - 以编程方式设置 MailItem 的后续标志来完成?

html - 单击 Outlook html 电子邮件中的 anchor 后颜色发生变化

c# - 向 COM 公开 .NET 事件?

excel - VBA,向上/向下填充行以与最后一行对齐

image - 通过文档文字 SOAP 在 base64 中发送图像的替代方法

c# - 电子邮件附件大小限制