SWT Outlook 2000: Aufgabe versenden mit SWT

rongricker

Mitglied
Hallo,
ich habe ein dringendes Problem:
Über meine Java-Applikation (mithilfe von SWT) sollen in Outlook Aufgaben erstellt UND versendet werden! Das erstellen und speichern der Aufgaben funktioniert, aber leider schaffe ich es nicht diese auch zu versenden Alle Properties werden erfolgreich gespeichert, aber wenn ich mir die aus Java generierte Aufgabe in meinem Outlook Postfach anschaue, ist das "An:" -Feld immer leer und die Aufgabe wird nicht versendet.... Das Versenden einfacher Mails klappt übrigens.

Das Problem muss irgendwie beim setzen des Recipients-Properties liegen... im Beispiel unten versuche ich es mit einem Variant-Array... in anderen Versuchen mit einem einfachen Variant-Objekt funktionierte es auch nicht.???:L

hier der Code:

Java:
public void swtTest() {

Display display = new Display();
Shell shell = new Shell(display);
shell.setText( "Outlook Automation" );
shell.setLayout( new FillLayout() );
OleFrame frm = new OleFrame( shell, SWT.NONE );
OleClientSite site = new OleClientSite( frm, SWT.NONE, "Outlook.Application" );
OleAutomation auto = new OleAutomation( site );
int[] GetNamespaceDispId = auto.getIDsOfNames( new String[] { "GetNamespace" } );
Variant Namespace = auto.invoke(GetNamespaceDispId[0], new Variant[] { new Variant( "MAPI" ) } );
OleAutomation NamespaceAutomation = Namespace.getAutomation();
int[] LogonDispId = NamespaceAutomation.getIDsOfNames( new String[] { "Logon" } );
NamespaceAutomation.invoke(LogonDispId[0], new Variant[] { new Variant( "XXX@XXX.de" ),
new Variant( "XXX" ),
new Variant( true ),
new Variant( true ) });


int[] createItemDispId = auto.getIDsOfNames( new String[] { "CreateItem" } );
Variant task = auto.invoke( createItemDispId[0], new Variant[] { new Variant( JConstant.OUTLOOK_TASK_ITEM ) } );
OleAutomation taskAutomation = task.getAutomation();

int[] delegatorPropertyDispId = taskAutomation.getIDsOfNames( new String[] { "Delegator" } );
taskAutomation.setProperty( delegatorPropertyDispId[0], new Variant( "absender@test.de" ) );

int[] subjectPropertyDispId = taskAutomation.getIDsOfNames( new String[] { "Subject" } );
taskAutomation.setProperty( subjectPropertyDispId[0], new Variant( "Dies ist der Betreff" ) );

int[] BodyPropertyDispId = taskAutomation.getIDsOfNames( new String[] { "Body" } );
taskAutomation.setProperty( BodyPropertyDispId[0], new Variant( "Hier steht der Inhalt der Aufgabe...") );

int[] assignDispId = taskAutomation.getIDsOfNames( new String[] { "Assign" } );
taskAutomation.invoke( assignDispId[0] );

int[] recipientsPropertyDispId = taskAutomation.getIDsOfNames( new String[] { "Recipients" } );
taskAutomation.setProperty( recipientsPropertyDispId[0], new Variant[]{ new Variant( "empfaenger@test.de" ) } );

int[] saveDispId = taskAutomation.getIDsOfNames( new String[] { "Save" } );
taskAutomation.invoke( saveDispId[0] );

int[] sendDispId = taskAutomation.getIDsOfNames( new String[] { "Send" } );
taskAutomation.invoke( sendDispId[0] );

int[] LogoffDispId = NamespaceAutomation.getIDsOfNames( new String[] { "Logoff" } );
NamespaceAutomation.invoke( LogoffDispId[0] );
shell.dispose();
auto.dispose();
NamespaceAutomation.dispose();
taskAutomation.dispose();
site.deactivateInPlaceClient();
site.dispose();
frm.dispose();
}

hier die Office Outlook 2003 VBA Language Reference zum TaskItem Objekt:
http://msdn.microsoft.com/en-us/libr...ffice.11).aspx
ich nutze zwar Outlook 2000 aber das sollte nicht das Problem sein....

Ich bin für jeden Hinweis der mir irgendwie weiterhelfen könnte überaus dankbar.. ich verzweifle jetzt schon seit 2 Tagen an dem Problem :rtfm:
 

SnuSnu

Mitglied
Gibts hier schon was neues ? Habe das selbe Problem mit den Recipients. Eine Exception wird nicht geworfen wenn ich es wie im obigen Code einfüge, aber drinn stehen tut es auch nicht. Hat vielleicht jmd ein Beispiel?

gruß Snu
 

rongricker

Mitglied
Hi,
ich konnte das Problem mit Java leider nicht lösen damals. Habe dann ein Visual Basic Script geschrieben das ich aus Java ausführe. Klappt prima, ist aber halt nicht die saubere Lösung.

Gruß,
Rongricker
 

SnuSnu

Mitglied
Erstmal Danke für die schnelle Antwort :)

Ich muss leider bei Java bleiben :( das Problem ist ja das es eine Art "Add" Befehl geben muss, welches über diese Art von OLE wohl irgendwie nicht geht.
Vermutlich erwartet das Outlookobject eine Liste, welche ich so nicht anlegen kann. Hab mir das mal in Delphi und C# angeschaut, aber da scheint das alles kein Problem zu sein.

Ist doch scheiße mit Java ^^ AAAAaaaaaaaaahhhhhhhhhhh
 

rongricker

Mitglied
Ja ich verstehe die Verzweiflung, so ging es mir auch... da ich schnell eine Lösung finden musste habe ich das Problem dann halt mit VBS umgangen... Falls dir ne reine Java-Lösung gelingt wäre es super nett, wenn du sie hier posten könntest!

Gruß,
rongricker
 

SnuSnu

Mitglied
So, auch hier nochmals meine Lösung. Bis auf das Problem das mir die Tasks nicht im "Versenden" Modus aufgehen, klappt das zumindest mit den Recipients.

mfg Roman

Java:
import java.io.File;
import org.eclipse.swt.SWT;
import org.eclipse.swt.layout.FillLayout;
import org.eclipse.swt.ole.win32.OLE;
import org.eclipse.swt.ole.win32.OleAutomation;
import org.eclipse.swt.ole.win32.OleClientSite;
import org.eclipse.swt.ole.win32.OleFrame;
import org.eclipse.swt.ole.win32.Variant;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Shell;
import java.util.Date;

public class UtilitiesOutlook {

    public static int OUTLOOK_MAIL_ITEM = 0;
    public static int OUTLOOK_APPOINTMENT_ITEM = 1;
    public static int OUTLOOK_TASK_ITEM = 3;

    private static OleAutomation getProperty(OleAutomation auto, String name) {
        Variant varResult = auto.getProperty(property(auto, name));
        if (varResult != null && varResult.getType() != OLE.VT_EMPTY) {
            OleAutomation result = varResult.getAutomation();
            varResult.dispose();
            return result;
        }
        return null;
    }

    private static Variant invoke(OleAutomation auto, String command, String value) {
        return auto.invoke(property(auto, command), new Variant[]{new Variant(value)});
    }

    private static Variant invoke(OleAutomation auto, String command) {
        return auto.invoke(property(auto, command));
    }

    private static Variant invoke(OleAutomation auto, String command, int value) {
        return auto.invoke(property(auto, command), new Variant[]{new Variant(value)});
    }

    private static boolean setProperty(OleAutomation auto, String name, String value) {
        return auto.setProperty(property(auto, name), new Variant(value));
    }

    private static boolean setProperty(OleAutomation auto, String name, int value) {
        return auto.setProperty(property(auto, name), new Variant(value));
    }

    private static int property(OleAutomation auto, String name) {
        return auto.getIDsOfNames(new String[]{name})[0];
    }

    public static void SendNewMail(String To, String CC, String BCC, String Attach, String Subject, String Body, Boolean SendAsHtml, Boolean ShowBeforeSend) {

         * Parameter:
         *      To              - Empfänger (example@gmail.com)
         *      CC              - Kopie-Empfänger (example@gmail.com)
         *      BCC             - Blindkopie-Empfänger (example@gmail.com)
         *      Attach          - Mailanhang (C:\Test.txt)
         *      Subject         - Betreff (Text)
         *      Body            - Mailinhalt (Text oder HTML, kein RichText)
         *      SendAsHtml      - Mailformat (True: HTML, False: Text)
         *      ShowBeforeSend  - Mail anzeigen vor dem Versenden (True: Anzeigen, False: Nicht anzeigen)
         */
        
        Display d = new Display();
        try {
            // Auf Shell zugreifen
            Shell shell = new Shell(d);
            shell.setText("Outlook Automation");
            shell.setLayout(new FillLayout());
			
            // Outlook öffnen bzw. ansprechen
            OleFrame frm = new OleFrame(shell, SWT.NONE);
            OleClientSite site = new OleClientSite(frm, SWT.NONE, "Outlook.Application");
            OleAutomation auto = new OleAutomation(site);
			
            // Mailitem erstellen
            int[] CreateItemDispId = auto.getIDsOfNames(new String[]{"CreateItem"});
            Variant mailItem = auto.invoke(CreateItemDispId[0], new Variant[]{new Variant(OUTLOOK_MAIL_ITEM)});
            OleAutomation mail = mailItem.getAutomation();
			
            // Einstellungen setzen
            setProperty(mail, "To", To);
            setProperty(mail, "CC", CC);
            setProperty(mail, "BCC", BCC);
            File file = new File(Attach);
            if (file.exists()) {
                OleAutomation attachments = getProperty(mail, "Attachments");
                invoke(attachments, "Add", Attach);
            }
            if (SendAsHtml) {
                setProperty(mail, "BodyFormat", 2);
            } else {
                setProperty(mail, "BodyFormat", 1);
            }
            setProperty(mail, "Subject", Subject);
			
            // Öffnen oder Senden
            if (ShowBeforeSend) {
                invoke(mail, "Display");
                if (SendAsHtml) {
                    int[] SigPropertyDispId = mail.getIDsOfNames(new String[]{"HtmlBody"});
                    // Signatur auslesen
                    String Sig = mail.getProperty(SigPropertyDispId[0]).getString();
                    int IndexStart = Sig.indexOf("<span");
                    int IndexEnde = Sig.indexOf(">", IndexStart);
                    String SigSpan = Sig.substring(IndexStart, IndexEnde + 1);
                    setProperty(mail, "HtmlBody", "<html>" + SigSpan + Body + "</span></html>" + Sig);
                } else {
                    int[] SigPropertyDispId = mail.getIDsOfNames(new String[]{"Body"});
                    // Signatur auslesen
                    String Sig = mail.getProperty(SigPropertyDispId[0]).getString();
                    setProperty(mail, "Body", Body + Sig);
                }
            } else {
                invoke(mail, "Display");
                // Fenster muss kurz Sichtbar sein, damit die Signatur ausgelesen werden kann,
                // da diese erst beim erzeugen des Fenster eingefügt wird.
                if (SendAsHtml) {
                    int[] SigPropertyDispId = mail.getIDsOfNames(new String[]{"HtmlBody"});
                    // Signatur auslesen
                    String Sig = mail.getProperty(SigPropertyDispId[0]).getString();
                    int IndexStart = Sig.indexOf("<span");
                    int IndexEnde = Sig.indexOf(">", IndexStart);
                    String SigSpan = Sig.substring(IndexStart, IndexEnde + 1);
                    setProperty(mail, "HtmlBody", "<html>" + SigSpan + Body + "</span></html>" + Sig);
                } else {
                    int[] SigPropertyDispId = mail.getIDsOfNames(new String[]{"Body"});
                    // Signatur auslesen
                    String Sig = mail.getProperty(SigPropertyDispId[0]).getString();
                    setProperty(mail, "Body", Body + Sig);
                }
                invoke(mail, "Send");
            }
			
            d.dispose();
        } catch (Exception ex) {
            System.out.println(ex.getMessage());
        }
    }

    public static void SendNewAppointment(String To, String Subject, String Body, String Location, String StartDateTime, Integer Duration, Boolean ShowBeforeSend) {

        *       Parameter:
        *       To              - Empfänger (example@gmail.com)
        *       Subject         - Betreff (Text)
        *       Body            - Mailinhalt (Text oder HTML, kein RichText)
        *       Location        - Ort des Meetings (Büro)
        *       StartDateTime   - Stardatum und Startuhrzeit (24.12.2012 12:00:00)
        *       Duration        - Dauer in Minuten (60)
        *       ShowBeforeSend  - Anzeigen vor dem Versenden (True: Anzeigen, False: Nicht anzeigen)
        */

        Display d = new Display();

        try {
            // Auf Shell zugreifen
            Shell shell = new Shell(d);
            shell.setText("Outlook Automation");
            shell.setLayout(new FillLayout());

            // Outlook öffnen bzw. ansprechen
            OleFrame frm = new OleFrame(shell, SWT.NONE);
            OleClientSite site = new OleClientSite(frm, SWT.NONE, "Outlook.Application");
            OleAutomation auto = new OleAutomation(site);

            // Termin erstellen
            int[] CreateItemDispId = auto.getIDsOfNames(new String[]{"CreateItem"});
            Variant taskItem = auto.invoke(CreateItemDispId[0], new Variant[]{new Variant(OUTLOOK_APPOINTMENT_ITEM)});
            OleAutomation task = taskItem.getAutomation();

            // Einstellungen setzen
            setProperty(task, "Subject", Subject);
            setProperty(task, "Body", Body);
            setProperty(task, "Location", Location);
            setProperty(task, "Recipients", To);
            setProperty(task, "Start", StartDateTime);
            setProperty(task, "Duration", Duration);
			OleAutomation res = getProperty(task, "Recipients");
			invoke(res, "Add", To);

            // Öffnen oder Senden
            if (ShowBeforeSend) {
                invoke(task, "Display");
            } else {
                invoke(task, "Send");
            }
			
			d.dispose();
        } catch (Exception ex) {
            System.out.println(ex.getMessage());
        }
    }

    public static void SendNewTask(String To, String Subject, String Body, int Status, int Importance, String StartDate, String DueDate, Boolean ShowBeforeSend) {

         * Parameter:
         *      To              - Empfänger (example@gmail.com)
         *      Subject         - Betreff (Text)
         *      Body            - Mailinhalt (Text oder HTML, kein RichText)
         *      Status          - Status der Aufgabe (0-4)
         *      Importance      - Priorität (0-2)
         *      StartDate       - Startdatum
         *      DueDate         - Fälligkeitsdatum
         *      ShowBeforeSend  - Anzeigen vor dem Versenden (True: Anzeigen, False: Nicht anzeigen)
         */

        Display d = new Display();

        try {
            // Auf Shell zugreifen
            Shell shell = new Shell(d);
            shell.setText("Outlook Automation");
            shell.setLayout(new FillLayout());

            // Outlook öffnen bzw. ansprechen
            OleFrame frm = new OleFrame(shell, SWT.NONE);
            OleClientSite site = new OleClientSite(frm, SWT.NONE, "Outlook.Application");
            OleAutomation auto = new OleAutomation(site);

            // Task erstellen
            int[] CreateItemDispId = auto.getIDsOfNames(new String[]{"CreateItem"});
            Variant taskItem = auto.invoke(CreateItemDispId[0], new Variant[]{new Variant(OUTLOOK_TASK_ITEM)});
            OleAutomation task = taskItem.getAutomation();            

            // Einstellungen setzen
            setProperty(task, "Subject", Subject);
            setProperty(task, "Body", Body);
            setProperty(task, "Status", Status);
            setProperty(task, "Importance", Importance);

            setProperty(task, "StartDate", StartDate);
            setProperty(task, "DueDate", DueDate);
            OleAutomation res = getProperty(task, "Recipients");
            invoke(res, "Add", To);

            // Öffnen oder Senden
            if (ShowBeforeSend) {
                invoke(task, "Assign");
                invoke(task, "Display");
            } else {
                invoke(task, "Assign");
                invoke(task, "Send");
            }
			
			d.dispose();
        } catch (Exception ex) {
            System.out.println(ex.getMessage());
        }
    }
}
 
Zuletzt bearbeitet:

muppeK

Neues Mitglied
Hi rongricker,

du hast vergessen den Status deines Termins in "Meeting" zu ändern. Dann klappts auch mit dem Versenden :toll:

Java:
setProperty(task, "MeetingStatus", 1);
 

reichu

Neues Mitglied
Aloha.
ich habe mir vorgenommen, alle Mails (ungelesen und in einem festen Zeitabstand) in eine Datanbank zu exportieren um sie von dort aus weiter verwenden zu können.
Klappt auch alles ganz wunderbar (auch dank diesem Thread hier ;D) - nur das 'ReceivedTime'-Datum will nich so, wie ich will.
Ich bekomm es einfach nur als OLE-Typ 'VT_R4' rüber, was am Ende als float im Java ankommt. Aus der Zahl lässt sich aber kein Datum rückrechnen o.ä. Wie wild rum-konvertieren brachte mich bisher auch zu keinem Ergebnis
Hat jm ne Idee? Wär echt kuhl.

mfg,
Beni =)
 

erazor2106

Bekanntes Mitglied
Hallo,

gibt es irgendwo auch eine ausführlichere Anleitung bzw. ein empfehlenswertes Buch wo man nachlesen kann wie die Kommunikation mit Outlook zu handhaben ist?

VIelen Dank und viele Grüße erazor
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
izoards Outlook Mail erstellen - Signatur wird nicht angezeigt. AWT, Swing, JavaFX & SWT 3
Maks16 JavaFX ominöse Mails in meinem Suche Postfach von Outlook Sharepoint AWT, Swing, JavaFX & SWT 4
M Swing jTable wie Outlook AWT, Swing, JavaFX & SWT 2
E Outlook Email Senden-Button abfangen AWT, Swing, JavaFX & SWT 5
P SWT Übersicht a la Outlook Kalender AWT, Swing, JavaFX & SWT 3
J Outlook Panel AWT, Swing, JavaFX & SWT 2
B Outlook AWT, Swing, JavaFX & SWT 2
T Outlook-2003 ähnliche Sidebar? AWT, Swing, JavaFX & SWT 2
A Outlook Sicherheit AWT, Swing, JavaFX & SWT 10
P SWT, Windows 2000, GDI+ und Microsoft Redistributable AWT, Swing, JavaFX & SWT 3
G Sicherheitseinstellungen für Verzeichnis abfragen WIN 2000 AWT, Swing, JavaFX & SWT 2
B Komische Darstellung unter Windows 2000 AWT, Swing, JavaFX & SWT 2
Z setUndecorated(true) <-> win 2000 <-> win xp AWT, Swing, JavaFX & SWT 13
P Garfikfehler unter Windows 2000 AWT, Swing, JavaFX & SWT 3
thor_norsk AWT SWING Aufgabe AWT, Swing, JavaFX & SWT 7
U Zwei Fragen zu eienr Swing Aufgabe AWT, Swing, JavaFX & SWT 2
C Swing AWT GUI Anfänger Aufgabe AWT, Swing, JavaFX & SWT 7
Thallius Swing JDatePicker oder Sucht jemand eine Aufgabe? AWT, Swing, JavaFX & SWT 0
Thallius Swing Aufgabe für einen der gerne Tüftelt. AWT, Swing, JavaFX & SWT 4
T Swing Button bleibt grau [=> UI hat sich aufgehängt, Aufgabe in Thread auslagern] AWT, Swing, JavaFX & SWT 3
L Swing ActionListener führt seine Aufgabe nur teilweise aus. AWT, Swing, JavaFX & SWT 7
N Aufgabe: ActionEvent - Abfrage AWT, Swing, JavaFX & SWT 7
I Drag & Drop - kriegt Swing diese Aufgabe hin? AWT, Swing, JavaFX & SWT 5

Ähnliche Java Themen

Neue Themen


Oben