Outlook, overquota & Powershell

On a tous un jour ou l’autre été confronté à un problème de quota. Même si Exchange 2010 apporte des BAL plus larges dû aux coûts de stockages réduits, faire du tri dans sa boite aux lettres relève du calvaire. Pour ajouter à ça, il arrive bien souvent qu’on veuille supprimer une pièce jointe, mais conserver un mail…fonctionnalité non disponible sous Outlook
Outlook-Delete-Attachment

Pour palier à ça, je vous propose un script permettant de « dumper » dans un répertoire les fichiers plus gros qu’une taille définie, et de les supprimer du mail qui les contient, sans supprimer le mail en question.

Côté serveur en utilisant la console MMC Exchange Management Shell, les informations récupérées sont assez peu convaincantes, et surtout trop peu complètes pour pouvoir être exploitées.
GetMailboxFolderStats

L’avantage des produits Microsoft sont les synergies possibles entre ceux ci. Exploiter Outlook via Powershell est d’une simplicité déconcertante.

param(
    [int]$MaxSize = $(throw "Please specify size of max file"),
    [string] $DeleteAttachedFiles = $false
    )

# Attached files will be saved in this folder
$AttachmentsFolder = "C:\tmp\"

# Check folder existence
if (-not (test-path $AttachmentsFolder) )
{
    New-Item -ItemType Directory $AttachmentsFolder | out-null
}

# Attached files list
$ResultList = @()

# Create an outlook object
$OutlookObj = New-Object -ComObject Outlook.Application
$objNamespace = $OutlookObj.GetNamespace("MAPI")
$objFolder = $objNamespace.GetDefaultFolder(6)

# Get all items
$Items = $objFolder.Items 

# Items - Loop
foreach ($item in $Items)
{
    # Check if any file is attached
    if ($item.Attachments) { 

        # Attachments - Loop
        $item.Attachments | % {
            $FileName = $_.FileName
            $SavedName = join-path $AttachmentsFolder $FileName

            # Check size
            if( $($_.size) -ge $MaxSize )
            {
                # Save file
                $_.SaveAsFile($SavedName)

                $Result = new-Object -typename System.Object
                $Result | add-Member -memberType noteProperty -name "Subject" $Subject
                $Result | add-Member -memberType noteProperty -name "FileName" $FileName
                $Result | add-Member -memberType noteProperty -name "Size (Mb)" $(($_.size/1mb).tostring("0.000"))
                $ResultList += $Result

                if ($DeleteAttachedFiles -eq $true)
                {
                    # Delete attachment
                    $_.delete()
                    $item.save()
                    write-host "[Deleted] [$Subject] [$(($_.size).tostring("0.000"))] $FileName"
                }   

            }

        }
    }
}

# Close Outlook
$OutlookObj.quit()

$ResultList | sort size

Une bride d’explications, l’objet $item est le mail en court de traitement, cet objet possède la propriété « Attachments » qui renvoie les pièces jointes du message. Les objets pièces jointes peuvent ensuite être utilisées en utilisant les méthodes « SaveAsFile » ou « Delete »
Attachments-GetMember

Une fois la pièce jointe supprimée du message, regardons les méthodes disponibles pour cet objet:

Item-Get-Member

La méthode « Save » permet de faire ça!

Le script accepte deux paramêtres:
- La taille au dessus de laquelle les fichiers seront dumpés
- Le paramètre de suppression (non mandatory), par default défini à $false. Si ce paramètre n’est pas défini, le script n’effectuera que le dump des fichiers, et ne les supprimeras pas de la boite aux lettres.

Exemple 1:
script.ps1 2mb -> Dumperas les fichiers, aucune suppression

Example1

Exemple 2:
script.ps1 2mb $true -> Dumperas les fichiers, et supprimera les pièces jointes
Example2

Similar Posts:

One response to “Outlook, overquota & Powershell”

  1. Regis Hanol

    Nice !

Leave a Reply

Gauthier Chanliau

Vous trouvez plus d'informations sur moi sur mon site personnel

FlickR

The teamIC 09 French FinaleHelp'Aged - GamesTour Eiffel - IC 09 French final