Outlook: Markierte eMail



  • Hallo!

    Weiß jemand, wie man die aktuell markierte eMail in Outlook auslesen kann?

    Ich bräuchte die eMailadresse der aktuell ausgewählten eMail in Outlook. Kann man das irgendwie auslesen?

    Ich hab ne Outlook.Application - und dann weiter? Mit "CreateItem" könnte ich eine neue eMail erstellen, ich möchte aber keine neue Mail schreiben, sondern auf die aktuell markierte Mail zugreifen...

    tschüss
    Robert



  • ola ist das TOutlookApplication-Object

    __fastcall TForm1::TForm1(TComponent* Owner)
    	: TForm(Owner)
    {
    ola->Connect();
    ns = ola->GetNamespace(WideString("MAPI"));
    }
    

    die Mailadresse aller ungelesenen Mails werden in einer Listbox (lb3) angezeigt

    void __fastcall TForm1::Button2Click(TObject *Sender)
    {
    FoldersPtr pFolders ;
    MAPIFolderPtr pFolder, pFolder2;
    MailItemPtr pMI;
    ItemsPtr pItms;
    
    ns->Logon("", "", False, False);
    pFolders = ns->Folders;
    pFolder = ns->GetDefaultFolder(olFolderInbox);
    pFolder->Display();
    
    int NewMail = 0, UnsentMail = 0;
    NewMail = pFolder->UnReadItemCount;
    if (NewMail > 0)
    	{
    	ShowMessage("Ungelesene Mails im Posteingang: " + IntToStr(NewMail));
    	pItms = pFolder->Items;
    	for (int i=1; i<=pItms->Count; i++)
    		{
    		v = Variant(i);
    		pMI = pItms->Item(v);
    		if (pMI->UnRead)
    			{
    			pMI->UnRead = false;
    			String str = pMI->SenderEmailAddress;
    			lb3->Items->Add(str);
    			}
    		}
    	}
    
    pFolder2 = ns->GetDefaultFolder(olFolderOutbox);
    UnsentMail = pFolder2->Items->Count;
    if (UnsentMail > 0) ShowMessage("Ungesendete Mails im Postausgang: " + IntToStr(UnsentMail));
    
    ns->Logoff();
    ola->Quit();
    ola->Disconnect();  
    }
    

    und in den Header:

    private:	// Anwender-Deklarationen
      _NameSpacePtr ns;
    

    und hier noch einen Link zu den OutlookKomponenten:
    http://www.officewiki.org/default.aspx/Outlook.OutlookIndex

    Viel Spaß,
    Linnea



  • Hallo Linnea!

    Erstmal vielen vielen Dank für die Antwort!

    Damit kann ich die nicht gelesenen Objekte herausbekommen, das klappt. Gibt's auch ne Möglichkeit, die aktuell markierten Objekte zu erhalten? (also alle markierten, sozusagen die blau unterlegten)

    Zudem _wäre es nicht schlecht_ wenn das ganze mit später Bindung erfolgen könnte, weil ich sonst auf eine bestimmte Version vom Outlook angewiesen bin (stimmt doch, oder??)

    Ich habe folgenden Ansatz:

    Variant OutlookApp, Explorer, Selection;
    
      try
      {
        OutlookApp = GetActiveOleObject("Outlook.Application");
      }
      catch (...)
      {
        try
        {
          OutlookApp = CreateOleObject("Outlook.Application");
        }
        catch (...)
        {
          ShowMessage("Outlook nicht installiert");
        }
      }
    
      try
      {
        Explorer = OutlookApp.OlePropertyGet("Explorers");
    
        //funktioniert nicht:
        Selection = Explorer.OleFunction("get_Selection");
      }
      __finally
      {
      }
    

    Würde mich freuen, wenn man mir helfen kann 🙂

    tschüss
    Robert



  • Hallo!

    Weiß denn keiner, wie das geht?
    In Outlook gibt's da wohl irgendwo die Eigenschaft "Selection", ich weiß aber nicht, wie ich darauf im C++Builder zugreifen kann...

    Würde mich sehr freuen, wenn jemand ne Lösung anbieten könnte...

    tschüss
    Robert



  • Hiermit müßte der Zugriff auf die markierten Mails möglich sein

    ExplorerPtr pExp;
    SelectionPtr pSel;
    
    Variant v = Variant(1);
    //ein Outlookfenster auswählen
    pExp = ola->Explorers->Item(v);
    //und aktivieren
    pExp->Activate();
    pSel = pExp->Selection;
    
    for (int i=1; i<=pSel->Count; i++)
    	{
    	v = Variant(i);
    	pMI = pSel->Item(v);
    	String str = pMI->Subject;
    	lb3->Items->Add(str);
        }
    

    man kann über

    ExplorersPtr pExps;
    ExplorerPtr pExp;
    
    pExps = ola->Explorers;
    
    for (int i=1; i<=pExps->Count; i++)
    	{
        if (pExps->Activate()) 
            {
            Variant v = Variant(i);
            pExp->Item(v);
            }
        }
    

    auch nur auf das aktive Outlook-Fenster zugreifen

    zur späten Bindung hab ich nur nen Delphi-Link http://www.delphi-source.de/tipps/COM_OLE_DDE/?id=35

    Grüße
    Linnea



  • Hallo Linnea!

    Vielen, vielen Dank!!!
    Hat mir sehr geholfen, Danke!!

    Der Vollständigkeit halber, das ganze nochmal mit später Bindung:
    (für den Fall, dass mal irgendjemand über die Suche drauf stoßt...)

    Variant ola;
      try
      {
        ola = GetActiveOleObject("Outlook.Application");
      }
      catch (...)
      {
        try
        {
          ola = CreateOleObject("Outlook.Application");
        }
        catch (...)
        {
          ShowMessage("Outlook nicht installiert");
        }
      }
    
      Variant pExp;
      Variant pSel;
      Variant pMI;
    
      Variant v = Variant(1);
      //ein Outlookfenster auswählen
      pExp = ola.OlePropertyGet("Explorers").OleFunction("Item", v);
      //und aktivieren
      pExp.OleFunction("Activate");
      pSel = pExp.OlePropertyGet("Selection");
    
      for (int i=1; i<=pSel.OlePropertyGet("Count"); i++)
      {
        v = Variant(i);
        pMI = pSel.OleFunction("Item", v);
        String str = pMI.OlePropertyGet("SenderName");
        lb3->Items->Add(str);
      }
    

    Danke nochmal & tschüss
    Robert


Anmelden zum Antworten