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
Kannst du mir sagen wie du auf die Unterordner des Posteingangs zugreifen kannst?
Gruß
ASP.NET Power
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");
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
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
Vielen Dank für deine Antwort. Hat genauso funktioniert.
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
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?
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?
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.
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?)
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?
hallo!
Wie würde das aussehen wenn ich nicht auf die EMails zugreifen will sondern auf die Kontaktdaten?
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
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ß
Hi, ich habe zu diesem Programm auch einige Fragen!