2017-04-21 4 views
10

J'ai créé un volet de tâches personnalisé basique dans Outlook.Comment capturer un e-mail

Je veux faire glisser un e-mail et le déposer dans le volet des tâches. En cas de chute, cela devrait me permettre de capturer l'email en tant qu'objet je suppose, ce qui me permet de faire des choses avec lui, comme dans save à un emplacement sharepoint par exemple.

Est-ce possible? Si oui, des pointeurs? J'utilise VS2013 C# .NET 4.0 et Add-in pour Outlook 2010/2013.

+0

Que voulez-vous dire par "faire des choses avec elle"? Est-il suffisant pour accéder au message électronique en tant que fichier .msg brut? (le nom de fichier et le contenu sont des octets bruts) –

Répondre

5

Pré-requis et configuration

  • de Windows 10 Pro
  • Visual Studio 2013 Ultimate développement Office
  • Outlook 2013 avec un compte de messagerie électronique

Projet

  • Dans Visual Studio sélectionnez Nouveau projet -> Visual C# -> Bureau/SharePoint -> compléments Office -> Perspectives 2013 Add-in
  • Faites un clic droit sur le projet -> Ajouter -> Contrôle utilisateur
  • ouvertes "ThisAddIn.cs" et ajoutez le code suivant à la méthode "ThisAddIn_Startup":

    var myCustomPane= this.CustomTaskPanes.Add(new UserControl1(), "My Pane"); 
    myCustomPane.Visible = true; 
    

Outlook 2013 Custom Pane

Glisser-déposer des messages

  • Double-cliquez sur UserControl1 dans l'Explorateur de solutions. Cela ouvre la fenêtre du concepteur.
  • Dans Propriétés de l'ensemble AllowDrop = True et de raccorder deux gestionnaires d'événements DragDrop et dragEnter.

    private void UserControl1_DragEnter(object sender, DragEventArgs e) 
    { 
        // if you want to read the message data as a string use this: 
        if (e.Data.GetDataPresent(DataFormats.UnicodeText)) 
        { 
         e.Effect = DragDropEffects.Copy; 
        } 
        // if you want to read the whole .msg file use this: 
        if (e.Data.GetDataPresent("FileGroupDescriptorW") && 
         e.Data.GetDataPresent("FileContents")) 
        { 
         e.Effect = DragDropEffects.Copy; 
        } 
    } 
    
    private void UserControl1_DragDrop(object sender, DragEventArgs e) 
    { 
        // to read basic info about the mail use this: 
        var text = e.Data.GetData(DataFormats.UnicodeText).ToString(); 
        var message = text.Split(new string[] { "\r\n" }, StringSplitOptions.None)[1]; 
        var parts = message.Split('\t'); 
        var from = parts[0]; // Email From 
        var subject = parts[1]; // Email Subject 
        var time = parts[2]; // Email Time 
    
        // to get the .msg file contents use this: 
        // credits to "George Vovos", http://stackoverflow.com/a/43577490/1093508 
        var outlookFile = e.Data.GetData("FileGroupDescriptor", true) as MemoryStream; 
        if (outlookFile != null) 
        { 
         var dataObject = new iwantedue.Windows.Forms.OutlookDataObject(e.Data); 
    
         var filenames = (string[])dataObject.GetData("FileGroupDescriptorW"); 
         var filestreams = (MemoryStream[])dataObject.GetData("FileContents"); 
    
         for (int fileIndex = 0; fileIndex < filenames.Length; fileIndex++) 
         { 
          string filename = filenames[fileIndex]; 
          MemoryStream filestream = filestreams[fileIndex]; 
    
          // do whatever you want with filestream, e.g. save to a file: 
          string path = Path.GetTempPath() + filename; 
          using (var outputStream = File.Create(path)) 
          { 
           filestream.WriteTo(outputStream); 
          } 
         } 
        } 
    } 
    

Vous pouvez obtenir "iwantedue.Windows.Forms.OutlookDataObject" de CodeProject ou vous pouvez utiliser cette GitHub gist.

Démo

Outlook 2013 Custom Pane Drag and drop email message

+1

Le mérite devrait revenir à David Ewen :). Nos réponses sont essentiellement son travail sur le projet de code. Je l'ai déjà utilisé sans aucun problème, je ne sais pas si l'OP a vraiment des problèmes avec ça ... –

0

Essayez quelque chose comme ça

 public static string[] GetDropedFiles(DragEventArgs e) 
     { 
      string[] files = null; 
      var outlookFile = e.Data.GetData("FileGroupDescriptor", true) as MemoryStream; 
      if (outlookFile != null) 
      { 
       OutlookEmailObject dataObject = new OutlookEmailObject(e.Data); 

       var filenames = (string[])dataObject.GetData("FileGroupDescriptorW"); 
       var filestreams = (MemoryStream[])dataObject.GetData("FileContents"); 

       files = new string[filenames.Length]; 
       for (int fileIndex = 0; fileIndex < filenames.Length; fileIndex++) 
       { 
        string filename = filenames[fileIndex]; 
        MemoryStream filestream = filestreams[fileIndex]; 

        string path = Path.GetTempPath(); 
        string fullFileName = path + filename; 

        FileStream outputStream = File.Create(fullFileName); 
        filestream.WriteTo(outputStream); 
        outputStream.Close(); 

        files[fileIndex] = fullFileName; 
       } 
      } 
      else 
       files = (string[])e.Data.GetData(DataFormats.FileDrop); 

      return files; 
     } 

Vous pouvez obtenir la classe OutlookEmailObject ici (Télécharger l'exemple de code) :
http://www.codeproject.com/Articles/28209/Outlook-Drag-and-Drop-in-C

(Bien sûr, vous devez supprimer tous les fichiers temporaires après avoir terminé leur)