我编写了一个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()
}
答案 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)。