Mit Com-Bridge Outlook öffnen --> ActiveXComponent

Hallo,

in meinem Java-Programm soll der Standard-EMail-Client auf dem Rechner geöffnet werden und einen Anhang anhängen.
Auswahl des Standard-Clients funktioniert soweit durch auslesen der registry ganz gut.

Um Outlook zu öffnen benutze ich die Jacob-COM-Bridge doch leider bekomme ich jedesmal die gleiche Fehlermeldung und Outlook lässt sich
nicht öffnen. Das eigenartige und mir unerklärliche dabei ist, das die Exception beim erzeugend es “ActiveXComponent(“Outlook.Application”)” kommt. Unerklärlich für mich ist dabei, dass wenn ich an der Stelle ActiveXComponent(“Excel.Application”) eintrage, also Excel öffnen möchte, funktioniert es und Excel wird geöffnet.

Hier einmal der Code und unten habe ich mal die Fehlermeldung eingefügt.
Hat einer eine Idee was an der Stelle nicht korrekt ist? Ich habe das bereits an zwei unterschiedlichen Rechnern getestet, aber leider mit gleichem Ergebnis.
Ich bin für jeden Tip dankbar auch wenn es andere Möglichkeiten gibt die Anforderung
“Outlook zu starten und eine email mit Anhang zu erzeugen”
zu erfüllen.

private void sendMail(){
                System.setProperty(LibraryLoader.JACOB_DLL_PATH, "C:\\PfadZurDLL\\DLL\\jacob-1.18-M2-x64.dll");
                LibraryLoader.loadJacobLibrary();
                
                ActiveXComponent outlook = new ActiveXComponent("Outlook.Application");
                Dispatch new_app
                        = Dispatch.invoke(outlook.getObject(),
                                "CreateItem",
                                Dispatch.Get,
                                new Object[]{"0"},
                                new int[0]).toDispatch();
                Dispatch.put(new_app, "To", "foo@bar.com");
                Dispatch.put(new_app, "ReadReceiptRequested", "false");
                Dispatch attachs = Dispatch.get(new_app, "Attachments").toDispatch();
                Dispatch.call(attachs, "Add", "\"" + file.getAbsolutePath() + "\"", 4);
                Dispatch.call(new_app, "Send");
}

Fehlermeldung
Exception in thread “AWT-EventQueue-0” com.jacob.com.ComFailException: Can’t co-create object
at com.jacob.com.Dispatch.createInstanceNative(Native Method)
at com.jacob.com.Dispatch.(Dispatch.java:99) at com.jacob.com.Dispatch.(Dispatch.java:99)
at com.jacob.activeX.ActiveXComponent.(ActiveXComponent.java:58)

Schon mal das viel einfachere URI mit einem String a la

mailto:mein@ziel.de?subject=Betreff&body=Blabla&&attachment=dateipfad

probiert? Funktioniert manchmal

Eventuell auch Desktop

http://openbook.galileocomputing.de/javainsel9/javainsel_11_005.htm

danke für die schnelle Antwort.
Ja, habe ich bereits ausprobiert und funktioniert leider nicht.
Habe mailTo mit dem Processbuilder und auch getDesktop ausprobiert, aber ohne Ergebnis.

Ich würde auf jeden Fall nach einer Lösung ohne ActiveX suchen

COM/ActiveX über Java zu benutzen, ist immer fragil, bei Outlook (und Attachment) könnte auch Sicherheitsgewusel im Spiel sein :slight_smile:

http://sourceforge.net/p/jacob-project/discussion/375945/thread/b7547b46/

usw. 32bit/64bit Theater, passt die JVM zur Jacob-Bibliothek, …

Hallo diesen Code verwende ich um mit outlook eine mail zu erstellen. (getestet jetzt mal leider nur mit Outlook 2007)

 @Override
    public void createMail(final String recipient, final String body,
                           final String subject, @NotNull final File filePath) {
        sendMail("/c ipm.note /m \"" + recipient + "&subject=" + subject
                + "&body=" + body + "\" /a \"" + filePath.getAbsolutePath()
                + "\"");

    }

    private void sendMail(final String command) {
        String programPath = <pfad zu outlook.exe>;
        String cmd = "\"" + programPath + "\" " + command;
        try {
            Runtime.getRuntime().exec(cmd);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

SUPER!!! VIELEN DANK!!

Es hat geklappt, ich war schon verzweifelt.

Danke für die Unterstützung

Mit nur einem Wort : OUCH !
Ich frage mich immer wieder : Warum missbraucht man Java dazu irgendwelche platformspezifischen Aufgaben triggern zu wollen statt diese entweder direkt selbst mit Java umzusetzen oder halt System-eigene Dinge nutzt ?
In diesem Fall : Warum lokalen Standard-Client öffnen statt mit Java-Mail selbst zu arbeiten ? Oder eben halt was System-eigenes nehmen (DotNET) um die gewünschte Aktion auszulösen.

Wie ich schon mal wo anders schrieb : Java ist eigentlich nicht dazu gedacht als simples Spielzeug zu dienen um irgendwas über CMD zu triggern … zumindest nicht meiner Ansicht nach.

[QUOTE=Sen-Mithrarin]Mit nur einem Wort : OUCH !
Ich frage mich immer wieder : Warum missbraucht man Java dazu irgendwelche platformspezifischen Aufgaben triggern zu wollen statt diese entweder direkt selbst mit Java umzusetzen oder halt System-eigene Dinge nutzt ?
In diesem Fall : Warum lokalen Standard-Client öffnen statt mit Java-Mail selbst zu arbeiten ? Oder eben halt was System-eigenes nehmen (DotNET) um die gewünschte Aktion auszulösen.

Wie ich schon mal wo anders schrieb : Java ist eigentlich nicht dazu gedacht als simples Spielzeug zu dienen um irgendwas über CMD zu triggern … zumindest nicht meiner Ansicht nach.[/QUOTE]

Weil man den SMTP host nicht kennt?

Warum soll ich nicht den Standard-Client öffnen?
1.) Wie Bleiglanz schon geschrieben hat, damit muss der User nicht in meinem Programm auch noch seine Mail credentials eintragen.
2.) Der User hat in seinem Mail-Programm wahrscheinlich auch ein Adressbuch und damit kann das auch verwendet werden.
3.) Viele Anwender sind Ihr Mail-Programm gewöhnt und warum soll man daher funktionierende Sachen nicht wiederverwenden?

Also es gibt viele Gründe warum man das machen sollte.

Dann würde ich für sowas aber trotzdem nicht Java “missbrauchen”.

Was sollte hier missbraucht werden? Wenn du mir bitte erklären könntest was du damit meinst.

D.H. sobald man auch nur ein externes Programm anspricht darf man Java nicht mehr verwenden? Dann muss ich wohl mein Programm komplett umschreiben, da ich glaub ich im Moment 7 verschiedene Mail-clients anspreche, sowohl Linux, Windows und Mac.

Und selbst wenn ich nur eine Windows-only Anwendung geschrieben hätte, würde das Java nicht ausschließen.

Aber auch egal deine Sichtweise ist in meinen Augen etwas zu stark eingeschränkt.

Die Klasse Dekstop wurde extra dafür geschrieben um für sowas “misbraucht” zu werden. Ich sehe die Klasse als groe Errungenschaft in der Plattformunabhängigkeit von Java vor allem für Endanwender.

Das ist ein Design-Fehler, das solltest du nicht machen. Ist doch ein Alptraum, fragil und funktioniert doch nur „zufällig“.