【问题标题】:How to read Custom Field value of outlook如何读取 Outlook 的自定义字段值
【发布时间】:2012-01-23 00:17:28
【问题描述】:

谁能告诉我如何使用c#读取outlook的自定义字段值

现在我尝试了“UserProperties”和“ItemProperties”。两者都在抛出错误。我的示例代码如下

Microsoft.Office.Interop.Outlook.Application f = new Microsoft.Office.Interop.Outlook.Application();
NameSpace outlookNS = f.GetNamespace("MAPI");
MAPIFolder inboxFolder = outlookNS.GetDefaultFolder(OlDefaultFolders.olFolderInbox);


foreach (object obj in inboxFolder.Items)
{
    MailItem item = obj as MailItem;
    if (item != null)
    {
        Console.WriteLine(item.UserProperties["test"].Value);
        Console.WriteLine(item.ItemProperties["test"].Value);
    }
}

提前致谢

【问题讨论】:

    标签: c# vba email outlook outlook-2003


    【解决方案1】:

    这个回复对你来说可能有点晚了。但是我遇到了与原始发布者相同的问题(需要从 Outlook 的用户定义字段(自定义字段)中提取值)。

    某个地方的某个人共享了一个 VBA 宏来完成这项工作。所以我四处寻找一种在powershell中执行Outlook宏VBA的方法。事实证明,在 2003 SP2 版本之后,Outlook 停止支持 /autorun 宏。我几乎只是为了 /autorun 从 Outlook 2019 切换到 Outlook 2003。然后我想到 Outlook 2003 在并排显示多个日历方面不如 Outlook 2019 好。所以我决定继续使用 2019。长话短说,我按摩了 VBA 宏以在 Powershell 中运行,它对我有用。我基本上在事物前面添加了几个美元符号,并在这里和那里删除了一些东西,然后它就起作用了。我希望它也适用于仍在寻找答案的其他人:

    Function Get-ContactUDF
    {
     Add-Type -assembly "Microsoft.Office.Interop.Outlook" -ErrorAction Stop -ErrorVariable "OutlookError"
     $Outlook = New-Object -comobject Outlook.Application -ErrorAction stop -ErrorVariable "ApplicationError"
     $objNameSpace = $Outlook.GetNameSpace("MAPI")
     $objContacts  = $objNameSpace.GetDefaultFolder([Microsoft.Office.Interop.Outlook.OlDefaultFolders]::olFolderContacts)
     $objContact = $objContacts.Items.Find("[FirstName] = ""John""")
     $objProperty = $objContact.UserProperties.Find("Favorite Character in Lord of the Rings")
     $objProperty.Value
    }
    

    以防万一代码不清楚。此 powershell 函数将查找 FirstName 为“John”的联系人,然后在名为“指环王中最喜欢的角色”的自定义字段下找到值并打印出该值(例如 Frodo)。要运行它,当然你只需在 powershell 下执行此操作:

    Get-ContactUDF
    

    顺便说一句,如果您只想从默认字段(Outlook 附带的那些内置字段,例如名字、姓氏、生日、电话号码、配偶姓名、头衔等)打印值,则如下所示:

    Function Get-OutlookContacts
    {
     Add-Type -assembly "Microsoft.Office.Interop.Outlook" -ErrorAction Stop -ErrorVariable "OutlookError"
     $Outlook = New-Object -comobject Outlook.Application -ErrorAction stop -ErrorVariable "ApplicationError"
     $namespace = $Outlook.GetNameSpace("MAPI")
     $contactObject  = $namespace.GetDefaultFolder([Microsoft.Office.Interop.Outlook.OlDefaultFolders]::olFolderContacts)
    }
    

    只需键入即可调用此函数:

    Get-OutlookContacts
    

    在 Powershell 中

    这将列出联系人数据库中的所有内容:

    $contactObject.Items
    

    这将列出联系人数据库中的所有对象名字、姓氏、生日、电子邮件地址、手机:

    $contactObject.Items | Select-Object -Property FirstName, LastName, Birthday, Email1Address, MobileTelephoneNumber
    

    发出下一个命令以抓取对象并仅列出名字对象等于 Rambo 的位置:

    $contactObject.Items | Select-Object -Property FirstName, LastName, Birthday, Email1Address, MobileTelephoneNumber | where-object {$_.Firstname -eq "Rambo" }
    

    希望这些例子很清楚。我在 Windows 10 完全离线模式(无云,无 365)上使用 Outlook 2019。如果你使用 365 那么上面的代码可能需要修改。

    我还记得其他人要求使用 Powershell 提取 Outlook 日历事件的方法。如果我再次遇到这个问题,我会发布答案。基本一样的钻。我从某处读取了一些 VB 代码,然后将其转换为 Powershell 脚本。各位喜欢的话可以自己做。只需添加美元符号并删除 DIM 行。

    【讨论】:

      【解决方案2】:

      在使用 Outlook 进行实验后,此答案已被重写。

      我的 C# 足以让我知道你在做什么,但我还没有尝试从 C# 访问 Outlook。

      ItemsItem 都在 Outlook 模型中使用。我不知道您是否可以按照您尝试的方式使用item

      如果用户属性“test”不存在,UserProperties 将引发错误。下面我将展示如何测试是否存在。您是否添加了用户属性而忘记保存修改后的邮件项?

      下面显示了从 Outlook VBA 对用户属性的访问。我希望 InterOp 模型与语法允许的一样相似。我知道的重要区别:

      • C# 不需要Set
      • Nothingnull 的 VBA 等效项。

      变量:

      • FolderItem 是文件夹中的一项,已被测试为 olMail 类。
      • UserProp 是 UserProperty 类型。
      • InxUP 是整数类型。

      下面添加一个名为“TestProp”并键入olText的用户属性,将其值设置为“TestProp的值”并保存修改后的邮件项。没有保存,前面的语句就没有效果。

      With FolderItem 
        Set UserProp = .UserProperties.Add("TestProp", olText)
        UserProp.Value = "Value for TestProp"
        .Save 
      End with
      

      以下将每个用户属性的名称和值针对邮件项输出到即时窗口。

      For InxUP = 1 To .UserProperties.Count
        Debug.Print "    User prop " & InxUP & _
                              .UserProperties(InxUP).Name & " " & _
                              .UserProperties(InxUP).Value
      Next
      

      以下检查用户属性“TestProp”是否存在,如果存在,则将其值输出到即时窗口。

      Set UserProp = .UserProperties.Find("TestProp")
        If Not UserProp Is Nothing Then
          Debug.Print "    TestProp " & .UserProperties("TestProp").Value
      End If
      

      希望对你有帮助

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-12-24
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多