如何使用PowerShell转发Outlook中的未读邮件
PowerShell 转发Outlook未读邮件的正确方法
你当前代码的问题在于使用了Select Subject, SenderEmailAddress, Body,这会把原始的Outlook邮件对象转换成仅包含指定属性的自定义对象,丢失了Outlook邮件自带的Forward()方法,导致无法直接执行转发操作。
正确的做法是保留完整的邮件对象,直接调用其内置的转发方法,以下是修正后的代码:
处理单封未读邮件(第一封)
$Outlook = New-Object -ComObject Outlook.Application $NameSpace = $Outlook.GetNamespace('mapi') $Mailbox = $NameSpace.Stores['user@domain.ru'].GetRootFolder() $Inbox = $Mailbox.Folders['Inbox'] # 筛选未读邮件,不要用Select-Object,保留完整的邮件对象 $mail_unread = $Inbox.Items | Where-Object { $_.Unread -eq $true } if ($mail_unread.Count -gt 0) { # 获取第一封未读邮件 $targetMail = $mail_unread.Item(0) # 调用Forward()方法创建转发邮件 $forwardMail = $targetMail.Forward() # 设置转发收件人 $forwardMail.To = "user2@domain.ru" # 发送转发邮件 $forwardMail.Send() # 可选:将原邮件标记为已读 $targetMail.Unread = $false }
处理所有未读邮件
如果需要批量转发所有未读邮件,用foreach循环遍历即可:
$Outlook = New-Object -ComObject Outlook.Application $NameSpace = $Outlook.GetNamespace('mapi') $Mailbox = $NameSpace.Stores['user@domain.ru'].GetRootFolder() $Inbox = $Mailbox.Folders['Inbox'] $mail_unread = $Inbox.Items | Where-Object { $_.Unread -eq $true } foreach ($mailItem in $mail_unread) { $forwardMail = $mailItem.Forward() $forwardMail.To = "user2@domain.ru" $forwardMail.Send() $mailItem.Unread = $false }
关键说明
- 必须保留原始的Outlook邮件对象,不能用
Select-Object截断属性,否则会丢失Forward()等核心方法 Forward()方法会自动保留原邮件的主题(自动添加"FW: "前缀)、正文、附件等内容,无需手动复制- 发送后设置
$mailItem.Unread = $false,可避免重复转发同一封邮件
内容的提问来源于stack exchange,提问作者user3919982
相关产品推荐
相关产品推荐

