Entwickler-Ecke

Sonstiges (Delphi) - Outlook: "Ein Programm versucht .... "


bbfan - Mi 06.04.05 10:02
Titel: Outlook: "Ein Programm versucht .... "
So .... habe es geschafft ein Outlook Addin zu programmieren.
Läuft alles auch so weit ganz gut, doch wenn ich mein Postfach Emailadressen durchsuchen lasse, dann kommt folgende Meldung :
"Ein Programm versucht .... " Ihr kennt das ja.

http://www.outlookcode.com konnte mir nicht helfen. Wie kann ich diese Meldung umgehen, besser: Wie bekomme ich es hin, das mein Code als TrustedCode aufgenommen wird?

Bei den ganzen Hilfen von MS stösst man immer wieder auf VB Codes, aber wie geht das in Delphi?

Sobald ich bei MailItem.sendername oder über .sender.adress gehe, erscheint diese Meldung.

Es muss doch gehen einen trusted Anwendung zuschreiben. PALM Software kann es doch auch und SPAM Software.

Bin jetzt schon 2 Tage auf der Suche und finde nichts gescheites.

Bin um jeden Tip dankbar!

Ich benutze folgenden Code um die Emailaddress auszulesen:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
begin
  objCDO := CreateOLEObject('MAPI.Session');
  objCDO.Logon('''', False, False);
  objMsg := objCDO.GetMessage(itemOL.EntryID, itemOL.Parent.StoreID);

   s := objMsg.Sender.Address;
   showmessage(s);
   objMsg := UnAssigned;
   objCDO := UnAssigned;
end


Moderiert von user profile iconTino: Code- durch Delphi-Tags ersetzt.


Lossy eX - Mi 06.04.05 11:17

Also unter Delphi 5+ gibt es bereits vorgefertigte Serverkomponenten. Mit denen man sehr einfach auf Outlook zuzugreifen kann. Anderfalls würde ich dir mal das Objekt "Outlook.Application" ans Herz legen wollen. Ich denke nämlich mal, dass die Frage ob du das darfst von dem MAPI Objekt stammt.

PS: Du kannst auch eine Outlook Typbiliothek importieren falls du die Serverkomponenten nicht hast.


bbfan - Mi 06.04.05 11:27

Einen Outlook Server benutzt meine Komponente schon.
Im OnConnection Event wird das aktuelle OutlookApplcation Object abgelegt.
Aber wie bekommen ich jetzt zugriff drauf? Es ja OLEVariant....


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
procedure TTrebaxaOutlAddin.OnConnection(const Application: IDispatch;
  ConnectMode: ext_ConnectMode; const AddInInst: IDispatch;
  var custom: PSafeArray);
var i : integer;
begin
  FApplication:=Application; // <- OutlookObject wird geholt
  FOutlookApplication:=TOwnOutlookApplicaiton.Create(Application);
  FOutlookApplication.OnOptionsPagesAdd:=OnOptionsPagesAdd;
  FInspectors:=TOutlookInspectors.Create(FApplication.Inspectors);
  FInspectors.OnNewInspector:=OnNewInspector;
  for i:=1 to FApplication.Inspectors.Count do begin
    OnNewInspector(FInspectors, IDispatch(FApplication.Inspectors.Item(i)) as _Inspector);
  end;
  FExplorers:=TOutlookExplorers.Create(FApplication.Explorers);
  FExplorers.OnNewExplorer:=OnNewExplorer;
  for i:=1 to FApplication.Explorers.Count do begin
    OnNewExplorer(FExplorers, IDispatch(FApplication.Explorers.Item(i)) as _Explorer);
  end;
end;


Moderiert von user profile iconTino: Code- durch Delphi-Tags ersetzt.


tempme - Mi 06.04.05 11:35

Microsoft hat mit Outlook 2000 SP2 und Outlook 2002/XP SP1 ein Objektschutzmodel eingeführt.
Dieses Model verhindert den ungewollten Zugriff auf sensible Daten wie z.B. Emailadresse.
Mir sind drei Möglichkeiten bekannt um die Meldung nicht aufpoppen zu lassen:

1. Safe MAPI Calls
- Microsoft hat diese Schnittstelle mit dem Objektschutzmodel nicht aktualisiert.
2. Redemption [http://www.dimastr.com/redemption]
- Redemption ist ein Wrapper für die oben genannten Safe MAPI Calls. Für privaten Gebrauch kostenlos.
3. Exchange
- Sofern Outlook über Exchange angebunden wird, besteht auch die Möglichkeit ein Zertifikat auf dem Exchange Server freizuschalten und somit dem COM-AddIn einen Trust zu gewähren.

Nähere Information befinden sich im Buch das von http://www.outlookcode.com angeboten wird.


bbfan - Mi 06.04.05 11:47

Dort habe ich nachgelesen, dass AddIns, die unter Adminrechten installiert werden, trusted addins sind.

Mein Weg wäre:

1. Hole das OutlookApplication object bei dem OnConnection event (=trusted OL Object)
2. Wandele diese um in eine TOutlookApplication

Dann könnte man drüber zugreifen.

Allerdings komme ich damit nicht weit. Die Zuordnung klappt nicht:


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
var olll:TOutlookApplication
OwnApplication : OLEVariant; // <- kommt aus dem OnConnection event und beinhaltet die trusted OutlookAppl.

olll.Assign((OwnApplication AS TOutlookApplication));
oder 
olll := (OwnApplication AS TOutlookApplication)


Moderiert von user profile iconraziel: Code- durch Delphi-Tags ersetzt.


tempme - Mi 06.04.05 12:07

Kannst du mal bitte ein Link zu dem Beitrag posten wegen den Adminrechten und dem Trust?
Oder ein Verweis woher du es weisst?

Laut dem Entwickler von Redemption und den Verfasser des Buches "Microsoft Outlook Programming" sind es wirklich nur diese drei Möglichkeiten.


bbfan - Mi 06.04.05 12:12

ja, ich versuche es noch mal zu finden...

Kannst du mir die Hilfe zu "Safe MAPI Calls " geben?


tempme - Mi 06.04.05 12:20

Leider nicht,
ich habe mich für Redemption entschieden.

Dmitry, der Entwickler von Redemption, hat mir für MAPI damals folgendes Buch empfohlen:
ISBN: 1572313129


bbfan - Mi 06.04.05 12:23

Ok. Danke.

Ursprünglich brauchte ich eigentlich nur die reale Absender Email Adresse aus einem Mailitem. Mehr nicht....
Gibt es denn da keine Lösung? Kann doch nicht so schwer sein....


tempme - Mi 06.04.05 12:37

Könntest du bitte mir noch sagen ob Outlook bei dir über Exchange angebunden ist oder als "stand-alone" Client läuft?
Und welche Outlook Version du einsetzt?


bbfan - Mi 06.04.05 13:18

Ich benötige es für beides, also Exchange und Standalone.
Wichtig wäre aber erstmal Standalone.

Benutze Outlook 2002 und 2003


nelle - Mi 06.04.05 13:46

In der Microsoft Developers Network kannst Du den Artikel How to Prevent the VBA Macro Security Warning in Microsoft Outlook 2000 [http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dnout2k/html/oldigitalsignature.asp] finden. Hier wird beschrieben, dass es auch möglich ist, sich selbst ein Zertifikat auszustellen mit dessen Hilfe ein "trusted" Code signiert werden kann.

Nelle


bbfan - Mi 06.04.05 14:14

das ist aus meiner Sicht viel zu aufwendig.
Es sollte doch möglich sein aus einem MailItem die Emailadresse auszulesen, ohne eigene Zertifikate dafür zu erstellen und zu installieren.


Delete - Mi 06.04.05 14:19

user profile iconbbfan hat folgendes geschrieben:
das ist aus meiner Sicht viel zu aufwendig.
Es sollte doch möglich sein aus einem MailItem die Emailadresse auszulesen, ohne eigene Zertifikate dafür zu erstellen und zu installieren.

Microsoft sieht das wohl etwas anders und das mit Recht.


bbfan - Mi 06.04.05 14:39

Das mag sein. ist aber keine Lösung.

Laut MSN ist das die Lösung für VB. Dies Code erzeugt KEINE Warnmeldung!


Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
Sub TrustedCode()
    Dim olApp As Outlook.Application
    Set olApp = Application
    Dim oMail As Outlook.MailItem
    Set oMail = _
        olApp.Session.GetDefaultFolder(olFolderInbox).Items(1)
    MsgBox oMail.SenderEmailAddress, vbInformation
End Sub


Jetzt brauche ich sowas für Delphi... 1:1 kann man es nicht übernehmen.... klar..


nelle - Do 07.04.05 09:03

@bbfan:
Dein gefundener VB Quellcode funktioniert mit Delphi (getestet mit D7) so:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
procedure TrustedCode();
const
  olFolderInbox = 6;
var
  olApp : OleVariant;
  oMail : OleVariant;
  sAddress : String;
begin
  olApp:= GetActiveOleObject('Outlook.Application');
  oMail:=olApp.Session.GetDefaultFolder(olFolderInbox).Items.Item(1);
  sAddress:=oMail.SenderName;//SenderEmailAddress
  Application.MessageBox( PAnsiChar(sAddress),
                          'Information',
                          Windows.MB_OK+Windows.MB_ICONINFORMATION);
  oMail:= Variants.Unassigned;
  olApp:= Variants.Unassigned;
end;


Wie Du feststellen wirst, habe ich nicht oMail.SenderEmailAddress verwendet. Diese Eigenschaft gibt es (zumindest bei Outlook 2000) nämlich nicht.

Außerdem muss ich Dich enttäuschen: Dies ist kein "Trusted Code", wie Du angenommen hast. OL meldet sich trotzdem mit dem Warnhinweis.

Du musst Deinen Code wohl oder übel digital signieren... :(

Nelle