Faire glisser-déposer un ou plusieurs messages D'Outlook vers l'application C# WPF
je travaille sur un client windows écrit en WPF avec C# On. Net 3.5 Sp1, où une exigence est que les données des e-mails reçus par les clients peuvent être stockées dans la base de données. En ce moment, la façon la plus facile de gérer cela est de copier et de coller le texte, le sujet, les coordonnées et le temps reçu manuellement en utilisant une quantité de CTRL-c/ctrl-V qui provoque de l'arthrite
j'ai pensé qu'une façon simple de gérer cela serait de permettre à l'utilisateur de faire glisser un ou plusieurs e-mails D'Outlook (ils sont tous en utilisant Outlook 2007 actuellement) dans la fenêtre, permettant à mon application d'extraire les informations nécessaires et de les envoyer au système d'arrière-plan pour le stockage.
cependant, quelques heures de recherche sur Google pour obtenir de l'information à ce sujet semblent indiquer un manque choquant d'information sur cette tâche apparemment élémentaire. Je pense que quelque chose comme cela serait utile dans beaucoup de contextes différents, mais tout ce que j'ai pu trouver jusqu'à présent ont été à moitié cuit, non-solutions.
quelqu'un aurait-il des conseils sur la façon de faire cela? Puisque je vais juste lire les mails et ne pas envoyer quoi que ce soit ou faire quelque chose de mal, ce serait bien avec une solution qui n'implique pas les pop ups de sécurité détestés, mais tout bat pas être en mesure de le faire du tout.
fondamentalement, si je pouvais obtenir une liste de tous les articles de courrier qui ont été sélectionnés, traîné et abandonné D'Outlook, je serai en mesure de gérer le reste moi-même!
Merci!
Rune
5 réponses
j'ai trouvé un grand article que doit faire exactement ce que vous avez besoin.
UPDATE
j'ai pu obtenir le code dans cet article en travaillant dans WPF avec un peu de retouche, voici les changements que vous devez faire.
modifier toutes les références du système.Windows.Forme.IDataObject to System.Windows.IDataObject
dans le constructeur OutlookDataObject, changement
FieldInfo innerDataField = this.underlyingDataObject.GetType().GetField("innerData", BindingFlags.NonPublic | BindingFlags.Instance);
FieldInfo innerDataField = this.underlyingDataObject.GetType().GetField("_innerData", BindingFlags.NonPublic | BindingFlags.Instance);
Modifier tous les Formats.GetFormat appelle les DataFormats.GetDataFormat
modifier l'implémentation de SetData de
public void SetData(string format, bool autoConvert, object data)
{
this.underlyingDataObject.SetData(format, autoConvert, data);
}
public void SetData(string format, object data, bool autoConvert)
{
this.underlyingDataObject.SetData(format, data, autoConvert);
}
avec ces modifications, j'ai pu l'obtenir pour sauvegarder les messages dans les fichiers comme l'a fait l'article. Désolé pour le formatage, mais les listes numérotées/à puces ne fonctionnent pas bien avec les morceaux de code.
j'ai trouvé beaucoup de solutions suggérant d'utiliser le "FileGroupDescriptor" pour tous les noms de fichiers et les "contenus de fichiers" sur L'objet DragEventArgs pour récupérer les données de chaque fichier. Le "FileGroupDescriptor" fonctionne très bien pour les noms de messages e-mail, mais "FileContents" renvoie un null parce que L'implémentation de L'objet IDataObject dans .Net ne peut pas gérer l'objet IStorage qui est retourné par COM.
David Ewen a une excellente explication, un excellent exemple et le téléchargement de code que fonctionne bien à http://www.codeproject.com/KB/office/outlook_drag_drop_in_cs.aspx.
Dans votre Xaml, vous devez configurer votre Événement:
<TextBlock
Name="myTextBlock"
Text="Drag something into here"
AllowDrop="True"
DragDrop.Drop="myTextBlock_Drop"
/>
une fois que vous avez défini AllowDrop = True et défini vous drop event puis allez au code derrière et configurez votre event:
private void myTextBlock_Drop(object sender, DragEventArgs e)
{
// Mark the event as handled, so TextBox's native Drop handler is not called.
e.Handled = true;
Stream sr;
//Explorer
if (e.Data.GetDataPresent(DataFormats.FileDrop, true))
//Do somthing
//Email Message Subject
if (e.Data.GetDataPresent("FileGroupDescriptor"))
{
sr = e.Data.GetData("FileGroupDescriptor") as Stream;
StreamReader sr = new StreamReader(sr2);//new StreamReader(strPath, Encoding.Default);
//Message Subject
string strFullString = sr.ReadToEnd();
}
}
si vous souhaitez le décomposer davantage, vous pouvez utiliser: FILEDESCRIPTOR ou FILECONTENTS dans les contours suivants article
votre autre option est d'attacher dans outlooks MS Office Primary Interop Assemblies et brisez le message façon.
je pense que Style écaille de Glisser-Déposer .NET (WPF et WinForms) peut vous aider. Une fois que vous pouvez répondre à drag drop en utilisant les Interfaces COM, vous devriez être en mesure de récupérer les données outlook.
je suppose que vous avez un serveur Exchange, derrière Outlook.
ce que vous pouvez faire est de récupérer le courrier du serveur Exchange et de stocker son emplacement dans votre base de données basée sur le courrier EntryID
et StoreID
. Voici un VB.Net snippet:
Imports Microsoft.Office.Interop
Public Class OutlookClientHandler
Private _application As Outlook.Application
Private _namespace As Outlook.NameSpace
Public Sub New()
If Process.GetProcessesByName("outlook".ToLower).Length > 0 Then
_application = New Outlook.Application
Else
Dim startInfo As ProcessStartInfo = New ProcessStartInfo("outlook.exe")
startInfo.WindowStyle = ProcessWindowStyle.Minimized
Process.Start(startInfo)
_application = New Outlook.Application
End If
End Sub
' Retrieves the specified e-mail from Outlook/Exchange via the MAPI
Public Function GetMailItem(ByVal entryID as String, ByVal storeID as String) As Outlook.MailItem
_namespace = _application.GetNamespace("MAPI")
Dim item As Outlook.MailItem
Try
item = _namespace.GetItemFromID(entryID, storeID)
Catch comex As COMException
item = Nothing ' Fugly, e-mail wasn't found!
End Try
Return item
End Function
End Class
je suppose que vous êtes à l'aise avec le MAPI, sinon vous pouvez lire ici: http://msdn.microsoft.com/en-us/library/cc765775 (v = bureau.12).aspx
pour récupérer le e-mails sélectionnés de outlook:
Public Function GetSelectedItems() As List(Of Object)
Dim items As List(Of Object) = New List(Of Object)
For Each item As Object In _application.ActiveExplorer().Selection
items.Add(item)
Next
Return items
End Function
après avoir récupéré les e-mails D'Outlook, vous pouvez simplement les insérer dans votre base de données! Sauver leur EntryID
et StoreID
(vous pourriez vouloir stocker leurs parents (le dossier) EntryID
et StoreID
).