Outlookzugriff mit dem BCB
-
hi,
Variant OutlookMail = outlook.OleFunction("CreateItem", (Variant)0); OutlookMail.OleProcedure("Display"); //das du auch das erzeugte EMail siehst
mfg VergissEs
-
DAAANKE für die vielen Tipps.
Ich kann jetzt Mails schreiben, 1000e Kontakte automatisch anlegen,
Termine Schreiben ...aber, wenn ich eine Kontakt schreibe, möchte ich vorher überprüfen, ob es schon einen gleichen Eintrag gibt?
wie kann ich per "Ole" auf die Einzelnen Elemente z.B. von Kontakte zugreifen?
ich würde dann eine Schleife durchlaufen lassen, um zu überprüfen, ob schon ein gleicher Datensatz vorhanden ist.
Vielen Dank für eure Hilfe!
-
Hi,
schau mal auf http://community.borland.com/article/0,1410,26053,00.html
ist zwar für die EMails gedacht aber mit ein wenig umschreiben müsste es auch mit den Kontakten funktionieren.
Downloaden kannst Du das Beispiel bei
http://codecentral.borland.com/codecentral/ccweb.exe/listing?id=16437mfg
VergissEs
-
Danke für die Tipps,
ich möchte aber gern mit ole-functionen beispielsweise die Kontakte auslesen?
hab leider noch keinen festen Anhaltspunkt!Danke für eure Hilfe!
MG
-
Hier ist ein ausführliches Beispiel. Allerdings wird nur gerade die erste Ordnerebene untersucht, das heisst, Kontakte im Root 'Kontakte' werden nicht berücksichtigt.
Sollte eigentlich funktionieren... Habe eben gerade letzte Woche ein Synchronizations Tool geschrieben...const int olFolderCalendar = 0x09; const int olFolderContacts = 0x0A; const int olFolderNotes = 0x0C; const int olAppointment = 0x1A; const int olContact = 0x28; const int olNote = 0x2C; void retriveContacts () { Variant outlook; Variant nameSpace; Variant contactFolder; Variant folder; Variant items; Variant contact; int i,k; int nContact; int nFolders; int contactClass; try { outlook = CreateOleObject("Outlook.Application"); nameSpace = outlook.OleFunction("GetNameSpace", "MAPI"); contactFolder = nameSpace.OleFunction ("GetDefaultFolder", olFolderContacts); folder = contactFolder.OlePropertyGet ("Folders"); nFolders = folder.OlePropertyGet ("Count"); for (k = 1; k <= nFolders; k++) { folder = contactFolder.OlePropertyGet ("Folders", k); items = folder.OlePropertyGet ("Items"); nContact = items.OlePropertyGet ("Count"); for (i = 1; i <= nContact; i++) { contact = items.OleFunction ("Item", i); contactClass = olContact; // --- Office 97 don't have property contactItem.Class try { contactClass = contact.OlePropertyGet("Class"); } catch (...) { } if (contactClass == olContact) { try { .. = contact.OlePropertyGet ("LastName"); .. = contact.OlePropertyGet ("FirstName"); .. = contact.OlePropertyGet ("HomeAddressStreet"); .. = contact.OlePropertyGet ("HomeAddressPostalCode"); .. = contact.OlePropertyGet ("HomeAddressCity"); .. = contact.OlePropertyGet ("EMail1Address"); } catch (EOleSysError &E) { // falls bei Zugriffserlaubnisfrage mit nein geantwortet wird... if (E.ErrorCode == (int)0x80004004) throw; } } } } } catch (...) { // bereinigen, falls es was gibt... throw; } }
Nun habe ich aber auch noch eine heikle Frage: Hier ist guter Rat teuer: Genau dasselbe Prinzip wie oben kann man für die Notizen anwenden. Aber leider leider funktioniert das ab Outlook XP Sp1 oder Sp2 nicht mehr. Outlook stürzt dann mit einer Fehlermeldung ab 'Ausnahmefehler'. Und zwar geschiet der Fehler in der Zeile:
olFolderNotes = 0x0C;
notesFolder = nameSpace.OleFunction ("GetDefaultFolder", olFolderNotes);Bei allen anderen Office Versionen geht es wunderbar, selbst bei Office XP. Aber ab Version SP1 oder SP2 gehts nicht mehr.... Wer weiss da Rat? Ist wohl so ein mieser M$ Bug???
- Adrian
-
Hi,
ersteinmal schönen Dank.
Ich habe das ganze mal bei mir eingebaut.
contactFolder = nameSpace.OleFunction ("GetDefaultFolder", olFolderContacts); folder = contactFolder.OlePropertyGet ("Folders"); nFolders = folder.OlePropertyGet ("Count");
Bei nFolders kommt bei mir IMMER "0" zurück, obwohl ich Elemente in den jeweiligen Outlook-Ordnern stehen habe.
Ich benutze BCB6 und OfficeXP.
Danke für eure Hilfe
-
wie dumm von mir,
ich habe natürlich nur im Root was stehen und das läßt das Programm bei der Abfrage aus!
Habe das Skript für mich angepaßt!!!
DAAAAAAAAAAAAAAAAAAAAAAANKE nochmal für jede Hilfe!
MG
-
Hallo,
wie schaffe ich es, dass auch die Kontakte im Root Verzeichnis gelesen werden.
Momentan kann ich nur die Unterordner auslesen.Vielleicht kann mir jemand helfen.
Danke
-
Hallo,
hier mein Ansatz zum Auslesen des "ROOT"-Verzeichnisses:
Dieser Funktion gibst du den Feldnamen und den Suchbegriff mit und du bekommst die Position des gefundenen Kontakts wieder, auf die du dann wunderbar zugreifen kannst.
Ich hab die Funktion genutzt, um eine eigene Outlook-Syncronisation zu realisieren. ist zwar ein bissel langsam, aber es funktioniert!int __fastcall TForm1::ContactsCheck(TObject *Sender, String field, String matchcode) { Variant contactFolder; Variant folder; Variant items; Variant contact; int i,k; int nContact; int nFolders; int contactClass; int return_pos = -1; try { contactFolder = nameSpace.OleFunction ("GetDefaultFolder", olFolderContacts); items = contactFolder.OlePropertyGet ("Items"); nContact = items.OlePropertyGet ("Count"); for (i = 1; i <= nContact; i++) { contact = items.OleFunction ("Item", i); contactClass = olContact; // --- Office 97 don't have property contactItem.Class try { contactClass = contact.OlePropertyGet("Class"); } catch (...) { } if (contactClass == olContact) { try { if (matchcode == contact.OlePropertyGet(field.c_str())) { return_pos = i; break; } } catch (EOleSysError &E) { // falls bei Zugriffserlaubnisfrage mit nein geantwortet wird... if (E.ErrorCode == (int)0x80004004) throw; } } } } catch (...) { // bereinigen, falls es was gibt... throw; } return return_pos; } //---------------------------------------------------------------------------
zuvor mußt du natürlich mit
outlook = CreateOleObject("Outlook.Application"); nameSpace = outlook.OleFunction("GetNameSpace", "MAPI");
die "Outlook-Session" öffnen
Viel Spaß beim Ausprobieren
Marco
-
Vielen Dank!
Hat funktioniert.
-
VergissEs schrieb:
Hi,
schau mal auf http://community.borland.com/article/0,1410,26053,00.html
ist zwar für die EMails gedacht aber mit ein wenig umschreiben müsste es auch mit den Kontakten funktionieren.
Downloaden kannst Du das Beispiel bei
http://codecentral.borland.com/codecentral/ccweb.exe/listing?id=16437mfg
VergissEsHallo ich habe den obigen Quelltext runtergeladen und wollte das ganze dann starten. Leider bekomme ich folgende Fehlermeldung:
[C++ Fehler] Unit3.cpp(53): E2034 Konvertierung von 'bool' nach 'tagVARIANT' nicht möglich
[C++ Fehler] Unit3.cpp(53): E2342 Keine Übereinstimmung des Typs beim Parameter 'Descending' ('tagVARIANT' erwartet, 'bool' erhalten)wenn ich mir dann den Quelltext in der outlook_2k.h ansehe steht da:
virtual HRESULT STDMETHODCALLTYPE Sort(BSTR Property/*[in]*/, VARIANT Descending/*[in,opt]*/= TNoParam()) = 0; // [97]
die Zeile, die den Fehler auslöst lautet:
pItems->Sort(WideString("[ReceivedTime]"), true )
es gibt noch ähnliche Fehler, einmal mit int kann nicht konvertiert werden und einmal mit char.
Kann mir eine helfen?
-
Hallo zusammen,
wie kann ich auf selbstdefinierte (selbst angelegte) Felder zugreiffen?
Man muss wohl irgendwie über UserProperties dran kommen aber wie?
-
VergissEs schrieb:
Hallo,
wenn ich den Code im oben gennanten Artikel compliere, dann bekomme ich in der Zeile
_NameSpacePtr ns;
folgende Fehlermeldung:
Typname erwartet
Welche Header-Datei muß hier includiert werden?
Danke
-
*schieb*
-
Lies doch den Beitrag mal ganz.... die includes sind mit angegeben...