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.

Débugger un add-in Outlook: breakpoint not hit. Visual 2010 Outlook 2010

Bonjour,

Dans le cas où vous auriez besoin de debugger un Add-in Outlook, et que le débugger n’atteint pas les breakpoints, vous pouvez vous tourner vers la solution suivante:

Sous Visual studio,

Addin outlook step1

Ajouter un  projet existant

Addin outlook step2

Allez chercher le Outlook.exe

Addin outlook step3

Définissez le en temps que projet de démarrage

Addin outlook step4

Allez dans Propriétés:

Addin outlook step5

et mettez dans type de debogueur : Managé (v2.0, v1.1, v1.0)

Addin outlook step6

Tout devrait fonctionner desormais 🙂

Un lien vers l’auteur de la solution

Microsoft Exchange – EWS: Propriétés personnalisées – Récupération et suppression

Dans le cas où votre application dépend beaucoup des propriétés personnalisées apposées sur vos précieux emails, vous vous êtes peut être déjà posé la question : Comment suis-je sensé les récupérer… toutes ?

Pour récupérer la valeur d’un champ personnalisé d’un email il faut… savoir que ce champ existe ! Impossible donc de demander à l’API « renvoi moi toutes les propriétés perso de ce message et leur valeur »

Impossible ? Pas vraiment, en contournant l’API et en passant par le webservice, nous pouvons utiliser la méthode « ExportItem » qui permet de récupérer des propriétés inédites.

Pour cela, il suffit de récupérer l’uniqueId de l’email et de le passer dans une instance de ExportItemsType, puis d’appeler la méthode ExportItems via le web service (et pas l’API !)

(Rappel : configurer le web service)

string sItemID = item.Id.UniqueId;
 
ExportItemsType exExportItems = new ExportItemsType();
 
exExportItems.ItemIds = new ItemIdType[2];
 
exExportItems.ItemIds[0] = new ItemIdType();
 
exExportItems.ItemIds[0].Id = sItemID;
 
ExportItemsResponseType exResponse = m_exchangeServerBinding.ExportItems(exExportItems);
 
ExportItemsResponseMessageType rmResponse = (ExportItemsResponseMessageType)exResponse.ResponseMessages.Items[0];
 
Byte[] messageBytes = rmResponse.Data;
 
ProcessFile(messageBytes);
 
private void ProcessFile(String fnFileName)
 
{
 
Byte[] fsfileBytes = ReadByteArrayFromFile(fnFileName);
 
EWSFTParser ipItemParser = new EWSFTParser();
 
MapiItem mpMapiItem = ipItemParser.ParseItem(fsfileBytes);
 
ViewEmailProperties fEmailProperties = new ViewEmailProperties(mpMapiItem);
 
fEmailProperties.ShowDialog();
 
}

Le EWSFTParser ainsi qu’un projet Visual studio 2010 peuvent être récupérés ici (merci à Glen Scales, MVP microsoft)

J’ai fait fonctionner son parser/browser en moins de 5minutes donc vous devriez vous en sortir aussi.

Supprimer une propriété personnalisée

Pour supprimer la propriété personnalisée, utilisez la méthode RemoveExtendedProperty

ExtendedPropertyDefinition extendedPropertyDefinition =    new ExtendedPropertyDefinition(DefaultExtendedPropertySet.PublicStrings, sFieldToRemove, MapiPropertyType.String);
 
if (item.RemoveExtendedProperty(extendedPropertyDefinition))
 
{
 
item.Update(ConflictResolutionMode.AlwaysOverwrite);
 
AddText("Custom property removed!");
 
return;
 
}

Microsoft Exchange – EWS: Ecrire un nouvel email avec toutes les options

Après avoir vu comment récupérer les emails, voyons comment créer un nouvel email et l’envoyer à un compte email Exchange.

Création d’un nouveau message et envoi

string sDestinataire = m_edDestinataire.Text;
 
/* Création d'email et envoi */
 
EmailMessage message = new EmailMessage(m_service);
 
message.Subject = m_edSubject.Text;
 
message.Body = m_rtbBody.Text;
 
message.Body.BodyType = BodyType.HTML;
 
message.Importance = Importance.Normal;
 
//Ajout d’une propriété personnalisée appelé “MaProprietePerso” avec pour valeur //« Mavaleur »
 
string sPropertyName = “MaProprietePerso”;
 
ExtendedPropertyDefinition extendedPropertyDefinition =
 
new ExtendedPropertyDefinition(DefaultExtendedPropertySet.PublicStrings, sPropertyName, MapiPropertyType.String);
 
message.SetExtendedProperty(extendedPropertyDefinition, “MaValeur”);
 
//Avec ou sans pièces jointes:
 
if (sFilename != string.Empty)
 
message.Attachments.AddFileAttachment(sFilename);
 
//Destinataire :
 
message.ToRecipients.Add(sDestinataire);
 
//Accusé de reception :
 
if (m_ckDelivery.Checked)
 
message.IsDeliveryReceiptRequested = true;
 
//Sauvegarde et envoi de l’email :
 
message.SendAndSaveCopy();

Ce code vous permet de créer un nouveau message et de spécifier : son titre(sujet), le corps du message, son importance, des propriétés personnalisées, des pièces jointes, des destinataires et un accusé de réception.

Envoi différé

Un point rarement mentionné porte sur l’envoi différé, pour utiliser cette fonctionnalité, ajouter la classe suivante :

public static class ExchangeExtensions
 
{
 
public static ExtendedPropertyDefinition PR_DEFERRED_SEND_TIME = new ExtendedPropertyDefinition(16367, MapiPropertyType.SystemTime);
 
public static ExtendedPropertyDefinition PR_DEFERRED_DELIVERY_TIME = new ExtendedPropertyDefinition(15, MapiPropertyType.SystemTime);
 
/// 
 
/// Sets Delayed Delivery
 
///
 
///
<span> </span>
 
///
<span> </span>Do Not Send Before This Date and Time
 
public static void SetDelayedDelivery(Microsoft.Exchange.WebServices.Data.EmailMessage email, DateTime deliveryDate)
 
{
 
string ut = deliveryDate.ToUniversalTime().ToString();
 
email.SetExtendedProperty(PR_DEFERRED_SEND_TIME, ut);
 
email.SetExtendedProperty(PR_DEFERRED_DELIVERY_TIME, ut);
 
}
 
}

Et sur le message, avant de l’envoyer :

ExchangeExtensions.SetDelayedDelivery(message, dateTimePicker1.Value);
 
//Sauvegarde et envoi de l’email :
 
message.SendAndSaveCopy();

Vous savez désormais récupérer les messages stockées sur le serveur Exchange et écrire de nouveaux emails en spécifiant de nombreuses options différentes.