【问题标题】:Exchange Online - EWS API - removing calendar itemsExchange Online - EWS API - 删除日历项目
【发布时间】:2021-07-15 14:50:27
【问题描述】:

Outlook,我想删除“旧日历”项目。

我的工作流程是:

  • 先清除每个日历中的项目,然后确认其为空并删除。

但是,我已经检查了下面的行。但是$oFindFolderResults 为空。

$oFindFolderResults = $service.FindFolders([Microsoft.Exchange.WebServices.Data.WellKnownFolderName]::MsgFolderRoot,$oSearchFilter,$oFolderView)

【问题讨论】:

    标签: powershell calendar exchange-server exchangewebservices


    【解决方案1】:

    您的代码将始终绑定到您使用的安全凭据的邮箱,因为您没有包含任何模拟代码,如果这是您想要使用的(您的代码 cmet 表明这一点)或者如果您想使用您需要的委托访问使用 FolderId 重载。

    对于模拟,您需要添加

    $service.ImpersonatedUserId = new-object Microsoft.Exchange.WebServices.Data.ImpersonatedUserId([Microsoft.Exchange.WebServices.Data.ConnectingIdType]::SmtpAddress, $MailboxName) 
    

    同时添加 Anchor 邮箱头例如

    $service.HttpHeaders.Add("X-AnchorMailbox", $MailboxName);
    

    对于委派或什至模拟我会使用

        $folderid = new-object Microsoft.Exchange.WebServices.Data.FolderId([Microsoft.Exchange.WebServices.Data.WellKnownFolderName]::Root, $MailboxName)   
        $oFindFolderResults = $service.FindFolders($folderid,$oSearchFilter,$oFolderView)
    

    这将确保您始终在 $MailboxName 变量中搜索邮箱

    要删除项目,请尝试类似($Calendar 是您的目标文件夹)

    $ivItemView = New-Object Microsoft.Exchange.WebServices.Data.ItemView(1000)  
    $fiResult = ""  
    do{  
        $fiResult = $Calendar.FindItems($ivItemView)  
        $type = ("System.Collections.Generic.List" + '`' + "1") -as "Type"
        $type = $type.MakeGenericType("Microsoft.Exchange.WebServices.Data.ItemId" -as "Type")
        $Itemids = [Activator]::CreateInstance($type)
        "Delete " + $fiResult.Items.Count + " Items"  
        foreach($Item in $fiResult.Items){  
            $Itemids.Add($Item.Id)  
        }  
        #Delete the Items  
        $Result = $service.DeleteItems($Itemids,[Microsoft.Exchange.WebServices.Data.DeleteMode]::SoftDelete,[Microsoft.Exchange.WebServices.Data.SendCancellationsMode]::SendToNone,[Microsoft.Exchange.WebServices.Data.AffectedTaskOccurrence]::AllOccurrences)  
        [INT]$Rcount = 0  
        foreach ($res in $Result){  
            if ($res.Result -eq [Microsoft.Exchange.WebServices.Data.ServiceResult]::Success){  
                $Rcount++  
            }  
        }  
        $Rcount.ToString() + " Items deleted successfully"  
        $ivItemView.offset += $fiResult.Items.Count  
    }while($fiResult.MoreAvailable -eq $true)  

    【讨论】:

    • 如果您删除搜索过滤器,它会显示什么,您是否看到目标邮箱中的文件夹?例如 $oFindFolderResults = $service.FindFolders($folderid,$oFolderView)
    • 最好在 MsgfolderRoot 开始搜索
    • 您的问题现在对我来说没有多大意义,因为我说将您的启动文件夹更改为 MsgFolderRoot 这将确保您只获得大部分用户创建的文件夹,然后枚举整个文件夹集合结果并查看如果文件夹在那里
    • 这是您的完整文件夹输出,例如您丢失的收件箱、已发送邮件、草稿等,您的问题是您现在看不到相关文件夹还是可以?
    • 我认为您最初的问题已经解决,例如我可以在您的输出中看到“旧日历 1”,您接下来尝试了什么?
    猜你喜欢
    • 1970-01-01
    • 2013-04-19
    • 1970-01-01
    • 1970-01-01
    • 2023-03-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-06
    相关资源
    最近更新 更多