News
Photos
Articles
Components
Applications
Kleinkunst

.NET - Cleaning up and organizing Outlook mailboxes

At the beginning of the year I clean up and organise my Outlook mailboxes. I want to keep Outlook performing as fast as possible so I try to reduce the size of my inbox. Nowadays I use LINQPad, a few C# scripts and my OutlookProvider component to simplify this job. I have no idea if these scripts are useful for other developers but why not share them? So here they are.

Move mails

The following script will run through a list of emails and move them to other folders. Just specify the source folder, add your own query criteria and implement some rules and destination folders. This C# script should be run in LINQPad because it uses the Dump() method.

OutlookProvider outlookProvider = new OutlookProvider();
 
// ** CHOOSE FOLDER **
//var mails = outlookProvider.InboxItems;
//var mails = outlookProvider.SentMailItems;
var mails = outlookProvider.GetItems<MailItem>(@"\\Personal folders\OUT");
 
var mailsToMove = from mail in mails
                  let m = (mail as MailItem)
                  // ** CHANGE WHERE **
                  //where m.
                  select m;
 
mailsToMove.Select(m => new { m.SentOn.Date, m.Subject }).Dump("Mails which will be moved");
 
while (mailsToMove.Count() > 0)
{
  var mail = mailsToMove.Last();
  // ** CREATE RULES AND MOVE TO CHOOSEN FOLDERS **
  if (mail.SentOn.Year == 2007)
  {
    var folder2007 = outlookProvider.Folders.FirstOrDefault(
        f => ((Folder)f).FolderPath == @"\\Personal Archive\OUT\2007");
    if (folder2007 != null)
    {
      mail.Move(folder2007);
    }
  }
  else if (mail.SentOn.Year == 2008)
  {
    var folder2008 = outlookProvider.Folders.FirstOrDefault(
        f => ((Folder)f).FolderPath == @"\\Personal Archive\OUT\2008");
    if (folder2008 != null)
    {
      mail.Move(folder2008);
    }
  }
  // Make sure to move all other mails to an new Folder!
  // Otherwise this will be an infinitive loop.
  else
  {
    var folderOthers = outlookProvider.Folders.FirstOrDefault(
        f => ((Folder)f).FolderPath == @"\\Personal Archive\OUT\Other");
    if (folderOthers != null)
    {
      mail.Move(folderOthers);
    }
  }
}

 

Delete mails

This small script will run through a list of emails and delete them.

OutlookProvider outlookProvider = new OutlookProvider();
 
// ** CHOOSE FOLDER **
//var mails = outlookProvider.InboxItems;
//var mails = outlookProvider.SentMailItems;
var mails = outlookProvider.GetItems<MailItem>(@"\\Personal folders\OUT");
 
var mailsToDelete = from mail in mails
                    let m = (mail as MailItem)
                    // ** CHANGE WHERE **
                    //where m.
                    select m;
 
mailsToDelete.Select(m => new { m.SentOn.Date, m.Subject })
    .Dump("Mails which will be deleted");
 
while (mailsToDelete.Count() > 0)
{
  mailsToDelete.Last().Delete();
}

 

Remove attachments

The following script can be used to remove large attachments from emails. Just specify the source folder and the minimum file size.

OutlookProvider outlookProvider = new OutlookProvider();
 
// ** CHOOSE FOLDER **
//var mails = outlookProvider.InboxItems;
//var mails = outlookProvider.SentMailItems;
var mails = outlookProvider.GetItems<MailItem>(@"\\Personal folders\OUT");
 
var mailsWithAttachments = from mail in mails
                           let m = (mail as MailItem)
                           let a = m.Attachments.OfType<Attachment>()
                           where
                             m.Attachments.Count > 0
                             // ** CHANGE SIZE **
                             && m.Attachments.OfType<Attachment>().Sum(s => s.Size) > 1024 * 500
                           select m;
 
((mailsWithAttachments.Sum(m => m.Attachments.OfType<Attachment>().Sum(a => a.Size)) / 1024 / 1024) + "MB").
  Dump("Total size of attachments which will be deleted");
 
foreach (var mail in mailsWithAttachments)
{
  foreach (var att in mail.Attachments)
  {
    ((att as Attachment).DisplayName + " - " + ((att as Attachment).Size / 1024) + "KB").Dump();
  }
  while (mail.Attachments.Count > 0)
  {
    mail.Attachments.OfType<Attachment>().Last().Delete();
  }
  mail.Save();
}

 

Compact and repair PST Files

Before executing these scripts make sure you have made a backup of your PST files in case something goes wrong!

After executing my scripts I always proceed with following 2 steps:

Compact PST files

  • Open the Data Files >> Settings >> Personal Folders window.
  • Choose Compact now for each PST file.

Repair PST files

  • Start the SCANPST.EXE utility which can be found in the Program Files Microsoft Office folder.
  • This Inbox Repair Tool will check your PST file for integrity and it will repair corrupt PST files.


I hope that you can keep your Outlook up and running smoothly and that you can take advantage of these C# scripts.