将元数据附加到在Windows资源管理器详细信息视图中可见的outlook msg文件?

时间:2012-07-19 19:55:13

标签: c# windows shell metadata

我找到了使用C#从outlook * .msg文件中提取信息的方法,例如发件人,主题,收件人等。

我想将此信息保存为元数据(属性?),可以在Windows资源管理器详细信息视图中查看和排序为列。

1:msg文件是否已经具有我可以用于此目的的属性?

2:如果是这样,有没有一种简单的方法可以使用C#设置这些属性?

3:如果没有,有没有办法为msg文件注册自定义属性,然后以编程方式设置它们?

如果涉及选项3,我找到了以下创建外壳扩展指南:http://www.codeproject.com/Articles/830/The-Complete-Idiot-s-Guide-to-Writing-Shell-Extens

但我还没有开始阅读它,因为我不确定它是否必要,也不确定它是否可以作为解决方案。

谢谢!

[ETA基于其他研究的一些后续行动]

显然从Windows Vista开始,Windows资源管理器详细信息视图中显示的所有属性都必须存储在文件本身中。

通过“属性处理程序”可以在Windows资源管理器中读取和写入这些属性。

在Windows XP中,通过“列处理程序”外壳扩展可以使用备用选项,它允许将元数据存储在文件之外,并在Windows资源管理器中作为列进行查看。此选项在Vista中被删除,据推测是因为担心在文件传输或存储在非NTFS分区时丢失与文件相关的元数据。第三方文件管理器Explorer2仍支持Windows Vista和7中的Windows-XP样式列处理程序,但无法在Windows资源管理器中查看或编辑此元数据。

据我所知,Outlook * .msg文件格式在Windows 7中默认没有与之关联的任何属性。可以为文件类型编写属性处理程序,但这样做超出了我的技能。

2 个答案:

答案 0 :(得分:0)

我有同样的探索,但还没有解决方案 一个产品(outlook addin,没有安装其他东西)messagesave有一个高级选项来保存数据,供探索者显示/理解:作者,评论(收件人列表),类别(如果存在附件,则为A)。我看到两个.msg文件的输出的二进制差异(有和没有'保存数据'选项)和差异到处都是。所以我正在查看.msg格式规范,看看我能做些什么。 .msg文件可以在资源管理器列中查看,即使没有安装messageave,也可以在flash fat32驱动器上查看。所以我猜它确实存储在mapi属性中,但我不知道哪个探险家看起来...

答案 1 :(得分:0)

这是相当古老的,但我最近遇到了同样的问题。我知道MessageSave(http://www.techhit.com/messagesave/),但是,我已经创建了所有的msg文件,我想只是将Author属性添加到它们。

我终于想通了解决方案是使用DSOFile.dll。使用DSOFile打开一个msg,然后设置SummaryProperties.Author属性,然后保存该文件将设置一个Explorer可以查看和过滤的属性。

虽然它不是C#代码,但这里有VBA代码,可以与Outlook一起使用来读取消息,获取发件人,并将其写入作者文件属性。

您需要获取dsofile.dll表单微软的副本(它们只提供32位版本,因此如果您使用的是64位Outlook,则需要64位版本,您可以在google中找到)< / p>

  • 然后使用'regsvr32'
  • 注册DLL
  • 然后在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