9

要件は、添付ファイルをサーバーにアップロードすることです。ただし、Outlookの「メッセージ」行(下の写真を参照)に表示されているものだけをアップロードし、メール本文には他に何もアップロードしません。

Outlook自体は、行に表示する添付ファイルを認識しているため、それらを内部的に区別するために使用する情報が必要です。

では、VBAプログラム内でそれをどのように行うことができますか?使用しようとしましMailItem.Attachmentsたが、すべての添付ファイルがあり、区別するために使用できるプロパティが見つかりません。

更新 元のタイトル「OutlookVBAで埋め込み添付ファイルを区別する」は少し誤解を招く可能性があります。だからタイトルを変えました。

Outlookのスクリーンショット: Outlookのスクリーンショット

4

3 に答える 3

15

これまでのところテストできるように、埋め込まれた添付ファイルには、メール本文に表示されているかどうかに関係なく、常に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のすべての電子メールを実行すると、同じ数の添付ファイルが行に表示されます。

アップデート

Dmitry Streblechenkoの情報のおかげで、Java電子メールライブラリによって生成された電子メールを使用してOutlookをテストしました。結果は、電子メールの添付ファイルに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: xxxx@xxxx.xxx
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を変更しましたが、実際の画像のコンテンツIDが間違っている(参照されていない)ことに注意してください。ただし、画像は電子メールの主要部分にはありません(代替部分のブランチにあります)。それはそれを見通しで見えなくします。

したがって、検出するには、添付ファイルがMIMEのメイン部分に表示されていることを確認する必要があります...そうする方法を探しています。

アップデート

さらに掘り下げると、このリンクに到達し、もう1つのテスト(PR_ATTACHMENT_HIDDENプロパティ)を追加しました。

また、2010年の見通し自体は一貫していないと言う価値があります。メーリングリストに添付ファイルの存在を示す添付ファイルアイコンが表示されることがありますが、インスペクターで開いても何も表示されないことがあります。

参照:

VBSを使用して画像が埋め込まれたOutlook電子メールを送信する

MSDN-添付ファイルのプロパティ

フォーラム-インライン添付ファイルの識別

于 2013-02-06T22:00:32.667 に答える
2

一部の添付ファイルには常にMIMEコンテンツID(PR_ATTACH_CONTENT_ID)があり、特にLotusNotesからのメッセージには常にそのヘッダーがあります。
実際のテストは、HTMLBodyプロパティをチェックして、添付ファイルがimgタグによって実際に参照されているかどうかを確認することです。引き換えでは、RDOAttachment.Hiddenプロパティを 使用して、そのような添付ファイルを区別できます。

于 2013-02-06T22:19:54.730 に答える
1

@Earth Engineによる回答に基づいて、これは、mailitem(item.class = olMail)をパラメーターとして渡すときに添付ファイルの実際の数を返す関数です。

Function CountVisibleAttachment(ByVal m As MailItem) As Integer
    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 a As Attachment
    Dim pa As propertyAccessor
    Dim c As Integer
    Dim cid As String

    Dim body As String

    c = 0

    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
            emb = emb + 1
            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
    CountVisibleAttachment = c
End Function
于 2020-05-04T13:38:18.447 に答える