You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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确保连接失败时及时报错;同时自动创建注册表路径,避免首次运行时的路径不存在错误。

额外注意事项

  1. 运行脚本的账号需要拥有Exchange Server的Mailbox Import Export权限,以及目标邮箱的读取权限。
  2. 如果你的Exchange版本不支持Get-MailboxFolderItem,可以改用Search-Mailbox(需对应权限),但这种方法会将邮件复制到临时文件夹,后续需手动清理:
$emails = Search-Mailbox -Identity $mailboxIdentity -SearchQuery "Received:$lastCheckTime.." -TargetMailbox $mailboxIdentity -TargetFolder "PrintTemp" -LogLevel Full -ResultSize Unlimited
  1. 打印机名称需确保准确,可用Get-Printer命令查看系统中可用的打印机名称,避免空格或拼写错误。

内容的提问来源于stack exchange,提问作者Tgefkug

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.25 13:18:20