2012-09-07 38 views
3

要求将附件上传到服务器。但是,我们只想上传显示在Outlook的“消息”行(请参见下面的图片)中的内容,而不是电子邮件正文中的其他内容。使用Outlook VBA区分可见和不可见附件

由于Outlook本身知道应该在行中显示哪个附件,因此必须有信息用于在内部区分它们。

那么,我如何在我的VBA程序中做到这一点?我试图使用MailItem.Attachments但所有附件都在那里,我找不到它们的任何属性可用于区分。

UPDATE 原始标题“使用Outlook VBA区分添加的附件”有点令人误解。所以我改变了标题。

展望截图: Outlook Screenshot

回答

8

正如我可以迄今测试,嵌入式附接总是有一个MIME内容ID,无论它出现在邮件主体。所以解决方案是检查它是否有内容ID。

下面是一个例子代码,计数可见附件:

Sub ShowVisibleAttachmentCount() 
    Const PR_ATTACH_CONTENT_ID As String = "http://schemas.microsoft.com/mapi/proptag/0x3712001F" 
    Const PR_ATTACHMENT_HIDDEN As String = "http://schemas.microsoft.com/mapi/proptag/0x7FFE000B" 

    Dim m As MailItem 
    Dim a As Attachment 
    Dim pa As PropertyAccessor 
    Dim c As Integer 
    Dim cid as String 

    Dim body As String 

    c = 0 

    Set m = Application.ActiveInspector.CurrentItem 
    body = m.HTMLBody 

    For Each a In m.Attachments 
     Set pa = a.PropertyAccessor 
     cid = pa.GetProperty(PR_ATTACH_CONTENT_ID) 

     If Len(cid) > 0 Then 
      If InStr(body, cid) Then 
      Else 
       'In case that PR_ATTACHMENT_HIDDEN does not exists, 
       'an error will occur. We simply ignore this error and 
       'treat it as false. 
       On Error Resume Next 
       If Not pa.GetProperty(PR_ATTACHMENT_HIDDEN) Then 
        c = c + 1 
       End If 
       On Error GoTo 0 
      End If 
     Else 
      c = c + 1 
     End If 
    Next a 
    MsgBox c 
End Sub 

当我通过我的所有Outlook电子邮件中运行它给出了相同数目的线附件。

UPDATE

由于梅德Streblechenko的信息,我测试的Outlook与Java电子邮件库生成的电子邮件。结果显示,当电子邮件附件包含CID但未出现在电子邮件正文中时,它将显示在附件行中。

UPDATE

它看起来还是有一些情况下,这是不够的。 我已经生成以下MIME电子邮件正文:我在身体已经改变了参考图像内容ID

Message-ID: <[email protected]> 
Subject: Test 
MIME-Version: 1.0 
Content-Type: multipart/alternative; 
    boundary="----=_Part_0_1327112367.1360638429515" 
Return-Path: [email protected] 
X-OriginalArrivalTime: 12 Feb 2013 03:07:16.0096 (UTC) FILETIME=[0FC1B000:01CE08CE] 

------=_Part_0_1327112367.1360638429515 
Content-Type: text/plain; charset=us-ascii 
Content-Transfer-Encoding: 7bit 

TTT 
------=_Part_0_1327112367.1360638429515 
Content-Type: multipart/related; 
    boundary="----=_Part_1_1747887937.1360638429520" 

------=_Part_1_1747887937.1360638429520 
Content-Type: text/html; charset=UTF-8 
Content-Transfer-Encoding: quoted-printable 

<html><head><meta http-equiv=3D'content-type' content=3D'text/html; charset= 
=3DUTF-8'></head><title>TTT</title><body><img src=3D"cid:test1.png" alt=3D'= 
=E6=81=AD=E8=B4=BA=E6=96=B0=E7=A6=A7' /><p>txt</p></body></html> 
------=_Part_1_1747887937.1360638429520 
Content-Type: image/png 
Content-Transfer-Encoding: base64 
Content-ID: <test.png> 

iVBORw0KGgoAAAANSUhEUgAAAIIAAAAmCAYAAAAIjkMFAAABHUlEQVR42u3Z0Q7CIAyFYd//pafx 
ckFoS9ELvz8aE9mQrIfTFh8PAAAAAPgp1+t1vT9i32fm6FzP6JrKb3aulRAGARm9Z9dUAhWZY7Wm 
7Hr+IvhdD+s+PhLCLNBZQZ12HI7QlBqyQohctxM8bvAFIcx2eEYIo/vuY5WAi3BzWlhZ+if7zs7T 
UWtE10Asgd3bUSxWHvrMobJOtXITQkjk5Z3gdaWaqBBWouYIhdy+E+TsPNHU0CUEbjDJ49GxE0KI 
nBNUheAcYbPVy9QNmRaxUvVHd7Idf0gU2QDOduVqnkinoEb4QY1Q3V2RNrMqpB0h6BqKh0gZIWT/ 
AzjVycwcjSMcPI3buSebZiptaLbIBQAAAAAAAAAAAAAAAP6OJyO5jJ4bZa/gAAAAAElFTkSuQmCC 

------=_Part_1_1747887937.1360638429520-- 

------=_Part_0_1327112367.1360638429515-- 

通知,与实际图像有错误的内容ID(所以没有提及)。然而,图像不在电子邮件的主要部分(它是在另一部分的分支)。这使得它在前景中看不见。

因此,为了检测到我们必须确保附件出现在主要的MIME部分中......寻找方法来做到这一点。

UPDATE

此外挖I达到this link和我增加了一个测试 - 在PR_ATTACHMENT_HIDDEN属性。

另外值得说的是,Outlook 2010本身并不一致。我注意到,有时电子邮件列表显示附件图标以指示附件的存在,但在检查员中打开时没有任何内容出现。

参考文献:

Sending Outlook Email with embedded image using VBS

MSDN - Attachment Properties

Forum - Identifying inline attachments

1

某些附件总是有MIME内容的ID,从Lotus特定消息的备注总是有头。
真正的测试是检查HTMLBody属性并查看是否有任何附件实际上由img标签引用。 Redemption可让您使用RDOAttachment.Hidden属性区分附件。

+0

谢谢你;你能解释一下与Outlook有关吗?因为我们专注于Outlook,对Lotus Notes不感兴趣。 –

+0

从Lotus Notes发送到Outlook的电子邮件将具有该MIME标头。我只是想举一个例子,当PR_ATTACH_CONTENT_ID属性检查将总是返回错误的结果。 –

+0

感谢您的信息,我已更新答案以包含您的建议。 –