ddacrs
ddacrs

Reputation: 153

Drag an Outlook email into a JavaFX Application

I made a Javafx scene to handle drag-n-drop and it is working fine if you drag a file from the windows explorer or from the desktop for example.

However, if I try to do it from Outlook, the behavior is weird.

I realized that when you drag n drop from another program inside the dragboard component, the method "getContentTypes" will return a few DataFormat objects using this code:

dragField.setOnDragOver((DragEvent event) -> {
    Dragboard db = event.getDragboard();
    System.out.println(db.getContentTypes());
});

The output will be something like:

[text/plain] - De Objet Reçu Taille Catégories D D Test 13:56 40 Ko [DragImageBits] - java.nio.HeapByteBuffer[pos=0 lim=90304 cap=90304] [message/external-body;access-type=clipboard;index=0;name="testEmail.msg"] - null [Object Descriptor] - java.nio.HeapByteBuffer[pos=0 lim=74 cap=74] [RenPrivateItem] - null [CSV] - java.nio.HeapByteBuffer[pos=0 lim=282 cap=282]

It seems to be able to extract the information from the Outlook msg file, since I got something like a header and also the "testEmail.msg" file name is correct.

However, when I try to use this code:

DataFormat.lookupMimeType("message/external-body;access-type=clipboard;index=0;name=\"testEmail.msg\"");

It returns null... In fact, there is a "null" by the mime-type side.

Is there any way to transform these DataFormat objects into a java file or maybe a apache poi msg file? Anything would be amazing.

Thanks for any help! :D

Upvotes: 3

Views: 590

Answers (1)

Dean Wookey
Dean Wookey

Reputation: 301

If there is a mime type starting with message/external-body;access-type=clipboard, you can get the value using

clipboard.getContent(new DataFormat("message/external-body"));

Here is an example which just saves the file:

    private boolean clipboardHasInMemoryFile(Clipboard clipboard) {
        for (DataFormat d: clipboard.getContentTypes()) {
            if (d.toString().startsWith("[message/external-body;access-type=clipboard")) {
                return true;
            }
        }
        return false;
    }

    public void saveOutlookFile() throws IOException {
        Clipboard clipboard = Clipboard.getSystemClipboard();
        if (clipboardHasInMemoryFile(clipboard)) {
            //this is for copying an outlook attachment
            String name = "outfile";
            for (DataFormat d : clipboard.getContentTypes()) {
                if (d.toString().startsWith("[message/external-body;access-type=clipboard")) {
                    Pattern p = Pattern.compile("name=\"([^\"]*)\"");
                    Matcher m = p.matcher(d.toString());
                    m.find();
                    name = m.group(1);
                    break;
                }
            }
            Object inMemoryFile = null;
            try {
                DataFormat df = DataFormat.lookupMimeType("message/external-body");
                if (df == null) {
                    df = new DataFormat("message/external-body");
                }
                inMemoryFile = clipboard.getContent(df);
            } catch (Throwable t) {

            }
            final String fileName = name;
            if (inMemoryFile != null) {
                if (inMemoryFile instanceof ByteBuffer) {
                    ByteBuffer b = (ByteBuffer) inMemoryFile;
                    byte bytes[] = b.array();
                    FileOutputStream fo = new FileOutputStream(fileName);
                    fo.write(b.array());
                    fo.close();
                }
            }
        }
    }

Upvotes: 1

Related Questions