1

我想将公用文件夹设置为具有初始视图(自定义视图),我知道如何在 Outlook 2007 上手动执行此操作,但是,我找不到可以在 Interop(文件夹和 MAPI 文件夹)中使用的任何属性或方法可以做到这一点。

经过几个小时的谷歌搜索,我得出以下结论:

Imports NUnit.Framework
Imports System.Windows.Forms
Imports System.Net.Mail
Imports System.Net.Mime
Imports System.Net

Imports System.Runtime.InteropServices
Imports Outlook = Microsoft.Office.Interop.Outlook

<TestFixture()>
Public Class TestOutlook
    <Explicit()>
    <Test()>
    Public Sub TestSetFolderInitialView()
        Dim ol As New Outlook.Application
        Dim exCatched As Exception = Nothing
        Try
            ' Get My Mailbox 
            Dim myFolder As Outlook.MAPIFolder = Nothing
            For i As Integer = 0 To ol.Session.Folders.Count - 1
                myFolder = ol.Session.Folders(i + 1)
                If myFolder.Name = "Mailbox - Rex" Then ' Change it to your mail box name
                    Exit For
                End If
            Next

            ' Get the folder I want to Set initial view
            Dim testFolder As Outlook.MAPIFolder = Nothing
            If myFolder IsNot Nothing Then
                For i As Integer = 0 To myFolder.Folders.Count - 1
                    Dim pFolder = myFolder.Folders(i + 1)
                    If pFolder.Name = "Inbox" Then
                        For Each fol As Outlook.MAPIFolder In pFolder.Folders
                            If fol.Name = "TestFolder" Then
                                testFolder = fol
                                Exit For
                            End If
                        Next
                        Exit For
                    End If
                Next
            End If

            If testFolder IsNot Nothing Then
                Try
                    ' Create a test view
                    Dim newVw = CType(testFolder.Views.Add("RexTest-" & DateTime.Now.ToString("yyyyMMdd-hhmmss"),
                                                                   Outlook.OlViewType.olTableView,
                                                                   Outlook.OlViewSaveOption.olViewSaveOptionThisFolderEveryone), 
                                             Outlook.TableView)
                    newVw.LockUserChanges = True
                    newVw.Save()
                    newVw.Apply()

                    ' PR_DEFAULT_VIEW_ENTRYID:
                    Dim ns = "http://schemas.microsoft.com/mapi/proptag/"
                    Dim PR_DEFAULT_VIEW_ENTRYID = "0x36160102"
                    Dim PR_FOLDER_XVIEWINFO_E = "0x36E00102"
                    Dim defaultVw = testFolder.PropertyAccessor.GetProperty(ns & PR_DEFAULT_VIEW_ENTRYID)
                    Dim xVwInfo = testFolder.PropertyAccessor.GetProperty(ns & PR_FOLDER_XVIEWINFO_E)

                    ' the defaultVw is nothing for the first time (actually throw exception)
                    ' if i manually change it from the outlook, 
                    '   the value will be something like: 000000004B593F3D35EF8C42AB181C105AE444D40700E46C905CB9ABE446AA44351902AFC40E000026BF7A8C000040DB82FE9B98724F9B222A9C9BDB42CD0000005CF0280000

                    ' **** The problem is how to get the correct binary data for the newly created view so i can set it like this: *****
                    'testFolder.PropertyAccessor.SetProperty(ns & PR_DEFAULT_VIEW_ENTRYID, testFolder.PropertyAccessor.StringToBinary(newVw.Name))
                Catch ex As Exception
                    ' _log.Warn(String.Format("Error set initial view {0} to folder - {1}", newVw.Name, testFolder.Name), ex)
                    exCatched = ex
                    ' First time error 'The property "http://schemas.microsoft.com/mapi/proptag/0x36160102" is unknown or cannot be found' will be shown
                    ' If we set the initial view of the folder in the outlook, this error will go away
                End Try
            End If
        Catch ex As Exception
            Debug.WriteLine(ex.Message)
            Debug.WriteLine(ex.StackTrace)
            exCatched = ex
        Finally
            If ol IsNot Nothing Then
                Marshal.ReleaseComObject(ol)
                ol = Nothing
            End If
        End Try

        If exCatched IsNot Nothing Then
            Throw exCatched
        End If
    End Sub
End Class

现在唯一剩下的部分是如何从新创建的视图中获取正确的二进制数据。一些操纵二进制值的线索:http ://microsoft.public.win32.programmer.messaging.narkive.com/x1fNHHA5/default-view

但是它是用不同的语言编写的,我不知道如何在 vb 或 c# 中制作它。

任何帮助表示赞赏。

4

1 回答 1

0

您是否尝试过 MAPIFolder.CurrentView 和 MAPIFolder.Views?

于 2013-03-13T13:48:57.250 回答