有没有办法使用PowerShell从Outlook永久删除(shift + del equiv)电子邮件?

时间:2013-10-10 17:44:03

标签: email powershell outlook

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

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

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()
}

2 个答案:

答案 0 :(得分:0)

您可以使用EWS库连接到Exchange,与您自己的邮箱通信的模型非常简单。在Delete方法上有一个硬删除,软删除和模式到垃圾箱选项。由于它完全绕过本地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自动化对象等没有安全问题。

答案 1 :(得分:0)

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

您还可以使用Redemption(可以与Outlook对象模型一起使用)及其RDOMail。删除方法 - 它需要一个可选的DeleteFlags参数(dfSoftDelete,dfMoveToDeletedItems,dfHardDelete)。