簡體   English   中英

將多個項目從一個 outlook 文件夾移動到另一個文件夾時出現問題 - Powershell

[英]Issue with moving multiple items from one outlook folder to another - Powershell

我正在嘗試通過 mapi 尋址從 outlook 收件箱文件夾中發送 select 多封電子郵件,並希望將這些電子郵件的副本移動到同一收件箱中的另一個文件夾。

不幸的是,我的腳本似乎可以為所欲為,有時會復制 6 封電子郵件,然后因以下失敗而停止,有時會在第一個 email 時停止。

失敗:

...“維姆”)} | ForEach-Object {$_.Copy().Move($Namespace.Folders.Item("$... + ~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + CategoryInfo: OperationStopped: (:) [ForEach-Object], COMException + FullyQualifiedErrorId : System.Runtime.InteropServices.COMException,Microsoft.PowerShell.Commands.ForEachObjectCommand

我找不到任何解決方案,我坐在這里很困惑,因為在另一個郵箱中代碼工作正常。

當然,我事先設置了變量$Mailbox$TempWorkPath

在此先感謝您的幫助。

嘗試在 foreach 循環中運行代碼會降低性能並以同樣的問題結束。

大約 3 小時的谷歌搜索根本沒有幫助我。

僅僅移動 object 會導致代碼中斷,可能是因為索引化?

Add-Type -Assembly "Microsoft.Office.Interop.Outlook"
$OutlookSession = New-Object -ComObject Outlook.Application
$Namespace = $OutlookSession.GetNameSpace("MAPI")
$Namespace.Folders.Item("$Mailbox").Folders.Item("Posteingang").Items.Restrict('[UnRead] = True') | Where-Object {($_.Subject -match "ackup") -or ($_.SenderEmailAddress -match "veeam")} | ForEach-Object {$_.Copy().Move($Namespace.Folders.Item("$Mailbox").Folders.Item("Posteingang").Folders.Item("$TempWorkPath"))} | Out-Null

<# 對選定/復制的電子郵件執行操作 #>

[System.Runtime.Interopservices.Marshal]::ReleaseComObject($OutlookSession) | Out-Null
$OutlookSession = $null | Out-Null

理論上,根據我在另一個文件夾中的測試,這應該可以正常工作,創建 email 的副本,將其移動到我的文件夾,然后我可以用它做一些事情。

好吧,我想我找到了解決這個問題的方法。 在 while 循環而不是 foreach 循環中運行命令似乎效果更好。

$Inbox = $Namespace.Folders.Item("$Mailbox").Folders.Item("Posteingang").Items.Restrict('[UnRead] = True') | Where-Object {($_.Subject -match "ackup") -or ($_.SenderEmailAddress -match "veeam")}

$MailCounter = $Inbox.Count
$HelperForCounting = 0

while ($MailCounter -gt $HelperForCounting)
{
    $Inbox[$MailCounter].Copy().Move($Namespace.Folders.Item("$Mailbox").Folders.Item("Posteingang").Folders.Item("$TempWorkPath"))
    $MailCounter = $MailCounter - 1
}

問候

我在處理 Outlook 上的電子郵件時也遇到了這個問題。我的總體方案是逐個文件夾處理電子郵件。 我將問題追溯到 Emails.getNext() function。我完全沒有根據的猜測是它與電子郵件的並行處理以及它如何在 ForEach() 和 getNext() 中獲取它們有關。 使用 getLast() 問題消失了。

請注意,在以下代碼中,它只會將所有已讀電子郵件移動到存檔文件夾,然后將一些未讀電子郵件移動到公司轉儲文件夾,並將大多數未讀電子郵件移動到未讀文件夾。 這本身只是 .p0r email 腳本的一個突變。 在 function 塊的末尾有一個 > $null 是我最初在 ForEach 循環中使用它的地方,它按預期工作,但它不適用於 While 循環塊 function。相反,必須將其移動到移動未讀部分中的位置。 仍有很大的改進空間,會出現一些奇怪的 com 錯誤,但只要將 GetLast() email 移出文件夾,它就會通過收件箱進行處理。

至於根本原因的基本原理,我注意到無法讀取整個收件箱取決於收件箱的大小。 因此,每個人都通過收件箱中剩余電子郵件的 2/3 運行我的 go。

# OUTLOOK RULES #
#################
# OUTLOOK RULES #
#################

#Import Object Library?
Add-Type -assembly "Microsoft.Office.Interop.Outlook"

# VARIABLES
$index=0;
$pstPath = "C:\YOURPATHHERE"     

# DISPLAY INFO
function display( [string]$subject, [string]$color , [string]$out)  {

    # REQUIRED LENGTH OF STRING
    $len = 20

    # STRINGS THAT ARE LONGER WILL BE CUT DOWN,
    # STRINGS THAT ARE TO SHORT WILL BE MADE LONGER
    if ( $subject.length -lt 20 ){
        $toadd=20-$subject.length;
        for ( $i=0; $i -lt $toadd; $i++ ){
            $subject=$subject+" ";
        }
        $len = $subject.length
    }
    else { $len = 20 }
    
    $index=$index+1
    Write-host -ForegroundColor $color -nonewline " |" ((($subject).ToString()).Substring(0,$len)).ToUpper()
}

# CREATING OUTLOOK OBJECT
$outlook = New-Object -comobject outlook.application
$namespace = $outlook.GetNameSpace("MAPI")

# GETTING PST FILE THAT WAS SPECIFIED BY THE PSTPATH VARIABLE
$pst = $namespace.Stores | ?{$_.FilePath -eq $pstPath}

# ROOT FOLDER
$pstRoot = $pst.GetRootFolder()

# SUBFOLDERS
$pstFolders = $pstRoot.Folders
$fArchive = $pstFolders.Item("Archive")

# PERSONAL SUBFOLDER
$personal = $pstFolders.Item("Personal")

# INBOX FOLDER 
$DefaultFolder = $namespace.GetDefaultFolder(6)

# INBOX SUBFOLDERS
$InboxFolders = $DefaultFolder.Folders

# DELETED ITEMS
$DeletedItems = $namespace.GetDefaultFolder(3)

# EMAIL ITEMS
$Emails = $DefaultFolder.Items

$workingFile = [IO.Path]::GetTempFileName()

# PROCESSING EMAILS
$currentWriteFolder = $pstFolders.Item("Archive")

While ($Emails.count -gt 0) {
    $Email = $Emails.GetLast() 
    #Move all reads into Archive
    if (!$Email.Unread) {
    $email.move($fArchive) > $null
    continue
    } 
    #Filter unread items by sender
    $WriteString = $Email.SenderEmailAddress.ToString()
    [IO.File]::WriteAllLines($workingFile, $WriteString)
    if (Select-String -Path $workingFile -Pattern "company") {
        $email.move($currentWriteFolder.Folders.Item("globalcorp"))
        continue
    }
    $email.move($pstFolders.Item("Unread"))
    
} # > $null


[IO.File]::Delete($workingFile)

Write-host ""

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM