如何在PowerShell脚本中指定共享邮箱获取邮件元数据
在PowerShell脚本中访问共享邮箱的正确方法
你之前尝试的GetSharedDefaultFolder是正确方向,但调用方式有误。以下是修改后的完整脚本,可直接替换原脚本中获取邮箱根目录的部分:
修改后的完整脚本
Set-StrictMode -Version "Latest" $ErrorActionPreference = "Stop" function Get-MailFromOutlookFolder { [CmdletBinding()] param ( [Parameter(Mandatory = $true)] [Object] $ParentFolder ) $items = @() foreach ($folder in $ParentFolder.Folders) { foreach ($item in ($folder | Select-Object -ExpandProperty "Items")) { if ($item.Class -eq 43) { # 处理邮件,保留原有逻辑 $items += $item | Select-Object -Property "ConversationTopic", "ReceivedTime", @{ "Label" = "Folder"; "Expression" = { $_.Parent.Name } } } } # 递归处理子文件夹 $items += Get-MailFromOutlookFolder -ParentFolder $folder } return $items } $outlook = New-Object -Com "Outlook.Application" $mapi = $outlook.GetNamespace("MAPI") # 关键:获取共享邮箱的收件人对象 $sharedMailboxEmail = "shared@yourdomain.com" # 替换为你的共享邮箱地址 $recipient = $mapi.CreateRecipient($sharedMailboxEmail) $recipient.Resolve() # 必须解析收件人,确保Outlook能识别 # 获取共享邮箱的收件箱根目录,再取父级作为邮箱根 $sharedInbox = $mapi.GetSharedDefaultFolder($recipient, [Microsoft.Office.Interop.Outlook.OlDefaultFolders]::olFolderInbox) $mailboxRoot = $sharedInbox.Parent $results = Get-MailFromOutlookFolder -ParentFolder $mailboxRoot $results | Export-Csv -Path "C:\Temp\shared_email.csv" -Encoding UTF8 -NoTypeInformation
之前尝试的错误原因
- 尝试1:
mapi.Folder(1)是错误方法名,Outlook MAPI对象无此方法,正确的是GetDefaultFolder或GetSharedDefaultFolder。 - 尝试2:直接访问OST/PST文件路径无效,Outlook COM对象通过MAPI命名空间的对象模型访问邮箱,而非文件系统路径。
- 尝试3:这是VBScript语法,PowerShell变量赋值无需
Set,且不能用文件路径作为文件夹名称参数。 - 尝试4:错误直接实例化
Microsoft.Office.Interop.Outlook.Recipient,正确做法是通过mapi.CreateRecipient()创建收件人对象,再调用Resolve()确认。
注意事项
- 确保Outlook已添加并授权当前用户访问该共享邮箱。
- 脚本运行时Outlook需处于打开状态(或允许COM自动化启动Outlook)。
- 若遇权限问题,检查共享邮箱的授权设置,确认当前用户拥有读取权限。
内容的提问来源于stack exchange,提问作者oymonk
相关产品推荐
相关产品推荐

