Drop Emails von Outlook in eine JList

Lehrlii

Mitglied
Hallo zusammen,

ich hab die Anforderung von meinem Chef dass ich eine Anwendung entwickle mit welcher es möglich ist Dateien auf einen Server hochzuladen. Soweit funktioniert das auch, nun habe ich aber einen neue Anforderung mit welche ich über Drag'n'Drop Unterstützung direkt Emails aus Outlook als .msg Datei hinzufüge. Im Idealfall sollte das ohne bisherigen Zwischenschritt, dass der User zuerst die E-Mail abspeichert muss und sie dann hinzufügt geschehen, geschehen.

Kennt oder hat wer vll. zu diesem Thema eine Lösung oder einen guten Ansatz?

Mein bisheriger Code für die Drag'n'Drop Unterstützung sieht wie folgt aus:

Er bietet die Möglichkeit ganze Ordner in ein Objekt zu ziehen und die Dateien welche enthalten sind, inklusive der in den Unterordner enthaltenen Dateien, werden als Liste mit dem Dateipfad zurückgegeben.
Java:
class MyDragDropListener implements DropTargetListener {
    
    public static List<File> files=null;
    
    @Override
    public void drop(DropTargetDropEvent event) {
        
        boolean isNoFile=false;
      
        // Accept copy drops
        event.acceptDrop(DnDConstants.ACTION_COPY);
  
        // Get the transfer which can provide the dropped item data
        Transferable transferable = event.getTransferable();
  
        // Get the data formats of the dropped item
        DataFlavor[] flavors = transferable.getTransferDataFlavors();
  
        // Loop through the flavors
        for (DataFlavor flavor : flavors) {
  
            try {
  
                // If the drop items are files
                if (flavor.isFlavorJavaFileListType()) {
  
                    // Get all of the dropped files
                    try {
                        List<File> files = (List<File>) transferable.getTransferData(flavor);
                    }catch (Exception e) {
                        // Print out the error stack
                        e.printStackTrace();
                        isNoFile=true;
                    }
                    if(!isNoFile){
                        ArrayList<String> filesArray = new ArrayList<String>();
                        //get the contet of directories and subdirectories
                        boolean containsDirs = false;
                        do {
                            containsDirs=false;
                            for(int i=0; i < files.size(); i++) {
                                if(files.get(i).isDirectory()) {
                                    files=getFiles(files);
                                    containsDirs=true;
                                    break;
                                }
                            }
                            
                        }while(containsDirs == true);
                        
                        for (File file : files) {
                            filesArray.add(file.toString());
                        }
    
                        SelectFileWindow.addFiles(filesArray);
                    }else {
                      try
                      {
                          DataFlavor[] dataFlavors=transferable.getTransferDataFlavors();
                          //event.acceptDrop(DnDConstants.ACTION_COPY);
                          ArrayList<String> test = new ArrayList<String>();
                          for(int i=0;i<dataFlavors.length;i++)
                          {
                              if(dataFlavors[i].getRepresentationClass().equals(Class.forName("java.lang.String")))
                              {
                                  String string=(String)transferable.getTransferData(dataFlavors[i]);
                                  System.out.println(string);
                                  test.add(string);
                              }
                          }

                          event.dropComplete(true);

                      }

                      catch(Exception ex)
                      
                      {

                        ex.printStackTrace();

                      }

                    }
                }
  
            } catch (Exception e) {
  
                // Print out the error stack
                e.printStackTrace();
            }
        }
  
        // Inform that the drop is complete
        event.dropComplete(true);

    }
  
    @Override
    public void dragEnter(DropTargetDragEvent event) {
    }
  
    @Override
    public void dragExit(DropTargetEvent event) {
    }
  
    @Override
    public void dragOver(DropTargetDragEvent event) {
    }
  
    @Override
    public void dropActionChanged(DropTargetDragEvent event) {
    }
    
    public List<File> getFiles(List<File> files){
      
      //etract Content of directories and subdirectories
      List<File> dirContent = new ArrayList<File>();
      
      for(File file : files){
          if(file.isDirectory()) {
              File[] dirFiles = file.listFiles();
              for(int j=0; j < dirFiles.length; j++) {
                  dirContent.add(dirFiles[j]);
              }
            continue;
            }
            dirContent.add(file);
        }
        
      return dirContent;
    }
}

MfG Lehrlii
 
Zuletzt bearbeitet von einem Moderator:
Du musst zunächst herausfinden, ob Outlook die E-Mails per Drag'n'Drop nach aussen frei gibt. Wenn es das nicht tut hast du keine Chance.
Wenn es das tut, musst du natürlich die richtigen Flavors registrieren und Java dazu kriegen, dass es auch daten von aussen annimmt (wie letzteres geht weiss ich leider nicht).

Im Optimalfall hast du dann die Daten, welche Outlook frei gibt, per Drag'n'Drop in deiner Anwendung. Die .msg-Datei musst du selbst speichern, da gibts aber sicherlich Libraries für.
 
Wie Tobse schon gesagt hat muss du erst mal in Outlook schauen.
Wenn ich mich recht erinnere tut es Outlook nicht automatisch wenn man eine Mail raus zieht bsp auf den Desktop dort speichern.
Das könntest du aber über ein Office Plugin Lösen was dann jeder haben muss damit es klappt.
Wäre über VBA zu lösen und dann in Startup von Outlook oder halt ein richtiges Plugin Entwickeln.
 
zuerst einmal danke für die schnelle Rückmeldung.

man kann E-Mails aus Outlook mittels Drag'n'Drop in den Windows Explorer ziehen, da wird dann ein .msg Datei erstellt.

Nach etwas längerer Zeit im Debuger ist mir aufgefallen, dass es sich um mehrere Flavors handelt welche übergeben werden bzw. Java dort hinein interpretiert. Wenn ich Dateien hinein droppe ist das nur eine Flavor pro Datei. Die erste Flavor ist z.B. eine Flavor für eine Datei und dann versucht er sie als bereits existierende Datei zu verabeiten, aus diesem Grund bekomme ich auch eine Exception, wenn ich die Flavor in eine List<File> anhängen will.

Wenn ich nach der Klasse String suche bekomme ich den Absender, Empfänger und Betreff auslesen.

D.h. ich muss mir einen Algorithmus bauen wo ich die einzelnen Flavors richtig interpretiere welche übergeben werden. Bin ich da richtig in meiner Annahme?

MfG Lehrlii
 
Zuletzt bearbeitet:
D.h. ich muss mir einen Algorithmus bauen wo ich die einzelnen Flavors richtig interpretiere welche übergeben werden. Bin ich da richtig in meiner Annahme?

Richtig. Ich gehe stark davon aus, dass Outlook immer den/die gleichen Flavour(s) verwendet. Auch die Anordnung der Transferables (also Betreff, Nachricht, Empfänger etc) sollte immer die gleiche sein.
Diese Daten kannst du dann benutzen um eine .msg Datei an euren Server zu schicken.
 
Eine Auswertung der Daten ist nicht möglich
Die flavors die ich bekommen enthalten nur den Header, welcher mir alleine nichts bringt.
Ich habe es noch über das Apache poi Projekt versucht dieses braucht aber ein bestehendes .msg File

Der Nutzten zahlt sich nicht aus um in diese Richtung weiter zu arbeiten, deswegen wurde der Punkt bei uns eingestellt.
Dieses Thema kann geschlossen werden
 

Zurück
Oben