1

C# を使用して Outlook の *.msg ファイルから送信者、件名、受信者などの情報を抽出する方法を見つけました。

この情報をメタデータ (プロパティ?) として保存し、Windows エクスプローラーの詳細ビューで列として表示および並べ替えできるようにしたいと考えています。

1: msg ファイルには、この目的で使用できるプロパティが既にありますか?

2: もしそうなら、C# を使ってこれらのプロパティを設定する簡単な方法はありますか?

3: そうでない場合、msg ファイルのカスタム プロパティを登録し、プログラムで設定する方法はありますか?

オプション 3 に関しては、シェル拡張を作成するための次のガイドを見つけました

しかし、それが必要かどうかも、解決策として機能するかどうかもわからないため、まだ読み始めていません。

ありがとう!

[追加調査に基づく ETA フォローアップ]

どうやら Windows Vista 以降では、Windows エクスプローラーの詳細ビューに表示されるすべてのプロパティは、ファイル自体に保存する必要があります。

Windows エクスプローラーでのこれらのプロパティの読み取りと書き込みは、"プロパティ ハンドラー" によって容易になります。

Windows XP では、"Column Handler" シェル拡張を介して別のオプションを利用できました。これにより、メタデータをファイルの外部に保存し、Windows エクスプローラーで列として表示することができました。このオプションは、ファイルが非 NTFS パーティションに転送または保存されたときに、ファイルに関連付けられたメタデータが失われるという懸念から、Vista から削除されました。サード パーティのファイル マネージャー Explorer2 は、Windows Vista および 7 で Windows XP スタイルの列ハンドラーをサポートしていますが、Windows エクスプローラーでこのメタデータを表示または編集することはできません。

私が知る限り、Windows 7 の既定では、Outlook の *.msg ファイル形式に関連付けられたプロパティはありません。ファイルの種類のプロパティ ハンドラーを作成することは可能かもしれませんが、それを行うのは私のスキル セットを超えています。 .

4

2 に答える 2

0

これはかなり古いものですが、最近同じ問題に遭遇しました。私は MessageSave ( http://www.techhit.com/messagesave/ ) を認識していますが、既にすべての msg ファイルを作成しており、Author プロパティをそれらに追加したかっただけです。

最終的に、解決策は DSOFile.dll を使用することであることがわかりました。DSOFile でメッセージを開き、SummaryProperties.Author プロパティを設定してからファイルを保存すると、エクスプローラーが表示およびフィルターできる属性が設定されます。

これは C# コードではありませんが、Outlook でメッセージを読み取り、Sender を取得し、それを Author ファイル プロパティに書き込むために使用できる VBA コードです。

Microsoft から dsofile.dll のコピーを取得する必要があります (Microsoft では 32 ビット バージョンしか提供されていないため、64 ビット Outlook を使用している場合は、Google で見つけることができる 64 ビット バージョンが必要です)。

  • 次に、DLL を「regsvr32」で登録します。
  • 次に、VBA で、「DSO OLE ドキュメント プロパティ リーダー」を参照に追加します。

最後に、MSG ファイルを更新するコードを次に示します。

Function GetSenderSMTPAddress(mail As Outlook.MailItem) As String
    'Converted from VB to VBA from here: http://stackoverflow.com/questions/24361726/how-can-i-get-the-sender-email-address-using-outlook-mailitem-in-vb-net
    Dim PR_SMTP_ADDRESS As String: PR_SMTP_ADDRESS = "http://schemas.microsoft.com/mapi/proptag/0x39FE001E"
    If mail Is Nothing Then
        Return
    End If
    If mail.SenderEmailType = "EX" Then
        Dim sender As Outlook.AddressEntry: Set sender = mail.sender
        If Not sender Is Nothing Then
            'Now we have an AddressEntry representing the Sender
            If sender.AddressEntryUserType = Outlook.OlAddressEntryUserType.olExchangeUserAddressEntry Or sender.AddressEntryUserType = Outlook.OlAddressEntryUserType.olExchangeRemoteUserAddressEntry Then
                'Use the ExchangeUser object PrimarySMTPAddress
                Dim exchUser As Outlook.ExchangeUser: Set exchUser = sender.GetExchangeUser()
                If Not exchUser Is Nothing Then
                    GetSenderSMTPAddress = exchUser.PrimarySmtpAddress
                    Exit Function
                Else
                    GetSenderSMTPAddress = ""
                    Exit Function
                End If
            Else
                GetSenderSMTPAddress = sender.PropertyAccessor.GetProperty(PR_SMTP_ADDRESS)
                Exit Function
            End If
        Else
            GetSenderSMTPAddress = ""
            Exit Function
        End If
    Else
        GetSenderSMTPAddress = mail.SenderEmailAddress
        Exit Function
    End If
End Function

Sub UpdateMsgAttributes(msgFile As String)

    Dim objDSO As Object
    Dim objVariant As Variant
    Dim oNamespace As NameSpace
    Dim strAuthor As String
    Dim item As Outlook.MailItem

    ' Open the msg in Outlook to get the attributes from the MailItem
    '     Use CreateItemFromTemplate instead of OpenSharedItem
    '     because OpenSharedItem puts a lock on the file, and the lock is only
    '     released at an indeterminate time after releasing the mailitem
    ' Set oNamespace = Application.GetNamespace("MAPI")
    ' Set objVariant = oNamespace.OpenSharedItem(msgFile)
    Set objVariant = Application.CreateItemFromTemplate(msgFile)

    If objVariant.Class = olMail Then
        Set item = objVariant
        strAuthor = item.SenderName & " <" & GetSenderSMTPAddress(item) & ">"
    End If
    objVariant.Close olDiscard
    Set objVariant = Nothing

    ' Reopen the msg with DSOFile to edit its attributes
    Set objDSO = CreateObject("DSOFile.OleDocumentProperties")
    objDSO.Open msgFile
    objDSO.SummaryProperties.author = strAuthor
    objDSO.Save

End Sub
于 2015-01-29T17:37:07.557 に答える
0

私は同じ問題を抱えていますが、まだ解決策はありませんが、製品 (outlook アドイン、他のものはインストールされていません)messagesave には、エクスプローラーが提示/理解できるようにデータを保存する高度なオプションがあります: 作成者、コメント (受信者リスト)、カテゴリ (A添付ファイルが存在する場合)。2 つの .msg ファイル (「データの保存」オプションを使用した場合と使用しない場合) の出力のバイナリ diff が表示され、その diff がいたるところにあります。そこで、.msg 形式の仕様を調べて、そこでできることがあるかどうかを確認しています。.msg ファイルは、messagesave がインストールされていなくても、フラッシュの fat32 ドライブでエクスプローラーの列に表示できます。確かにmapiプロパティに保存されていると思いますが、どのエクスプローラーがどれを見ているのかわかりません...

于 2012-07-20T15:29:11.530 に答える