Outlookzugriff mit dem BCB



  • 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=16437

    mfg
    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=16437

    mfg
    VergissEs

    Hallo 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:

    http://community.borland.com/article/0,1410,26053,00.html

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


Anmelden zum Antworten