Laden...

Outlook: Via OLEDB schnell auf Outlook-Daten zugreifen

Erstellt von Rainbird vor 16 Jahren Letzter Beitrag vor 14 Jahren 26.520 Views
Rainbird Themenstarter:in
3.728 Beiträge seit 2005
vor 16 Jahren
Outlook: Via OLEDB schnell auf Outlook-Daten zugreifen

Beschreibung:

OLEDB-Datenzugriff ist ein effizienter Weg, um Daten aus Outlook abzurufen. Dieses Snippet ermöglicht sofortigen Zugriff auf das gesamte Outlook-Postfach.

// using System.Data.OleDb; // Nicht vergessen!

/// <summary>
/// Gibt den Inhalt eines bestimmten Outlook-Ordners als Tabelle zurück.
/// (Wurde nur mit einer deutschen Outlook-version getastet!)
/// </summary>
/// <param name="mapiProfile">Name des MAPI-Profils (z.B. "MS Exchange-Einstellungen"), einzusehen in Systemsteuerung -> Mail</param>
/// <param name="displayUserName">Anzeigename des Benutzers (z.B. "Max Mustermann")</param>
/// <param name="folderName">Name des Ordners (z.B. "Posteingang")</param>
/// <returns>Inhalt des Outlook-Ordners</returns>
private DataTable GetOutlookFolderData(string mapiProfile, string displayUserName, string folderName)
{ 
    // Verbindungszeichenfolge erzeugen
    string connectionString = string.Format("Provider=Microsoft.Jet.OLEDB.4.0;Exchange 4.0;MAPILEVEL=Postfach - {0}|;PROFILE={1};TABLETYPE=0;DATABASE={2};", displayUserName, mapiProfile, Environment.GetEnvironmentVariable("TEMP"));

    // SQL-Abfrage erzeugen
    string sql = string.Format("SELECT * FROM {0}", folderName);

    // Neue Tabelle erzeugen
    DataTable result = new DataTable(folderName);

    // Verbindung zu Outlook herstellen
    using (OleDbConnection connection = new OleDbConnection(connectionString))
    {
        // Datenadapter bauen
        OleDbDataAdapter adapter = new OleDbDataAdapter(sql, connection);

        // Inhalt des Outlook-Ordners abrufen
        adapter.Fill(result);
    }
    // Tabelle mit Ordnerinhalt zurückgeben
    return result;
}

Schlagwörter: Outlook, OLEDB, Posteingang, Inbox, Exchange, Exchange Server

Quelle: .NET-Snippets

G
18 Beiträge seit 2007
vor 16 Jahren

Kannst du mir sagen wie du auf die Unterordner des Posteingangs zugreifen kannst?

Gruß

ASP.NET Power

Rainbird Themenstarter:in
3.728 Beiträge seit 2005
vor 16 Jahren
Zugriff auf Unterordner

Dazu musst Du die Funktion nur geringfügig umbauen:


/// <summary>
/// Gibt den Inhalt eines bestimmten Outlook-Ordners als Tabelle zurück.
/// (Wurde nur mit einer deutschen Outlook-version getastet!)
/// </summary>
/// <param name="mapiProfile">Name des MAPI-Profils (z.B. "MS Exchange-Einstellungen"), einzusehen in Systemsteuerung -> Mail</param>
/// <param name="displayUserName">Anzeigename des Benutzers (z.B. "Max Mustermann")</param>
/// <param name="rootFolder">Stammordner</param>
/// <param name="folderName">Name des Ordners (z.B. "Posteingang")</param>
/// <returns>Inhalt des Outlook-Ordners</returns>
private DataTable GetOutlookFolderData(string mapiProfile, string displayUserName,string rootFolder, string folderName)
{
    // Verbindungszeichenfolge erzeugen
    string connectionString = string.Format("Provider=Microsoft.Jet.OLEDB.4.0;Exchange 4.0;MAPILEVEL=Postfach - {0}|{3};PROFILE={1};TABLETYPE=0;DATABASE={2};", displayUserName, mapiProfile, Environment.GetEnvironmentVariable("TEMP"),rootFolder);

    // SQL-Abfrage erzeugen
    string sql = string.Format("SELECT * FROM {0}", folderName);

    // Neue Tabelle erzeugen
    DataTable result = new DataTable(folderName);

    // Verbindung zu Outlook herstellen
    using (OleDbConnection connection = new OleDbConnection(connectionString))
    {
        // Datenadapter bauen
        OleDbDataAdapter adapter = new OleDbDataAdapter(sql, connection);

        // Inhalt des Outlook-Ordners abrufen
        adapter.Fill(result);
    }
    // Tabelle mit Ordnerinhalt zurückgeben
    return result;
}

Um z.B. auf den Ordner "Posteingang\Archiv\Faxe" zuzugreifen, wäre folgender Aufruf nötig:


DataTable result=GetOutlookFolderData("Outlook","Max Muster","Posteingang","Archiv\Faxe");

A
4 Beiträge seit 2007
vor 16 Jahren

Kann ich auf diesem Weg auch auf einen Öffentlichen Ordner zugreifen? Z.B. durch Veränderung des Mapilevels? Hab ein bissel mit deinem Code experimentiert, es aber nicht zustande gebracht.

Viele Grüße

G
18 Beiträge seit 2007
vor 16 Jahren
private DataTable GetOutlookFolderData(string mapiProfile, string rootFolder, string folderName)
{
    // Verbindungszeichenfolge erzeugen
    string connectionString = string.Format("Provider=Microsoft.Jet.OLEDB.4.0;Exchange 4.0;MAPILEVEL="Öffentliche Ordner"|{2};PROFILE={0};TABLETYPE=0;DATABASE={1};", mapiProfile, Environment.GetEnvironmentVariable("TEMP"),rootFolder);//beachte das MAPILEVEL und im Rootfolder kannst dann die unterordner angeben

    // SQL-Abfrage erzeugen
    string sql = string.Format("SELECT * FROM {0}", folderName);

    // Neue Tabelle erzeugen
    DataTable result = new DataTable(folderName);

    // Verbindung zu Outlook herstellen
    using (OleDbConnection connection = new OleDbConnection(connectionString))
    {
        // Datenadapter bauen
        OleDbDataAdapter adapter = new OleDbDataAdapter(sql, connection);

        // Inhalt des Outlook-Ordners abrufen
        adapter.Fill(result);
    }
    // Tabelle mit Ordnerinhalt zurückgeben
    return result;
} 

Versuch es mal so

jeder weitere Unterordner wird mit einem ' | ' getrennt

ASP.NET Power

A
4 Beiträge seit 2007
vor 16 Jahren

Vielen Dank für deine Antwort. Hat genauso funktioniert.

G
18 Beiträge seit 2007
vor 16 Jahren

Hi hast du ne idee wie die ordnerstruktur auslessen kann? Aslo z.b das ich sehen kann welche ordner alle in diesem Postfach angehängt sind z.b Postfach von - ... , Alle öffentliche Ordner oder Archivordner das muss ich noch auslesen

Vielen Dank schon mal

ASP.NET Power

A
4 Beiträge seit 2007
vor 16 Jahren

Da war ich wohl etwas schnell mit meinem "Hat alles funktioniert"^^

Auf meinem Vista-Rechner funktioniert der Zugriff auf die Öffentlichen Ordner einwandfrei.

Aber auf meinem XP-Rechner bekomme ich eine Fehlermeldung. Die Exception wird immer bei adapter.Fill(result); ausgelöst

"Es wurde versucht im geschützten Speicher zu schreiben oder zu lesen. Dies ist häufig ein Hinweis darauf, dass anderer Speicher beschädigt ist"

Google weiss nichts dazu.

Dann habe ich mir mal den Spass gemacht und das ganze auf unserem Terminal Server probiert und da bekomme ich dann folgende Meldung:

"Für mindestens einen erforderlichen Parameter wurde kein Wert angegeben."

Das spricht eigentlich für einen fehlerhaften SQLString, der aber auf dem anderen Rechner ja einwandfrei funktioniert.

Hat jemand von euch schon mal solche Fehlermeldungen in diesem Zusammenhang gehabt?

T
16 Beiträge seit 2007
vor 16 Jahren

also bei mir funktioniert das wunderbar. danke für die hilfe

eine kleine frage hätt ich da noch... wenn ich die mails abfrage, zeigt er mir nicht den text der mail an. wie kann ich das ändern?

Rainbird Themenstarter:in
3.728 Beiträge seit 2005
vor 16 Jahren
Sensibles Outlook

Outlook ist ziemlich sensibel und außerdem die Office-Anwendung mit den meisten Bugs. Der OLEDB-Zugriff auf Outlook wird von Microsoft auch eher stiefmütterlich behandelt.

Deshalb bin ich davon mittlerweile eher abgekommen. Als Alternative gibt es z.B. Redemption RDO (http://www.dimastr.com/redemption/rdo/default.htm). Ist zwar eine COM-Komponente, funktioniert aber auch sehr gut mit .NET.
Natürlich kann man auch direkt auf den Exchange Server zugreifen. Beim Exchange Server 2000/2003 geht das übers WebDAV-Protokoll (http) und beim Exchange Server 2007 über dessen SOAP-Webservices.

Bevor also jemand graue Haare wegen des OLEDB-Zugriffs auf Outlook bekommt, sollte er lieber einen anderen Weg nehmen. Das soll nicht heißen, dass OLEDB-Zugriff grundsätzlich schlecht ist, aber ich würde es z.B. nie für eine Anwendung einsetzen, die bei vielen verschiedenden Kunden mit unterschiedlichen Konfigurationen, Office-Versionen und dergleichen laufen muss.

T
16 Beiträge seit 2007
vor 16 Jahren

hm... merkwürdige sache das...

wenn ich mir selbst eine mail schreibe, kann ich den text sehen...
bei nem auto delivery seh ich den text nicht... warum?

ich benutze zum filtern des nachrichtentextes die eigenschaft NAchrichtentext (hm macht sinn oder 😉 warum dieser unterschied?)

T
16 Beiträge seit 2007
vor 16 Jahren

ok. grad rausgefunden warum.... bei den normalen mails ist der text tatsächlich text.. bei den anderen ist der text anhang, der im textfeld eingeblendet ist... erklärt einiges... nur wie greife ich darauf zu?

|
3 Beiträge seit 2007
vor 16 Jahren

hallo!

Wie würde das aussehen wenn ich nicht auf die EMails zugreifen will sondern auf die Kontaktdaten?

N
59 Beiträge seit 2008
vor 16 Jahren

Zu welcher Variante würdet ihr greifen, wenn ihr die Email mit allen Formatierungen (Schriftart, Fett, Kursiv, ...) auslesen wollt? Geht das überhaupt?

/edit

hat sich erledigt

S
21 Beiträge seit 2008
vor 15 Jahren

Hi zusammen

ich habe den Code bei mir auch abgewandelt im Einsatz, angepasst auf meine Bedürfnisse, funktioniert auch wunderbar für das was ich brauche.

Allerdings: Ich habe das Problem, dass ich die Spalte "Ungelesen" nicht gefüllt bekomme. Weiß jemand, wie ich über diesen Weg an die Info komme, ob eine Mail im gelesenen oder ungelesenen Zustand ist?

Exchange-Server 2003

Ich brauche nur die Ungelesenen Mails eigentlich

Wäre schön wenn jemand was weiss, oder nen alternativen Weg, wie ich in einer C#(WPF)-Anwendung an die ungelesenen Mails des Posteingangs eines Postfaches (Exchange) komme. Ich hab mich mit der Sache befasst, und die Lösung "Redemption" ist als Fremd-Dll bei mir in der Firma eher nicht angesagt, leider. Alles so stocksteif 😦

gruß

B
58 Beiträge seit 2008
vor 14 Jahren

Hi, ich habe zu diesem Programm auch einige Fragen!

  1. Greife ich damit wirklich auf Outlook zu? oder auf den Exchange Server???
  2. Wie kann ich auf den Exchangeserver zugreifen falls ich das nicht schon tue?
  3. Wie kann ich einen einen Servernamen auswählen und kann ich das Überhaupt?
  4. Kann ich das auch so machen, dass ich Username und Passwort über eine Form eingeben muss? Wenn ja, wie in etwa?