# Globale Adressliste aus Outlook



## hispeedsurfer (25. Oktober 2006)

Habe hier im Forum schon die super Lösungen zu Java in Verbindung mit Outlook von Thomas Darimont gelesen. Im Moment sitze ich an dem Problem das Adressbuch (nicht die Kontakte) von Outlook anzusprechen. Über LDAP hatte ich bisher keinen Erfolg, da das von Exchange verwendete Bindungsprotokoll nicht mit der Bindung von javax etc harmoniert. 

Daher meine Frage: Kann ich von Java aus auf emails, usernamen etc aus dem Globalen Adressbuch von Outlook zugreifen. Wäre wirklich sehr dankbar wenn es dafür eine Lösung geben würde.

Danke
Andreas


----------



## Thomas Darimont (25. Oktober 2006)

Hallo!

Also mit "purem" OLE per SWT ging das so...

(Als kleines Beispiel liste ich mal alle AddressListen und dann die jeweiligen AddressEinträge auf)

```
/**
 * 
 */
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[] addressListsPropertyDispId = mapiNamespaceAuto.getIDsOfNames(new String[] { "AddressLists" });

    Variant addressLists = mapiNamespaceAuto.getProperty(addressListsPropertyDispId[0]);

    OleAutomation addressListsAutomation = addressLists.getAutomation();

    int[] addressListsCountPropertyDispId = addressListsAutomation.getIDsOfNames(new String[] { "Count" });

    Variant addressListsCount = addressListsAutomation.invoke(addressListsCountPropertyDispId[0]);

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

    for (int i = 1, cnt = addressListsCount.getInt(); i <= cnt; i++) {
      Variant addressList = addressListsAutomation.invoke(itemDispId[0], new Variant[] { new Variant(i) });
      System.out.println(addressList);

      OleAutomation addressListAutomation = addressList.getAutomation();

      int[] addressListNamePropertyDispId = addressListAutomation.getIDsOfNames(new String[] { "Name" });

      Variant addressListName = addressListAutomation.getProperty(addressListNamePropertyDispId[0]);
      System.out.println("AddressList: " + addressListName.getString());

      listAllAddressEntriesFor(addressListAutomation);

      addressListAutomation.dispose();
    }

    addressListsAutomation.dispose();

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

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

    frm.dispose();
  }


  private static void listAllAddressEntriesFor(OleAutomation addressListAutomation) {
    int[] addressEntriesPropertyDispId = addressListAutomation.getIDsOfNames(new String[] { "AddressEntries" });
    Variant addressEntries = addressListAutomation.getProperty(addressEntriesPropertyDispId[0]);
    OleAutomation addressEntriesAutomation = addressEntries.getAutomation();

    int[] addressEntriesCountPropertyDispId = addressEntriesAutomation.getIDsOfNames(new String[] { "Count" });
    int[] addressEntriesItemPropertyDispId = addressEntriesAutomation.getIDsOfNames(new String[] { "Item" });

    Variant addressEntriesCount = addressEntriesAutomation.getProperty(addressEntriesCountPropertyDispId[0]);

    for (int i = 0, count = addressEntriesCount.getInt(); i < count; i++) {
      Variant addressEntry = addressEntriesAutomation.invoke(addressEntriesItemPropertyDispId[0],
        new Variant[] { new Variant(i) });

      if (addressEntry == null) {
        continue;
      }

      OleAutomation addressEntryAutomation = addressEntry.getAutomation();

      int[] addressEntryNameDispId = addressEntryAutomation.getIDsOfNames(new String[] { "Name" });
      int[] addressEntryAddressDispId = addressEntryAutomation.getIDsOfNames(new String[] { "Address" });

      Variant addressEntryName = addressEntryAutomation.invoke(addressEntryNameDispId[0]);
      Variant addressEntryAddress = addressEntryAutomation.invoke(addressEntryAddressDispId[0]);
      System.out.println(addressEntryName.getString() + ": " + addressEntryAddress.getString());

      addressEntryAutomation.dispose();

    }

    addressEntriesAutomation.dispose();
  }
}
```

Ich würde dir jedoch raten einen COM-Wrapper wie Jacob zu verwenden, damit erspart man sich einen Haufen Ärger und Fummelei...

Gruß Tom


----------



## hispeedsurfer (25. Oktober 2006)

Hallo Tom,

danke für deine schnelle Antwort und Lösung. Das mit Jacob war eine sehr gute Idee. 

Mittels Microsoft ADsDSOObject und Jacob habe ich die benötigten Active Directory Abfragen erstellen können. Habe einfach das bestehende Beispiel abgeändert und es läuft.

Hast du evtl schon Erfahrungen mit Jacob und Outlook. Dein Beispielcode aus [gelöst]Outlook steuern mit Java  verwende ich bereits in Verbindung mit J2EE um aus einer Webapplikation E-Mails über Outlook zu versenden. 
Da die diversen Libraries die Applikation unnötig aufblasen möchte ich das Senden über Outlook nun auch mit Jacob verrichten. Allerdings kenne ich mich absolut nicht mit den Konstaten etc aus, die hierbei verwendet werden um ein MailItem zu erstellen und zu senden. 

Wenn du evtl schon eine Lösung hast wäre ich dir sehr Dankbar.

Gruß
Andreas


----------



## hispeedsurfer (25. Oktober 2006)

Hallo zusammen,

hab nun mit einem Hinweis aus der Jacob FAQ und rumprobieren eine Lösung zum senden von Mail mit Jacob gefunden.
Hier der Code für alle die es Interessiert:

```
package org.jacobb;

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

public class Outlook {
	private static int OLMAILITEM = 0;

	public static void main(String[] args) throws IOException {

		ActiveXComponent xl = new ActiveXComponent("Outlook.Application");
		Dispatch olo = xl.getObject();
		Dispatch new_app = Dispatch.invoke(olo, "CreateItem", Dispatch.Get,
				new Object[] { "0" }, new int[OLMAILITEM]).toDispatch();

		Dispatch.put(new_app, "Subject", "Mit Jacob eingetragen");
		Dispatch.put(new_app, "Body", "sdfjlksadjf");
		Dispatch.put(new_app, "To", "test@test.de");
		Dispatch.call(new_app, "Send");

	}

}
```

Noch was, der Code hat bei mir bisher nur mit der Version jacob_1.11-pre2 funktioniert
Viel Spaß damit

Besonderen Dank an Tom

Gruß
Andreas


----------

