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:

javaprogger1987

Erfahrenes Mitglied
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..
 

Thomas Darimont

Premium-User
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
 

philippo

Mitglied
@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:

Thomas Darimont

Premium-User
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
 

philippo

Mitglied
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!
 

meisteryoda

Mitglied
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.
 

Thomas Darimont

Premium-User
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
 

meisteryoda

Mitglied
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
 

Thomas Darimont

Premium-User
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
 

rohstoff77

Grünschnabel
Hallo, ich habe mir auch schon ein kl. programm gebaut um kontakte aus dem outlook zu lesen. ich möchte mein prog. aber noch abändern, das ich auch kontakte vom öffentlichen ordner lesen kann. ich finde dazu aber leider keine doku im netz wo ich da zugreifen muss/darf.

Code:
import java.io.*; 
import com.jacob.activeX.*;
import com.jacob.com.*;

public class Uebung01 {
public static void main(String[] args) throws IOException {
final int olFolderContacts = 10;


//output logfilename mit path
String file = "c:\\temp\\logfile.txt";
BufferedWriter out = new BufferedWriter(
	  new OutputStreamWriter(
		new FileOutputStream( file ) ) );

ActiveXComponent ol = new ActiveXComponent("Outlook.Application");
Dispatch dsp = new Dispatch();

Object olo = ol.getObject();
Object myNamespace = Dispatch.call(olo, "GetNamespace", "MAPI").toDispatch();
Object myFolder = Dispatch.call(myNamespace, "GetDefaultFolder", new Integer(olFolderContacts)).toDispatch();

Object items = Dispatch.get(myFolder, "Items").toDispatch();

int count = Dispatch.call(items, "Count").toInt();

for (int i = 1; i <= count; i++) {
Object item;
item = Dispatch.call(items, "Item", new Integer(i)).toDispatch();

String firstname = Dispatch.get(item, "firstname").toString();
String lastname = Dispatch.get(item, "lastname").toString();
String fullName = Dispatch.get(item, "Fullname").toString();
String emailAddress = Dispatch.get(item, "Email1Address").toString();
String addressStreet = Dispatch.get(item, "BusinessAddressStreet").toString();
String addressCity = Dispatch.get(item, "BusinessAddressCity").toString();
String addressCountry = Dispatch.get(item, "BusinessAddressCountry").toString();
String addressPostalCode = Dispatch.get(item, "BusinessAddressPostalCode").toString();
String addressState = Dispatch.get(item, "BusinessAddressState").toString();
String title = Dispatch.get(item, "Title").toString();
String phone = Dispatch.get(item, "BusinessTelephoneNumber").toString();
String fax = Dispatch.get(item, "BusinessFaxNumber").toString();
String privat = Dispatch.get(item, "HomeTelephoneNumber").toString();
String mobil = Dispatch.get(item, "MobileTelephoneNumber").toString();
String webpage = Dispatch.get(item, "Webpage").toString();

	logData( firstname, out );
	logData( lastname, out );
	logData( addressStreet, out );
	logData( addressCity, out );
	logData( addressState, out );
	logData( addressPostalCode, out );
	logData( addressCountry, out );
	logData( phone, out );
	logData( fax, out );
	logData( privat, out );
	logData( mobil, out );
	logData( emailAddress, out );
	logData( webpage, out );
	out.newLine();
	
}										
out.close();

}										


public static void logData(String value, BufferedWriter out ) throws IOException {
		out.write( value );
		out.write( ";" );
									}										
}
hat da jemand eine idee?

und bei mir meldet sich immer outlook ob ich zulassen will das jemand auf das programm zugreift. kann man das abstellen?
---- schon eine lsg gefunden ----
http://www.gangl.de/downloads/OLXSecuritySetup.exe
das ist ein freeware tool das diese meldungen abstellt. die frage ist nur wie sieht es mit dem sicherheitsdenken aus, weil diese sicherheitsmeldungen von outlook ja nicht ohne hintergedanken eingebaut sind. wenn ein DAU user vor dem rechner sitzt dann ist es egal, weil der klickt ja sowieso auf JA.

habe auch noch diese tool gefunden.
http://www.contextmagic.com/express-clickyes/
aber ich denke das funktioniert nur mit englisch sprachigen outlooks und somit nichts für mich.

hat vielleicht noch jemand eine bessere idee diese meldungen nur für diesen einen fall abstellen, d.h. mein java programm zu registrieren sodas outlook merkt das es friendly ist.


lg

rohstoff77


Du mußt deinen Gegner in einen Wald führen wo 2+2=5 ist und wo der Weg raus nur breit genug für einen ist. by Michael Tal
 
Zuletzt bearbeitet:

KeinerMehrFrei

Grünschnabel
Thomas Darimont hat gesagt.:
Folgendes funktioniert mittels SWT, OLE und Outlook 2000:
(Vielleicht kann ja jemand das mal mit anderen Outlookversionen Testen) ;-)
Läuft auch unter Outlook 2003/Win2K ABER unter WinXP Outlook2003 wird eine Exception
Code:
Exception in thread "main" org.eclipse.swt.SWTException: Failed to create Ole Client. result = -2147467262
	at org.eclipse.swt.ole.win32.OLE.error(OLE.java:302)
	at org.eclipse.swt.ole.win32.OleClientSite.<init>(OleClientSite.java:241)
	at OutlookMail.OutlookMail.main(OutlookMail.java:36)
geworfen, dieses passiert genau dann wenn man debugt und bei der Zeile ankommt
Code:
 		OleClientSite site = new OleClientSite(frm, SWT.NONE,
 				"Outlook.Application");
Hat da wer ne Idee? Ich will auch unter XP nutzen :(

Gruß
Basti
 

KeinerMehrFrei

Grünschnabel
Hi Tom,

also ich glaube da liegt das Problem, denn auch bei dem Beispiel bekomme ich gleiche Fehlermeldung! Ich werde das nachher nochmal auf dem Arbeitslaptop ausprobieren, aber ich denke daran wird es liegen.
Ich habe die Visual Studio Tools net, gibt es für mich eine andere Möglichkeit zu schaun ob das darunter registriert ist? Bzw. wie kann ich es anstellen, dass es sich registriert :confused:

Danke und Gruß
Basti
 

Tom_80

Grünschnabel
Hallo zusammen

Ich bin am gleichen problem und habe das mal mit Eclipse getestet, kam aber folgende Fehlermeldung, obwohl ich die Library in den Pfad eingebettet habe...

Exception in thread "main" java.lang.UnsatisfiedLinkError: no swt-win32-3139 in java.library.path
at java.lang.ClassLoader.loadLibrary(ClassLoader.java:1682)
at java.lang.Runtime.loadLibrary0(Runtime.java:822)
at java.lang.System.loadLibrary(System.java:992)
at org.eclipse.swt.internal.Library.loadLibrary(Library.java:123)
at org.eclipse.swt.internal.win32.OS.<clinit>(OS.java:18)
at org.eclipse.swt.widgets.Display.<clinit>(Display.java:125)
at outlook.main(outlook.java:23)

Kann mir jemand helfen?
 

Tom_80

Grünschnabel
Gibts auch fixfertige Applikationen um auch auf z.B Kalender oder Aufgeben zugreiffen zu könne und zu bearbeiten.....ev. auch auf mails?

Gruss Thomas
 

testuser123

Grünschnabel
Hi,

ich wüsste gerne, wie man eine E-Mail erstellt, die eine Umfrage enthält bzw, die auf eine Umfrage antwortet.

Damit meine ich Abstimmungs-Buttons, wie "Genehmigt", "Abgelehnt" usw.
(unter Outlook2003->neue Mail->Optionen->Abstimmungsschaltflächen...)

Vielen Dank!