0

我编写了一个 PowerShell 脚本来删除在我的 Outlook 配置文件中打开的辅助邮箱的所有电子邮件和收件箱子文件夹,但保留用户邮箱的其余部分完好无损。我想知道是否有办法在不先将所有内容发送到“已删除邮件”文件夹的情况下做到这一点。

我正在通过 VPN 远程工作,而将文件移动到我的删除项目中这一不必要的步骤既慢又令人讨厌的不便。有没有相当于Shift+的脚本Delete

Get-Member 返回邮件项目对象类型的以下方法列表。我一直在使用 Delete 方法,但我在 MSDN 上找不到对象类型引用来仔细查看它的方法,例如,Delete 是否会采用参数来永久删除。

   TypeName: System.__ComObject#{00063034-0000-0000-c000-000000000046}

Name                              MemberType Definition                                            
----                              ---------- ----------                                            
AddBusinessCard                   Method     void AddBusinessCard (ContactItem)                    
ClearConversationIndex            Method     void ClearConversationIndex ()                        
ClearTaskFlag                     Method     void ClearTaskFlag ()                                 
Close                             Method     void Close (OlInspectorClose)                         
Copy                              Method     IDispatch Copy ()                                     
Delete                            Method     void Delete ()                                        
Display                           Method     void Display (Variant)                                
Forward                           Method     MailItem Forward ()                                   
MarkAsTask                        Method     void MarkAsTask (OlMarkInterval)                      
Move                              Method     IDispatch Move (MAPIFolder)                           
PrintOut                          Method     void PrintOut ()                                      
Reply                             Method     MailItem Reply ()                                     
ReplyAll                          Method     MailItem ReplyAll ()                                  
Save                              Method     void Save ()                                          
SaveAs                            Method     void SaveAs (string, Variant)                         
Send                              Method     void Send ()                                          
ShowCategoriesDialog              Method     void ShowCategoriesDialog ()                         

我的脚本现在看起来像这样:

# Initialise variables
$TargetMailbox = "Mailbox - User"

# SCRIPT BODY
# ===========

# Connect to Outlook
$Outlook = New-Object -comobject Outlook.Application

# Select the mailbox by name
$Mailbox = $Outlook.Session.Folders | Where-Object { $_.Name -eq $TargetMailbox}

# Select Inbox by name
$Inbox = $Mailbox.Folders | Where-Object { $_.Name -eq "Inbox" }

# Delete subfolders
$Inbox.Folders | foreach {
    write-host "Deleting Inbox\$($_.Name) (Folder)"
    $_.Delete()
}

# Delete items
$Inbox.Items | foreach {
    write-host "Deleting Inbox\$($_.subject) (Item)"
    $_.Delete()
}
4

2 回答 2

0

您可以使用 EWS 库连接到 Exchange,与您自己的邮箱对话的模型非常简单。在删除方法上有一个硬删除、软删除和垃圾模式选项。由于它完全绕过了本地 Outlook 配置文件,因此它将使用标准的服务器同步来恢复同步,这是我所知道的最快的方式。

此示例清除了一个日历,但其他文件夹的技巧非常相似。

_service = new ExchangeService(ExchangeVersion.Exchange2007_SP1);
//Connect directly to the EWS uri, or use AutoDiscover
_service.Url = new Uri(ExchangeServerUri);
_service.Credentials = (NetworkCredential)CredentialCache.DefaultNetworkCredentials;

ItemView view = new ItemView(100, 0, OffsetBasePoint.Beginning);
view.PropertySet = new PropertySet(PropertySet.IdOnly);
view.PropertySet.Add(ItemSchema.Subject);
view.PropertySet.Add(AppointmentSchema.Start);
view.PropertySet.Add(AppointmentSchema.End);
view.PropertySet.Add(AppointmentSchema.AppointmentType);
view.PropertySet.Add(AppointmentSchema.TimeZone);
view.Traversal = ItemTraversal.Shallow;

Console.WriteLine("Fetching appointments for {0}", Mailbox);

FolderId folder = new FolderId(WellKnownFolderName.Calendar, new Mailbox(Mailbox));

foreach (var item in folder.Items)
     _service.DeleteItems(new[] { item.Id }, DeleteMode.HardDelete, SendCancellationsMode.SendToNone, AffectedTaskOccurrence.AllOccurrences);

另一个优点是它不需要安装 Outlook,COM 自动化对象等没有安全问题。

于 2013-10-10T18:30:27.790 回答
0

您可以调用 MailItem.Delete,然后在 Deleted Items 文件夹中找到已删除的项目(例如,使用一些自定义属性)并通过调用 MailItem.Delete 再次删除它。

您还可以使用 Redemption(可与 Outlook 对象模型一起使用)及其RDOMail .Delete 方法 - 它采用可选的 DeleteFlags 参数(dfSoftDelete、dfMoveToDeletedItems、dfHardDelete)。

于 2013-10-10T20:28:02.933 回答