0
votes

I am trying to select multiple emails from on outlook inbox folder via mapi addressing and want to move a copy of these emails to another folder in the same inbox.

Unfortunately my script seems to do whatever it wants, sometimes copying 6 emails before stopping with following failure, sometimes stopping right with the first email.

Failure:

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

I could not find any solution for this and I am sitting here confused since in another mailbox the code works just fine.

Of course I am setting the variables $Mailbox and $TempWorkPath beforehand.

Thanks in advance for your help.

Trying to run the code in a foreach-loop is less performant and ends with the same issue.

About 3 hours of google search did not help me at all.

Just moving the object causes the code to break, probably because of indexiation?

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

<# Do things with the selected/coppied emails #>

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

In Theory an based on my tests in another folder this should work perfectly fine, create a copy of the email, move it to my folder and afterwards I can do things with it.

1

1 Answers

0
votes

Well, I think I found my way around the issue. Running the command in a while loop instead of an foreach loop seems to work better.

$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
}

Greetings