通过powershell在Outlook的联系人条目中找不到电子邮件地址

5
当我检查一个时,所有的Email#Address值都是null。我尝试设置该值,然后打印该值。更改在Outlook中反映出来,但是无法通过PowerShell检索任何值。
以下是一些片段:
$Outlook=NEW-OBJECT –comobject Outlook.Application
$Contacts=$Outlook.session.GetDefaultFolder(10).items
$Contactsfolders = $Outlook.session.GetDefaultFolder(10).Folders
$testFolder = $Contactsfolders | Where-Object {$_.Name -eq 'Test Folder'}
$testContact = $testFolder.Items(1)

echo $testContact
$testContact.Email1Address = "BobDoe3@doe.com"
echo $testContact

以下是上述执行的输出结果。请注意,我已经删除了一些无关紧要的信息以缩短长度。 第一个回声
Application                  : Microsoft.Office.Interop.Outlook.ApplicationClass
Class                        : 40
Session                      : Microsoft.Office.Interop.Outlook.NameSpaceClass
ConversationTopic            : John Doe
FormDescription              : System.__ComObject
GetInspector                 : System.__ComObject
Importance                   : 1
LastModificationTime         : 10/31/2017 5:57:04 PM
MAPIOBJECT                   : System.__ComObject
MessageClass                 : IPM.Contact
OutlookInternalVersion       : 154971
OutlookVersion               : 15.0
Saved                        : True
Sensitivity                  : 0
Size                         : 11614
Subject                      : Bob Doe
UserProperties               : System.__ComObject
Account                      : 
Anniversary                  : 1/1/4501 12:00:00 AM
AssistantName                : 
AssistantTelephoneNumber     : 
Birthday                     : 1/1/4501 12:00:00 AM
CompanyAndFullName           : The Doe Company
                               Doe, Bob
CompanyLastFirstNoSpace      : 
CompanyLastFirstSpaceOnly    : 
CompanyMainTelephoneNumber   : 
CompanyName                  : The Doe Company
ComputerNetworkName          : 
CustomerID                   : 
Department                   : 
Email1Address                : 
Email1AddressType            : 
Email1DisplayName            : 
Email1EntryID                : 
Email2Address                : 
Email2AddressType            : 
Email2DisplayName            : 
Email2EntryID                : 
Email3Address                : 
Email3AddressType            : 
Email3DisplayName            : 
Email3EntryID                : 
FileAs                       : Doe, Bob
FirstName                    : Bob
FTPSite                      : 
FullName                     : Bob Doe
FullNameAndCompany           : Doe, Bob
                               The Doe Company
Gender                       : 0
GovernmentIDNumber           : 
Hobby                        : 
Home2TelephoneNumber         : 
HomeAddress                  : 
HomeAddressCity              : 
HomeAddressCountry           : 
HomeAddressPostalCode        : 
HomeAddressPostOfficeBox     : 
HomeAddressState             : 
HomeAddressStreet            : 
HomeFaxNumber                : 
HomeTelephoneNumber          : 
Initials                     : B.D.
InternetFreeBusyAddress      : 
ISDNNumber                   : 
JobTitle                     : 
Journal                      : False
Language                     : 
LastFirstAndSuffix           : 
LastFirstNoSpace             : 
LastFirstNoSpaceCompany      : 
LastFirstSpaceOnly           : 
LastFirstSpaceOnlyCompany    : 
LastName                     : Doe
LastNameAndFirstName         : Doe, Bob

第二次回声

Application                  : Microsoft.Office.Interop.Outlook.ApplicationClass
Class                        : 40
Session                      : System.__ComObject
Subject                      : Bob Doe
UnRead                       : False
UserProperties               : System.__ComObject
Account                      : 
Anniversary                  : 1/1/4501 12:00:00 AM
AssistantName                : 
AssistantTelephoneNumber     : 
Birthday                     : 1/1/4501 12:00:00 AM
Business2TelephoneNumber     : 
BusinessAddress              : 
BusinessAddressCity          : 
BusinessAddressCountry       : 
BusinessAddressPostalCode    : 
BusinessAddressPostOfficeBox : 
BusinessAddressState         : 
BusinessAddressStreet        : 
BusinessFaxNumber            : 
BusinessHomePage             : 
BusinessTelephoneNumber      : 
CallbackTelephoneNumber      : 
CarTelephoneNumber           : 
Children                     : 
CompanyAndFullName           : The Doe Company
                               Doe, Bob
CompanyLastFirstNoSpace      : 
CompanyLastFirstSpaceOnly    : 
CompanyMainTelephoneNumber   : 
CompanyName                  : The Doe Company
ComputerNetworkName          : 
CustomerID                   : 
Department                   : 
Email1Address                : 
Email1AddressType            : 
Email1DisplayName            : 
Email1EntryID                : 
Email2Address                : 
Email2AddressType            : 
Email2DisplayName            : 
Email2EntryID                : 
Email3Address                : 
Email3AddressType            : 
Email3DisplayName            : 
Email3EntryID                : 
FileAs                       : Doe, Bob
FirstName                    : Bob
FTPSite                      : 
FullName                     : Bob Doe
FullNameAndCompany           : Doe, Bob
                               The Doe Company
Gender                       : 0
GovernmentIDNumber           : 
Hobby                        : 
Home2TelephoneNumber         : 
HomeAddress                  : 
HomeAddressCity              : 
HomeAddressCountry           : 
HomeAddressPostalCode        : 
HomeAddressPostOfficeBox     : 
HomeAddressState             : 
HomeAddressStreet            : 
HomeFaxNumber                : 
HomeTelephoneNumber          : 
Initials                     : B.D.
InternetFreeBusyAddress      : 
ISDNNumber                   : 
JobTitle                     : 
Journal                      : False
Language                     : 
LastFirstAndSuffix           : 
LastFirstNoSpace             : 
LastFirstNoSpaceCompany      : 
LastFirstSpaceOnly           : 
LastFirstSpaceOnlyCompany    : 
LastName                     : Doe
LastNameAndFirstName         : Doe, Bob

我在尝试不同的结果和解决方案时发现了一些有趣的东西。我发现以下两个查询都会产生相同的匹配结果,这让我感到困惑,因为我认为myString -ne ''是在检查字符串是否为空。看起来myString -ne ''[String]::IsNullOrEmpty($myString)都可以返回true,这似乎是不可能的,但我认为有些情况下可能会出现这种情况。另外,请注意IsNullOrEmpty函数速度非常快。
$Listconstact=$session.GetDefaultFolder(10).Folders | %{$session.GetFolderFromID($_.EntryID).Items | where Email1Address -NE ''}

并且

$Listconstact=$session.GetDefaultFolder(10).Folders | %{$session.GetFolderFromID($_.EntryID).Items | where {[String]::IsNullOrEmpty($_.Email1Address)}}
VERBOSE: From:
VERBOSE: Subject: How are things
VERBOSE: From:
VERBOSE: Subject: See you soon
VERBOSE: From:
VERBOSE: Subject: Meeting Times

1
请检查IMAddress属性。我发现如果组织启用了Skype for Business,则可能会在该属性下找到实际的电子邮件地址。 - FoxDeploy
1
可能是 https://dev59.com/EmXWa4cB1Zd3GeqPPrha 的重复问题。 - Tarun Lalwani
@FoxDeploy 实际上我们正在使用Skype for Business。我会检查一下。我查看了所有参数,但没有从一般回显中找到电子邮件地址值。不过,我很感谢您的建议。 - galford13x
1
@galford13x,你看了我发的链接吗?有帮助吗? - Tarun Lalwani
@galford13x:我尝试着解决了你的问题,但我不确定那是否是你想要做的。 - tukan
显示剩余4条评论
2个回答

1
尝试像这样做些事情:

$Outlook=NEW-OBJECT –comobject Outlook.Application
$session=$Outlook.session
$Listconstact=$session.GetDefaultFolder(10).Folders | %{$session.GetFolderFromID($_.EntryID).Items | where Email1Address -ne ''}

#only one item
Write-Host "First element mail : $($Listconstact[0].Email1Address)`n`n" 


#All mails
Write-Host "All element mail :"
$Listconstact.Email1Address

这似乎没有起作用。然而,我添加了一个#Listconstact.Count来查看有多少项与LINQ语句匹配,结果是1222。这让我认为有值,但它们没有被打印出来。这是输出:1222\n 第一个元素邮件: \n 所有元素邮件:\n - galford13x
1
尝试一下这个,将文件 $Listconstact.Email1Address 输出到 "c:\temp\result.txt" 中。 - Esperento57
result.txt文件为空。另外请注意,如果($Listconstact[0].Email1Address -ne '')的结果为true,$Listconstact[0].Email1Address.Length的结果为0。然而,有趣的是[String] :: IsNullOrEmpty($Listconstact[0].Email1Address)也会得出true的结果,这让我对原始的Where-Object查询产生了疑问。 - galford13x
如果您尝试修改 where Email1Address -ne $null 的位置 - Esperento57
这会导致一个空的 Enumerable(没有匹配项)。从我的试验中,似乎[String] :: IsNullOrEmpty($ Listconstact [0] .Email1Address)==($ Listconstact [0] .Email1Address -ne''),这似乎是不可能的。我确定这里有一些奇怪的powershell陷阱,已经变成了一个兔子,我一直在跟随它。我不完全确定在这一点上该去哪里。 - galford13x

0

我有点模糊你想要实现什么。在我看来,你似乎把两件事情混在一起了——联系人和文件夹。

我不确定你是想从Outlook邮件还是地址簿中获取信息(因为你使用的是文件夹,我猜测应该是前者)。如果解决方案不能解决你的问题,我很乐意纠正它。

注意:我的配置不完全相同,但足够接近:Outlook版本:15.0.0.4420,PowerShell版本:4.0.30319

我会尽力涵盖我认为你想要解决的问题——从“测试文件夹”@Outlook中收到的所有联系人的电子邮件地址(同时添加主题)

# Making sure we have the assembly loaded
Add-Type -assembly "Microsoft.Office.Interop.Outlook" 
# saving the mapping
$olFolders = "Microsoft.Office.Interop.Outlook.OlDefaultFolders" -as [type]

# new object
$Outlook=NEW-OBJECT –comobject Outlook.Application
# setting the correct namespace
$namespace = $Outlook.GetNameSpace("MAPI")

# getting all folders in Outlook inbox
$inbox = $namespace.GetDefaultFolder($olFolders::olFolderInbox)
# filtering out all but the "Test Folder"
$targetFolder = $inbox.Folders.Item("Test Folder")

# iteration on email message 
ForEach($emailMessage in $targetFolder.items) {
    # getting all the information from the message 
    Write-Verbose -message "From: $($emailMessage.GetProperty) $($emailMessage.SenderEmailAddress)" -Verbose
    Write-Verbose -message "Subject: $($emailMessage.Subject)" -Verbose
}

为什么要使用 MAPI 命名空间?因为MSDN这样说

我本以为 myString -ne '' 是检查字符串是否为空。

是的,它确实可以做到。不同之处在于方法 [String]::IsNullOrEmpty($myString) 检查字符串中的 Null空值。如果有一个 $null 值,则两者都为真。它既不为空也是 $null。(更多信息请参见 $null 值的含义)


我有一段时间没有回来看了,很抱歉。tukan,你的方法有点起作用,但是我在通讯录中查找。然而,你的解决方案也存在同样的问题。我的输出不包含发件人电子邮件地址。主题确实正确打印。但是From: .....输出为空白。 - galford13x
你正在使用Exchange或Exchange Online吗?如果是的话,你可以使用EWS API来代替(慢)COM方式,而且还需要Outlook。从Exchange服务器检索此类信息时,EWS应始终是首选方式。如果你没有使用Exchange,那么我当然什么也没说。 - bluuf
@galford13x 这很奇怪。我已经在我的Outlook上测试过了,它可以正常工作。你是否有Office365或类似的软件? - tukan
我确实相信这是Office365。 - galford13x
@galford13x 我明白了,那很可能是问题的原因。你需要换个角度来解决它。我没有 Office365 可以测试,所以无法帮助你。 - tukan
我明白了,无论如何感谢您的帮助。我相信这可能与我们的AD设置有关。如果我找到了解决方案,我一定会发布出来。 - galford13x

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接