Различайте видимые и невидимые вложения с помощью Outlook VBA



Требуется загрузить вложения на сервер. Тем не менее, мы хотим загрузить только те, которые появляются в строке "сообщение" (см. рис ниже) outlook, ничего больше в теле электронной почты.



Поскольку Outlook сам знает, какое вложение должно быть показано в строке, должна быть информация, которую он использует, чтобы различать их внутренне.

Итак, как я могу сделать это в моей программе VBA? Я пытался использовать MailItem.Attachments, но все вложения есть, и я не могу найти ни одного свойства из них может использоваться для различения.



Обновление
Оригинальное название "различать вложенные вложения с Outlook VBA" немного вводит в заблуждение. Поэтому я изменил название.



Скриншот Outlook:
Скриншот Outlook

426   2  

2 ответов:

Как я могу проверить до сих пор, вложенное вложение всегда имеет идентификатор содержимого MIME, независимо от того, появляется ли оно в теле почты. Поэтому решение состоит в том, чтобы проверить, имеет ли он идентификатор содержимого.

Вот пример кода, который подсчитывает видимые вложения:

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, он дает одинаковое количество вложений в строке.

Обновить

Благодаря информации Дмитрия Стреблеченко, я протестировал Outlook с электронной почтой, сгенерированной библиотека электронной почты Java. Результат показывает, что если вложение электронной почты содержит CID, но не отображается в теле сообщения, оно будет отображаться в строке вложений.

Обновить

Похоже, есть еще несколько случаев, когда этого недостаточно. Я сгенерировал следующее тело электронной почты MIME:

Message-ID: <1044564324.2.1360638429705.JavaMail.joe@xxxx>
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--
Обратите внимание, что я изменил идентификатор содержимого ссылочного изображения в теле, и фактическое изображение имеет неправильный идентификатор содержимого (поэтому на него не ссылаются). Однако образ есть не в основной части письма (она находится в ветке альтернативной части). Это делает его невидимым в outlook. Таким образом, чтобы обнаружить, мы должны убедиться, что приложение появляется в основной части MIME... Ищу способы сделать это.

Обновить

Далее копая я достигаю этой ссылки и добавляю еще один тест - свойство PR_ATTACHMENT_HIDDEN.

Также стоит сказать, что outlook 2010 сам по себе не является последовательным. Я заметил, что иногда список электронной почты показывает значок вложения, чтобы указать на наличие вложений, но ничего не появляется при открытии его в инспекторе.

Ссылки:

Отправка электронной почты Outlook со встроенным изображением с помощью VBS

MSDN-свойства вложения

Форум-идентификация встроенных вложений

Некоторые вложения всегда имеют идентификатор содержимого MIME, в частности сообщения из Lotus Notes всегда имеют этот заголовок.
Настоящий тест состоит в том, чтобы проверить свойство HTMLBody и посмотреть, действительно ли на какие-либо вложения ссылаются теги img. Redemption позволяет различать подобные вложения с помощью RDOAttachment.Скрытое свойство.

Comments

    Ничего не найдено.