Exchange Server下PowerShell邮件打印脚本格式报错及修复求助
问题解决:Exchange PowerShell脚本获取并打印邮件
核心问题分析
你用Get-MailboxFolderStatistics获取邮件是逻辑错误,这个cmdlet的作用是返回邮箱文件夹的统计信息(比如文件夹大小、项目总数等),它的Items属性并不是实际的邮件对象集合,因此无法直接通过ReceivedTime筛选,这就是代码报错的根本原因。
修正后的完整脚本
# 打印邮件的函数 function Print-Emails { # 连接Exchange Server $session = New-PSSession -ConfigurationName Microsoft.Exchange -ConnectionUri http://XXX17.XXX.local/PowerShell/ -Authentication Kerberos Import-PSSession $session -DisableNameChecking -ErrorAction Stop # 获取上次检查时间(从注册表读取) $lastCheckTime = Get-ItemPropertyValue -Path "HKCU:\Software\MyScript" -Name "LastCheckTime" -ErrorAction SilentlyContinue if (-not $lastCheckTime) { # 首次运行,默认检查最近5分钟的邮件 $lastCheckTime = (Get-Date).AddMinutes(-5) } # 正确获取收件箱中符合时间条件的邮件 $mailboxIdentity = "directprint@XXX.local" $emails = Get-MailboxFolderItem -Identity "$mailboxIdentity`:Inbox" | Where-Object {$_.ReceivedTime -ge $lastCheckTime} # 处理新邮件打印 if ($emails) { foreach ($email in $emails) { Write-Host "正在打印来自 $($email.From) 的邮件,主题:$($email.Subject)" # 将邮件内容转换为可打印的文本格式 $emailContent = @" 主题: $($email.Subject) 发件人: $($email.From) 收件时间: $($email.ReceivedTime.ToString("yyyy-MM-dd HH:mm:ss")) 内容: $($email.Body) "@ # 发送到打印机 $emailContent | Out-Printer -Name "TOSHIBA XXX " } } else { Write-Host "没有新邮件需要打印" } # 更新注册表中的上次检查时间(自动创建路径) if (-not (Test-Path "HKCU:\Software\MyScript")) { New-Item -Path "HKCU:\Software\MyScript" -Force | Out-Null } Set-ItemProperty -Path "HKCU:\Software\MyScript" -Name "LastCheckTime" -Value (Get-Date) # 断开Exchange会话 Remove-PSSession $session } # 每5分钟循环检查一次 while ($true) { Print-Emails Start-Sleep -Seconds 300 }
关键修改点说明
- 替换获取邮件的cmdlet:用
Get-MailboxFolderItem替代Get-MailboxFolderStatistics,这个cmdlet专门用于获取邮箱文件夹中的实际项目(邮件、日历项等),可以直接访问ReceivedTime、From、Subject等邮件属性。 - 修复路径格式:
Get-MailboxFolderItem的Identity参数需要用邮箱名:文件夹名的格式,比如directprint@XXX.local:Inbox。 - 优化打印内容:直接传递邮件对象给
Out-Printer无法输出可读内容,因此将邮件关键信息拼接成文本格式再打印。 - 增加容错处理:给
Import-PSSession加上-ErrorAction Stop确保连接失败时及时报错;同时自动创建注册表路径,避免首次运行时的路径不存在错误。
额外注意事项
- 运行脚本的账号需要拥有Exchange Server的Mailbox Import Export权限,以及目标邮箱的读取权限。
- 如果你的Exchange版本不支持
Get-MailboxFolderItem,可以改用Search-Mailbox(需对应权限),但这种方法会将邮件复制到临时文件夹,后续需手动清理:
$emails = Search-Mailbox -Identity $mailboxIdentity -SearchQuery "Received:$lastCheckTime.." -TargetMailbox $mailboxIdentity -TargetFolder "PrintTemp" -LogLevel Full -ResultSize Unlimited
- 打印机名称需确保准确,可用
Get-Printer命令查看系统中可用的打印机名称,避免空格或拼写错误。
内容的提问来源于stack exchange,提问作者Tgefkug
相关产品推荐
相关产品推荐

