1

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

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

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

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

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

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

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

谢谢!

[ETA 基于额外研究的一些后续行动]

显然,从 Windows Vista 开始,Windows Explorer 详细视图中显示的所有属性都必须存储在文件本身中。

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

在 Windows XP 中,通过“列处理程序”外壳扩展提供了一个替代选项,它允许将元数据存储在文件之外并在 Windows 资源管理器中作为列查看。这个选项从 Vista 开始就被删除了,可能是因为担心在文件传输或存储在非 NTFS 分区时会丢失与文件相关的元数据。第三方文件管理器 Explorer2 在 Windows Vista 和 7 中仍支持 Windows-XP 样式的列处理程序,但无法在 Windows 资源管理器中查看或编辑此元数据。

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

4

2 回答 2

0

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

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

虽然它不是 C# 代码,但这里是 VBA 代码,可用于 Outlook 读取 msg、获取 Sender 并将其写入 Author 文件属性。

您需要从 microsoft 获取 dsofile.dll 的副本(它们仅提供 32 位版本,因此如果您使用 64 位 Outlook,则需要 64 位版本,您可以在 google 中找到)

  • 然后使用“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
于 2015-01-29T17:37:07.557 回答
0

我有同样的问题,还没有解决方案,但是有一个产品(outlook 插件,没有安装其他东西)messagesave 有一个高级选项来保存数据以供资源管理器呈现/理解:作者、评论(收件人列表)、类别(A如果存在附件)。我看到了两个 .msg 文件输出的二进制差异(带有和不带有“保存数据”选项),并且差异无处不在。所以我正在查看 .msg 格式规范,看看是否有什么我可以做的。.msg 文件可以在资源管理器列中查看,即使没有安装messagesave,也可以在闪存fat32 驱动器上查看。所以我想它确实存储在 mapi 属性中,但我不知道哪个资源管理器查看了哪些...

于 2012-07-20T15:29:11.530 回答