Outlook steuern mit Java

philippo

Mitglied
[gelöst]Outlook steuern mit Java

Hallo!

(Jetzt ein extra-Thread...)

Also alles was ich will ist Outlook anzuweisen eine Email zu senden.
Ich will den Empfänger, den Betreff und ggf. auch Inhalt in der Anweisung mitgeben. Ich weiß dass das irgendwie gehen muss...
Ich kann als Programmiersprache nur Java einsetzen, höchstens noch irgendeinen Batchjob o.ä.

Danke für jeden Hhinweis!
 
Zuletzt bearbeitet:
Kannst du VisualBasic Scripts ausführen?
Dann kannst du das folgende einfach in ein .vbs Datei schreiben (mit entsprechenden Angaben) und dann ausführen..
Hab ich übrigens bei Google gefunden, ist nicht von mir:
Code:
Option Explicit
Dim ArgObj
Set ArgObj = WScript.Arguments
if ArgObj.Count <> 3 then
	DisplayHelpMessage
	WScript.Quit
end if	
 
Dim target, subject, body, from
target = ArgObj.Item( 0)
subject = ArgObj.Item( 1)
body = ArgObj.Item( 2)
from = "IhreEmail@absender.de"
 
SendMail target, from, subject, body
 
function SendMail( strTo, strFrom, strSubject, strBody)
 
	dim oMsg
	set oMsg = CreateObject("CDO.Message")
	oMsg.To = strTo
	oMsg.From = strFrom
	oMsg.Subject = strSubject
	oMsg.TextBody = strBody
	oMsg.Send
 
	WScript.Echo "<A class=iAs style="COLOR: darkgreen; BORDER-BOTTOM: darkgreen 1px solid; BACKGROUND-COLOR: transparent; TEXT-DECORATION: underline" href="#" target=_blank>Mail</A> von " & strFrom & " an " & strTo & " verschickt.."
	set oMsg = Nothing
 
end function
 
sub DisplayHelpMessage()
	WScript.Echo 
	WScript.Echo "Usage: sendmail To Subject Body"
	WScript.Echo "... Subject und Body in doppelten Hochhaken"
end sub

Ansonsten musst du den Weg über eine JNI-Dll machen..
 
Hallo!

Ich war mal ein wenig fleißig ;-)
Folgendes funktioniert mittels SWT, OLE und Outlook 2000:
(Vielleicht kann ja jemand das mal mit anderen Outlookversionen Testen) ;-)
(Vor dem ersten Aufruf muss Outlook laufen)
Code:
/**
  * 
  */
 package de.tutorials;
 
 import org.eclipse.swt.SWT;
 import org.eclipse.swt.layout.FillLayout;
 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;
 
 /**
  * @author Tom
  * 
  */
 public class OutlookControl {
 
 	public static int OUTLOOK_MAIL_ITEM = 0;
 
 	/**
 	 * @param args
 	 */
 	public static void main(String[] args) {
 		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" });
 
 		int[] LogoffDispId = NamespaceAutomation
 				.getIDsOfNames(new String[] { "Logoff" });
 
 		NamespaceAutomation.invoke(LogonDispId[0], new Variant[] {
 		    	new Variant("YOUR MAIL ACCOUNT"), new Variant("YOUR PASSWORD"),
 				new Variant(true), new Variant(true) });
 
 		int[] CreateItemDispId = auto
 				.getIDsOfNames(new String[] { "CreateItem" });
 
 		Variant mailItem = auto.invoke(CreateItemDispId[0],
 				new Variant[] { new Variant(OUTLOOK_MAIL_ITEM) });
 
 		OleAutomation mailItemAutomation = mailItem.getAutomation();
 
 		int[] ToPropertyDispId = mailItemAutomation
 				.getIDsOfNames(new String[] { "To" });
 
 		mailItemAutomation.setProperty(ToPropertyDispId[0], new Variant(
 				"YOUR RECIPIENT@SOMEDOMAIN.DE"));
 
 		int[] SubjectPropertyDispId = mailItemAutomation
 				.getIDsOfNames(new String[] { "Subject" });
 
 		mailItemAutomation
 				.setProperty(SubjectPropertyDispId[0], new Variant(
 		    			"SWT Outlook Automation Example "
 		    		    		+ System.currentTimeMillis()));
 
 		int[] BodyPropertyDispId = mailItemAutomation
 				.getIDsOfNames(new String[] { "Body" });
 
 		mailItemAutomation.setProperty(BodyPropertyDispId[0], new Variant(
 		    	"SWT OLE Automation Rockz! Powered by tutorials.de :)"));
 
 		int[] SendDispId = mailItemAutomation
 				.getIDsOfNames(new String[] { "Send" });
 
 		mailItemAutomation.invoke(SendDispId[0]);
 
 		NamespaceAutomation.invoke(LogoffDispId[0]);
 
 		shell.dispose();
 
 		auto.dispose();
 
 		NamespaceAutomation.dispose();
 
 		mailItemAutomation.dispose();
 
 		site.deactivateInPlaceClient();
 		site.dispose();
 
 		frm.dispose();
 	}
 }
Dies hier war meine Vorlage:
http://support.microsoft.com/?kbid=220600

Der Zugriff auf Kontakte, den Kalendar etc. ist demnach auch ein "Kinderspiel" :)

Gruß Tom
 
@javaprogger1987: Danke mal. Ich kann zwar kein VB, aber so wie ich das sehe muss ich an das Skript drei Parameter anhängen, die in ein Feld eingelesen werden und anschließend wird eine Art interne Routine aufgerufen, die Mails versendet. Aber was hat das mit Outlook zu tun?

@Tom: Alter, ich bin beeindruckt! Du bist schon ne Kiste. Ich werd mich im Laufe des Nachmittags mal an deinen Code setzen und ihn durchleuchten und testen. Wir verwenden hier Outlook 2002, bin mal gespannt...
Diese automatisch übersetzten Support Seiten sind echt der Hammer... Ich find das ist einfach nur ne Riesen-Frechheit von Microsoft.
Ich hab das Ding mal kurz in Eclipse kopiert und festgestellt, dass
Code:
import org.eclipse.swt.SWT;
bei mir rot unterstrichen wird, weil org.eclipse nicht gefunden wird. Kannst du mir das erklären?
 
Zuletzt bearbeitet:
Hallo!

bei mir rot unterstrichen wird, weil org.eclipse nicht gefunden wird. Kannst du mir das erklären?
Du musst noch die SWT Bibliothek in den Classpath deines Projektes mitaufnehmen.
-> Project (Kontextmenü)-> Properties -> Buildpath -> Libraries -> Add Variable -> Eclipse_HOME -> Extend -> (In Eclipse 3.0.x beispielsweise) -> plugins\org.eclipse.swt.win32_3.0.1\ws\win32\SWT.jar

Gruß Tom
 
OK, danke mal für alle Beiträge, inzwischen bin ich das Problem auf sehr einfache Art umgangen.
Es existiert ein Mini-Tool namens smtpsend.exe, welches man mit Parametern aufrufen kann - für den Fall, dass jemand mal das selbe Problem wie ich haben sollte. Grüße!
 
Also der Threat ist zwar schon ziemlich alte aber trotzdem hab ich dazu ne frage.

Das java Programm laeuft bei mir mit outlook 2003, funktioniert alles.

Allerdings schrieb Tom Folgendes:
Dies hier war meine Vorlage:
http://support.microsoft.com/?kbid=220600

Der Zugriff auf Kontakte, den Kalendar etc. ist demnach auch ein "Kinderspiel"

Gruß Tom

Ich seh mal überhaupt keine zusammenhang zwischen dem link und dem geposteten Code.
Könnte daran liegen dass ich absolut keine Ahnung von C++ hab.

Würede allerdings gerne an die Adressen von Outlook kommen, was ja ein Kinderspiel sein soll nur ich hab absolut keinen Plan wie das gehen soll.

Tips,Links etc waeren sehr hilfreich.
 
Hallo!

Eigentlich muss man ja nur die passenden Methoden/Attributnamen heraussuchen und diese dann aufrufen...
Eigentlich ziemlich einfach ;-)

So kann man mittels SWT beispielsweise einen Contact in Outlook anlegen:
Code:
/**
 * 
 */
package de.tutorials;

import org.eclipse.swt.SWT;
import org.eclipse.swt.layout.FillLayout;
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;

/**
 * @author Tom
 * 
 */
public class OutlookOLEAutomationThroughSWTExample {

    /**
     * @param args
     */
    public static void main(String[] args) {
        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[] CreateItemDispId = auto
                .getIDsOfNames(new String[] { "CreateItem" });

        final int OUTLOOK_CONTACT_ITEM = 2;

        Variant contactItem = auto.invoke(CreateItemDispId[0],
                new Variant[] { new Variant(OUTLOOK_CONTACT_ITEM) });

        OleAutomation contactItemAutomation = contactItem.getAutomation();

        int[] CompanyNamePropertyDispId = contactItemAutomation
                .getIDsOfNames(new String[] { "CompanyName" });

        contactItemAutomation.setProperty(CompanyNamePropertyDispId[0],
                new Variant("tutorials.de"));

        int[] Email1AddressPropertyDispId = contactItemAutomation
                .getIDsOfNames(new String[] { "Email1Address" });

        contactItemAutomation.setProperty(Email1AddressPropertyDispId[0],
                new Variant("foo@bar.com"));

        int[] SaveDispId = contactItemAutomation
                .getIDsOfNames(new String[] { "Save" });

        contactItemAutomation.invoke(SaveDispId[0]);

        contactItemAutomation.dispose();

        shell.dispose();
        auto.dispose();

        site.deactivateInPlaceClient();
        site.dispose();

        frm.dispose();
    }

}

Die Outlook Konstanten findet man übrigens hier:
http://www.datalife.com/yitz/automation/ol_constants.html

Gruß Tom
 
Stell ich mich nur bloed an, oder ....

Übergeben/Schreiben von Emails funktioniert, allerdings wie komm ich an eine Emailadresse die in Outlook gespeichert ist dran?, wie les ich sowas aus ?

Bin wie man vll. merkt nicht sooooo der JavaGott
 
Hallo!

Outlook Kontakte auslesen kann man so:
Code:
/**
 * 
 */
package de.tutorials;

import org.eclipse.swt.SWT;
import org.eclipse.swt.layout.FillLayout;
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;

/**
 * @author Tom
 * 
 */
public class OutlookOLEAutomationThroughSWTExample {

    /**
     * @param args
     */
    public static void main(String[] args) {
        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 mapiNamespace = auto.invoke(GetNamespaceDispId[0],
                new Variant[] { new Variant("MAPI") });

        OleAutomation mapiNamespaceAuto = mapiNamespace.getAutomation();

        int[] DefaultFolderPropertyDispId = mapiNamespaceAuto
                .getIDsOfNames(new String[] { "GetDefaultFolder" });

        Variant defaultFolder = mapiNamespaceAuto.invoke(
                DefaultFolderPropertyDispId[0],
                new Variant[] { new Variant(10) });

        OleAutomation defaultFolderAutomation = defaultFolder.getAutomation();

        int[] ItemsFolderPropertyDispId = defaultFolderAutomation
                .getIDsOfNames(new String[] { "Items" });

        Variant items = defaultFolderAutomation
                .invoke(ItemsFolderPropertyDispId[0]);

        OleAutomation itemsAutomation = items.getAutomation();

        int[] ItemsCountPropertyDispId = itemsAutomation
                .getIDsOfNames(new String[] { "Count" });

        int[] itemDispId = itemsAutomation
                .getIDsOfNames(new String[] { "Item" });

        Variant itemsCount = itemsAutomation
                .invoke(ItemsCountPropertyDispId[0]);

        for (int i = 1, cnt = itemsCount.getInt(); i <= cnt; i++) {
            Variant contact = itemsAutomation.invoke(itemDispId[0],
                    new Variant[] { new Variant(i) });
            OleAutomation contactAutomation = contact.getAutomation();

            int[] ContactNamePropertyDispId = contactAutomation
                    .getIDsOfNames(new String[] { "FullName" });

            Variant contactName = contactAutomation
                    .getProperty(ContactNamePropertyDispId[0]);

            int[] CompanyNamePropertyDispId = contactAutomation
                    .getIDsOfNames(new String[] { "CompanyName" });

            Variant companyName = contactAutomation
                    .getProperty(CompanyNamePropertyDispId[0]);

            System.out.println("Contact: " + contactName.getString()
                    + " works for " + companyName.getString());

            contactAutomation.dispose();
        }

        itemsAutomation.dispose();
        defaultFolderAutomation.dispose();

        mapiNamespaceAuto.dispose();
        shell.dispose();
        auto.dispose();

        site.deactivateInPlaceClient();
        site.dispose();

        frm.dispose();
    }
}

Ich denke, dass ganze sollte man in einer Real World Anwendung nicht so umständlich implementieren ... und sich entweder mit einer eigenen (beispielsweise auf DynamicProxies basierender) Schnittstelle oder mit einer schon fix und fertigen http://danadler.com/jacob/ Implementierung weiterhelfen.


Gruß Tom
 
Zurück