Exchange Web Service (EWS) et Powershell : exemple de script

Bonjour,

Aujourd’hui je vous présente un exemple de code Powershell utilisant les types et fonctionnalités de l’Exchange Web Service Managed API (EWS API 1.1)

Le script suivant permet de parcourir un dossier d’email en particulier. Il check si les éléments possèdent un ID personnalisé (qui est une propriété étendue). Dans le cas contraire, il en affecte une (génération d’un GUID)

Voici le code:

$usertoQuery = "EMAILADDRESS"
 
$dllpath = "XXX\Microsoft.Exchange.WebServices.dll"
[void][Reflection.Assembly]::LoadFile($dllpath)
 
$service = New-Object Microsoft.Exchange.WebServices.Data.ExchangeService([Microsoft.Exchange.WebServices.Data.ExchangeVersion]::Exchange2010_SP1)
 
$service.Credentials = new-object Microsoft.Exchange.WebServices.Data.WebCredentials("LOGIN","PWD","DOMAIN")
$service.Url = new-object Uri("http://URL/EWS/Exchange.asmx");
 
$svFldid = new-object Microsoft.Exchange.WebServices.Data.FolderId([Microsoft.Exchange.WebServices.Data.WellKnownFolderName]::SearchFolders,$MailboxName)
$delFldid = [Microsoft.Exchange.WebServices.Data.DeleteMode]::HardDelete
 
$fvFolderView = new-object Microsoft.Exchange.WebServices.Data.FolderView(1000)
 
$folders = $service.findfolders($svFldid,$fvFolderView)
$ExtendedProp = new-object Microsoft.Exchange.WebServices.Data.ExtendedPropertyDefinition([Microsoft.Exchange.WebServices.Data.DefaultExtendedPropertySet]::PublicStrings, "MyCustomID", [Microsoft.Exchange.WebServices.Data.MapiPropertyType]::String)
$ExtendedProp
$Propset = new-object Microsoft.Exchange.WebServices.Data.PropertySet([Microsoft.Exchange.WebServices.Data.BasePropertySet]::FirstClassProperties, $ExtendedProp)
 
foreach ($folder in $folders)
{
    if ($folder.displayName -eq "FOLDERNAME_I_WANT_TO_CHECK")
    {
		"We are in the correct folder"
         $fvItemView = new-object Microsoft.Exchange.WebServices.Data.ItemView(10000)
 
		 $items = $service.FindItems($folder.Id,$fvItemView)	
		 #Don't show any result for the next line
		 $service.LoadPropertiesForItems($items, $Propset)
		 foreach ($item in $items)
		 {
			"**Subject** : " 
			$item.Subject
			"**Number of Extended Properties**: " 
			$item.ExtendedProperties.Count		
 
			$a = 0
 
			foreach ($extendedProperty in $item.ExtendedProperties)
			{
				if ($extendedProperty.PropertyDefinition.Name -eq $ExtendedProp.Name)
				{					
					$a = 1
					"Break (Value = " + $extendedProperty.Value + ")"
					break;						
				}		
			}
 
			if ($a -eq 0)
			{			
				$g1 = [Guid]::NewGuid()
				$item.SetExtendedProperty($ExtendedProp, $g1.ToString())
				"Guid = " + $g1
				"ValueGuid added!"
				$item.Update([Microsoft.Exchange.WebServices.Data.ConflictResolutionMode]::AlwaysOverwrite)
				"Item saved"
			}
		 }	 
    }
}

Et voila une base pour maitriser (un peu) la sémantique Powershell et manipuler l’api EWS d’une autre façon!

Création d’un Add-in Outlook 2010 – VSTO – Visual Studio C#

Bonjour,

Après avoir vu en détail la programmation via l’API Exchange Web Service, je vais introduire la technologie Addin d’Office, particulièrement pour Outlook (autant continuer sur cette voie ;)) avec les VSTO (Visual studio Tools for Office)

Première étape: Création du projet

A la création du projet, vous devriez avoir les 2 méthodes suivantes de créées:

    public partial class ThisAddIn
    {
        private void ThisAddIn_Startup(object sender, System.EventArgs e)
        {
        }
 
        private void ThisAddIn_Shutdown(object sender, System.EventArgs e)
        {
        }
}

qui vous permettront d’avoir un accès à votre code au chargement de l’addin et à sa fermeture.

Pour ajouter une fenêtre, ajouter un nouvel élément à votre projet et sélectionner zone de formulaire Outlook comme ci dessous: (il est possible de customiser le ruban aussi, assez simplement)

Sélectionnez le type de formulaire que vous souhaitez créer et sa position relative à l’existant:

Ici spécifiez pour quel sous élément votre composant s’affichera, ici il s’affichera dans la fenêtre de visualisation des emails:

Voila, vous pouvez désormais customiser (un peu) votre Outlook 2010!

Microsoft Exchange – EWS: Propriétés personnalisées – Création

Bonjour,

Aujourd’hui, cap sur les propriétés personnalisées avec Exchange Web Service API:

Au delà des propriétés “basiques” telles que Subject, Body, From (…) il est possible d’avoir des propriétés personnalisées sur chaque “ServiceObject”.
EmailMessage étant un ServiceObject, à l’instar de Folder ou encore de Contact, voyons comment jouer avec ces propriétés personnalisées (ou “étendues“):

ExtendedPropertyDefinition extendedPropertyDefinition = new ExtendedPropertyDefinition(DefaultExtendedPropertySet.PublicStrings, "Name Of my property", MapiPropertyType.String);
 
MyMessage.SetExtendedProperty(extendedPropertyDefinition, "ValueOf my property");

La propriété personnalisée peut avoir différents types : string, integer, booleen, date.. (énuméré dans MapiPropertyType)

Pour sauver les modifications apportées (si toutefois c’est un élément récupéré et non une création), utilisez la méthode suivante :

MyMessage.Update(ConflictResolutionMode.AlwaysOverwrite);

Dans le cas d’un Dossier, c’est la même méthode mais sans paramètre qui sera appelée.

Pour récupérer les valeurs des propriétés personnalisées, ou encore plus complexe: récupérer toutes les propriétés d’un email, je vous suggère l’article suivant

Exchange Web Service (EWS) : impersonation (administrateur)

Bonjour,

Aujourd’hui un court post mettant en avant la pratique de l’impersonation (le super utilisateur)

Avec cela, un super utilisateur, identifié avec la méthode classique de connexion, pourra parcourir et interagir avec toutes les boites emails sur serveur Exchange, sans se préoccuper des mots de passe.

Pour l’implémentation:

D’abord, sur la machine possédant le serveur Exchange ouvrir Exchange Management Shell et tapez ceci:

New-ManagementRoleAssignment –Name AgentImpersonationRole –Role ApplicationImpersonation –User "Votre_Nom_D_Utilisateur_Ici"

Voila, votre compte est désormais un super compte!

Au niveau de l’API, ça se passe comme cela:

//Connection avec l'API:
m_service = new ExchangeService(ExchangeVersion.Exchange2010_SP1);
//sUser est le super utilisateur précédement créé (Votre_Nom_D_Utilisateur_Ici)
m_service.Credentials = new WebCredentials(sUser, sPwd, sDomain);
m_service.Url = new Uri("http://XXXX/EWS/Exchange.asmx");
 
//Spécification de la boite email à gérer:
m_service.ImpersonatedUserId = new ImpersonatedUserId(ConnectingIdType.SmtpAddress, "BoiteEmailAmodifier");
//Action sur cette boite email:
Folder newFolder = new Folder(m_service);
newFolder.DisplayName = "ImpersonatedTestFolder";
newFolder.Save(WellKnownFolderName.Inbox);

Voila, vous avez créé un dossier sur une boite email différente de la votre en jouant des droits de super utilisateur. Vous pouvez ainsi faire des opérations de groupes sur des comptes emails sans vous préoccuper des passwords.

Utilisation de Microsoft.Office.Interop.OutlookViewCtl, visual studio/Outlook 2010, C#

Aujourd’hui je vous présente un composant Microsoft qui vous permet d’afficher des blocs d’Outlook dans votre propre application!

Je vais particulièrement m’intéresser aux emails (parce que je travaille là dessus), et laisser les calendriers pour d’autres tutoriaux 😉

Lors de l’installation d’Office (peu importe la version à priori, j’utilise 2010 personnellement), une DLL appelée “OUTLCTL.DLL” est placée dans votre répertoire Office (dans mon cas C:\Program Files (x86)\Microsoft Office\Office14)

Lancer visual studio, créer un nouveau projet du type Application Windows Forms.

Ajouter la référence à OutlookViewCtl:

Cherchez la référence suivante: (Microsoft Outlook View Control) dans la partie COM

Voilà, la référence à Microsoft.Office.Interop.OutlookViewCtl est ajoutée!

Maintenant, il convient d’ajouter l’élément dans la boite à outils:

Et voila, votre composant Outlook est prêt à être utilisé!

Pour changer le dossier courant, simplement modifier la propriété “Folder” du composant, ainsi le faire passer à “Inbox”, “Sent Items” permet d’afficher les emails appropriés.

Pour afficher le calendrier, il suffit de mettre la propriété Folder à “Calendar”

A noter:

  • Vous vous rendrez compte que lors de l’ajout de votre composant dans votre application,  une référence est ajoutée: “AxMicrosoft.Office.Interop.OutlookViewCtl”
  • Il se peut que l’utilisation de ce composant sous Visual Studio entraîne des (gros) ralentissements, voir des freeze total de Visual Studio. C’est totalement lié à l’utilisation faite de Outlook (le vrai Outlook) en parallèle. Donc quitter ou relancer Outlook peut être une bonne solution pour sortir du freeze présent dans l’IDE.