Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Email Adresse des Senders über MAPI holen (https://www.delphipraxis.net/61157-email-adresse-des-senders-ueber-mapi-holen.html)

ken_jones 17. Jan 2006 16:39


Email Adresse des Senders über MAPI holen
 
Etwas ganz einfaches und doch so kompliziert...
Ich hab auf meinem System XP und OL2002 installiert. Über MAPI kann ich auf alle Mails zugreifen, die Inhalte holen, etc.
Über SentOnBehalfOfName oder ReplyRecipients komme ich sogar an den Sender er Email ran, SOFERN dieser nicht im Adressbuch steht. Da kommt jetzt mein Problemchen.
Sobald der Sender im Adressbuch steht, ist ReplyRecipients leer und in SentOnBehalfOfName steht nur der Name des Senders drin, nicht aber seine Email Adresse. Warscheinlich muss ich jetzt die Email Adresse aus den Kontakten auslesen oder sowas...

Hat jemand einen Beispielcode zur Hand, wie ich an die Email Adresse des Senders komme? Thx!

marabu 17. Jan 2006 17:38

Re: Email Adresse des Senders über MAPI holen
 
Hi.

Sieht fast so aus, als wärst auch du ein Opfer des OL Object Model Guard - und damit ein Fall für REDEMPTION. Du schreibst zwar MAPI, aber alles deutet daraufhin, dass du die Outlook Automatisierung verwendest.

Grüße vom marabu

ken_jones 17. Jan 2006 20:25

Re: Email Adresse des Senders über MAPI holen
 
Danke, stimmt, ich gehe über die "Outlook.Application" Ole, habs aber auch über MAPI versucht. Im Netz finden sich dutzende von Beispielen, aber die meisten taugen nichts, oder bringen denselben Effekt.
Ok, Redemption scheint ein Lösungsansatz zu sein. Behalt ihn mir mal als Notnagel in Gedanken.

Aber wie macht zum Beispiel der Google Desktopsearch den Zugriff? Der liest aus meinem Outlook2002 die Mails inklusive den Senderemailadressen raus, ohne eine Sicherheitsabfrage oder ähnliches zu generieren. Einzige Voraussetzung, Outlook muss gestartet sein. Wenn Google das schafft, müssen wir das doch auch können, oder ned?

marabu 17. Jan 2006 20:55

Re: Email Adresse des Senders über MAPI holen
 
Google wird das wahrscheinlich genauso machen, wie Redemption - über Extended MAPI. Das ist der Weg, den MS empfiehlt, kompromisslos sicher und versionsunabhängig.

marabu

ken_jones 17. Jan 2006 22:42

Re: Email Adresse des Senders über MAPI holen
 
Yeah, das war das Stichwort! Extended MAPI! Ich depp...

Ich hab mir die neusten MAPI Headers runtergeladen:
MAPI_Headers

Und dann noch die MAPI Services von Evocorp
MAPI Services

Wenn man das ganze nicht als Service ausführen möchte, so muss man noch in den Sources der MAPI Services folgendes ändern:
Bei der Funktion MapiServicesLogOn nur das Flag MAPI_EXTENDED sein lassen, die restlichen löschen.

Und schon kann ich auf alle Daten von Outlook zugreifen, ohne eine Sicherheitsabfrage von Outlook.

Beispielcode:
Delphi-Quellcode:
uses
  MapiServices;
 
procedure DisplayMyMailItems;
var InBox: TInbox;
    MailItem: TMapiMailItem;
begin
  // Insert your actual account name in place
  // of MyAccountName, for instance "Bloggs, Joe"
  InBox := TInBox.Create('MyAccountName');
  try
    MailItem := InBox.GetFirst;
    while Assigned(MailItem) do
    begin
      ShowMessage('From: ' + MailItem.Sender + #13#10 +
                  'Subject: ' + MailItem.Subject);
      // Do what you need to do here
      // ...
      // and then release MailItem.
      MailItem.Free;
      MailItem := InBox.GetNext;
    end;
  finally
    InBox.Free;
  end;
end;
Und wenn man nun mit GetSender (oder MailItem.Sender) lieber die Email statt den Namen haben möchte, so ersetzt man einfach in der GetSender Funktion den Wert PR_SENDER_NAME mit PR_SENDER_EMAIL_ADDRESS.

Das ganze hab ich jetzt aber so schlecht hingeschlurft, dass ich noch kein Codebeispiel von mir uppe. Aber ich säubere mal meinen Code und dann gibts den Code später noch dazu.

Danke marabu, du hast mich auf den richtigen Weg gebracht.

ken_jones 18. Jan 2006 09:22

Re: Email Adresse des Senders über MAPI holen
 
Liste der Anhänge anzeigen (Anzahl: 1)
So, hier die versprochene Version:

Zuerst die MAPI Headers herunterladen.

Dann, anstelle der MapiServices gibts jetzt die leicht modifizierte MapiWrapper.pas dazu.

Und zum Schluss eine Testunit für das ganze:

Delphi-Quellcode:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, Math;

type
  TForm1 = class(TForm)
    bGetMails: TButton;
    mMails: TMemo;
    procedure bGetMailsClick(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}
uses
  MapiWrap;

procedure TForm1.bGetMailsClick(Sender: TObject);
var
  InBox: TInbox;
  MailItem: TMapiMailItem;
begin
  InBox := TInBox.Create('Doe, John');
  try
    MailItem := InBox.GetFirst;
    while Assigned(MailItem) do begin
      mMails.Lines.Add(Format('From: %s <%s>'#13#10'Subject: %s'#13#10'%s'#13#10,
                      [MailItem.Sender,
                       MailItem.SenderEmail,
                       MailItem.Subject,
                       Copy(MailItem.Body, 1, Min(50, Pos(#13, MailItem.Body)))]));
      MailItem.Free;
      MailItem := InBox.GetNext;
    end;
  finally
    InBox.Free;
  end;
end;

end.

meg 5. Apr 2006 15:13

Re: Email Adresse des Senders über MAPI holen
 
hey echt toll was du hier gepostest hast, nur leider kommt bei mir immer eine Fehlermeldung, das ein Fehler beim einloggen in die extended MAPI aufgetreten ist
Soweit ich das gesehen habe hängt das mit dem falschen InBox := TInBox.Create('...'); Eintrag zusammen (also da wo die Punkte sin hab ich wahrscheinlich des falsche reingeschrieben)
Was muss ich da für einen Namen eintragen?

Und wie kann ich da vielleicht eine größere Kombalibilität erreichen, auch ohne diesem Kontonamen oder was immer das ist eintragen zu müssen?

gruß
meg

ken_jones 5. Apr 2006 20:49

Re: Email Adresse des Senders über MAPI holen
 
Tja, in was für eine Art Konto versuchst du dich denn einzuloggen? Outlook? Wenn ja, dann ist dort der Login (also der '...' Ersatz) meistens mit dem Kontonamen identisch. Sprich beim User Beat Muster wäre das meistens "Muster, Beat".

Und um den Kontonamen kommst du nicht herum. Schliesslich muss die Extended Mapi ja wissen, wo sie sich anmelden soll.

meg91 25. Apr 2006 18:17

Re: Email Adresse des Senders über MAPI holen
 
hab das ganze auch mal ausprobiert
nur bei mir muss da Outlook immer an sein sonst kommt ne Fehlermeldung
kann man das auch machen , ohne das Outlook gestartet sein muss?

ken_jones 25. Apr 2006 21:32

Re: Email Adresse des Senders über MAPI holen
 
Da begebe ich mich jetzt auf dünnes Eis, aber ich behaupte mal, dass ohne laufendes Outlook kein Zugriff per Extended Mapi möglich ist. imho stellt Outlook selber die Ressourcen für Login, Abruf, etc. zur Verfügung. GDS (GoogleDesktopSearch) verlangt ebenfalls, dass die Standardmailapplikation gestartet sein muss. Wohl nicht ohne Grund.
Was aber sicher möglich ist, wäre das automatische starten von Outlook vor dem Zugriff.

meg91 26. Apr 2006 19:08

Re: Email Adresse des Senders über MAPI holen
 
und wie ist das möglich?
vllt lässt sich Outlook irgendwie nur als Try Iocon oder so starten :?:

marabu 26. Apr 2006 20:16

Re: Email Adresse des Senders über MAPI holen
 
Du könntest Outlook mittels ShellExecuteAndWaitA() starten, wobei du als Parameter SW_MINIMIZE nimmst.

Grüße vom marabu

meg91 26. Apr 2006 21:14

Re: Email Adresse des Senders über MAPI holen
 
und wo bekomm ich den pfad her?
soll ja auf möglichst vielen systmem laufen?

ken_jones 26. Apr 2006 21:41

Re: Email Adresse des Senders über MAPI holen
 
Probier mal das hier, hab leider kein Outlook auf meinem aktuellen System laufen, deshalb keine Garantie.
So sollte aber Outlook auch ohne Pfad gestartet werden können. Es wird versucht, eine laufende Instanz zu finden, und wenns keine gibt eine zu erstellen.

Delphi-Quellcode:
var Outlook: OLEVariant;
begin
  try
   Outlook:=GetActiveOleObject('Outlook.Application') ;
  except
    try
      Outlook:=CreateOleObject('Outlook.Application') ;
    except
      ShowMessage('Outlook nicht installiert');
    end;
  end;
  Outlook := Unassigned;
end;

meg91 27. Apr 2006 14:51

Re: Email Adresse des Senders über MAPI holen
 
funzt leider nicht
dan kommt immer ein "OLeSyserror" Vorgang nicht verfügbar, aber nur wenn Outlook geschlossen is
keine Ahnung was des heissen soll

hab aber jetzt mal Outlook so gestartet und ich denk das, dass auch auf allen Systemen möglich ist
ShellExecute(0,'open','outlook',nil,nil, SW_MINIMIZE);
nur wie kann ich rausfinden ob des nicht schon offen ist?

ken_jones 27. Apr 2006 21:30

Re: Email Adresse des Senders über MAPI holen
 
So etwas könnte klappen:

Delphi-Quellcode:
var
  hOutlook: HWND;
begin
  hOutlook := FindWindow('Outlook', nil);
  if hOutlook = 0 then begin
    // Outlook muss geöffnet werden
  end;
end;
FindWindow findet das Fenster anhand seines Titels. "Outlook" ist hier nur eine Annahme. Musst prüfen, ob das Fenster wirklich Outlook heisst, sonst funktionierts nicht.

ken_jones 27. Apr 2006 21:36

Re: Email Adresse des Senders über MAPI holen
 
Zitat:

Zitat von meg91
funzt leider nicht
dan kommt immer ein "OLeSyserror" Vorgang nicht verfügbar, aber nur wenn Outlook geschlossen is
keine Ahnung was des heissen soll

Hmm, wo kommt dieser Fehler? Es sind alle Exceptions abgefangen... In der IDE? Falls ja, dann wärs die richtige Exception wenn Outlook nicht gestartet ist. Wenn man das Programm dann weiterlaufen lässt, so sollte er in die Except Klausel fallen und eine neue Instanz zu öffnen versuchen.

Keflock 24. Sep 2008 23:05

Re: Email Adresse des Senders über MAPI holen
 
Hallo zusammen,

habe alles schön umgesetzt, es funktioniert, aber wenn im Body mehr als XY Zeichen (viele, genau wie viele es sind weiß ich nicht) vorkommen, so bleibt SG_Ausgabe.Cells[4,i]:=MailItem.Body; leer, denn im MailItem.Body ist nichts drin. Ich habe bereits alle Sting ind WideString in dem Unit MapiService verändert, leider ohne Erfolg.

Was mache ich falsch, wie bekomme ich große Bodys in eine StringGrid?

Danke,
mfg
Kef

Gebhard 6. Mär 2009 08:19

Re: Email Adresse des Senders über MAPI holen
 
Hallo,

ich habe versucht, "DisplayMyMailItems" zu nutzen und bin auf ein Problem beim Befehl "TInBox.Create" getroffen. Kann mir einer helfen?

Ich arbeite mit:
- Delphi 7.0
- Windows XP mit SP2
- Outlook 2002 mit SP3

Ich nutze den Profilnamen "Default". Diesen Namen habe ich aus dem Dialogfeld übernommen, welches sich öffnet, wenn ich ein Mapi.Logon ohne zusätzliche Argumente durchführe.
Trage ich diesen Profilnamen wie im Beispiel als String ein, erhalte ich vom Compiler die Fehlermeldung "[Fehler] Unit1.pas(68): Inkompatible Typen: 'TMapiConnection' und 'String'".

Jetzt bin ich den Umweg über "TMapiConnection.Create" gegangen. Hier ein Auszug aus dem Quellcode

procedure DisplayMyMailItems;
var
...
MapiConnection:TMapiConnection;
...
begin
...
MapiConnection.Create('Default',false);
...
InBox := TInBox.Create(MapiConnection);
try
MailItem := InBox.GetFirst;
while Assigned(MailItem) do
...

Jetzt erzeugt zwar der Compiler eine Exe-Datei, aber der Aufruf der Procedure endet mit der Fehlermeldung
"A connection was successfully made to the MAPI subsystem, however an unknown error occurred locating one of the mailboxes for profile "Button2"."
Interressant ist hier ..."Button2". Hier steht immer der Name des Steuerelementes, mit dem ich die Procedure aufrufe. In diesem Fall mit "TForm1.Button2Click(Sender: TObject);".

Kann mir jemand sagen, was ich falsch mache?

ken_jones 6. Mär 2009 10:32

Re: Email Adresse des Senders über MAPI holen
 
Hab leider aktuell nur Vista mit Outlook 2007 hier am laufen, ein Test wär auf meiner Maschine sinnlos.

Aber eine Frage vorab, heisst dein Profil wirklich "Default"? Guck mal im Outlook unter "Extras" -> "E-Mail Konten..." -> "Vorhandene E-Mail-Konten anzeigen oder bearbeiten" -> Standardkonto auswählen -> "Ändern..." -> "Benutzername"

Verwende mal diesen "Benutzername" als Profilname.

ken_jones 6. Mär 2009 11:07

Re: Email Adresse des Senders über MAPI holen
 
Liste der Anhänge anzeigen (Anzahl: 2)
So, ich hab meinen alten PC mit XP, Outlook 2002 und Delphi 5 ausgegraben, den Sourcecode zusammengestellt und kompiliert. Und siehe da, ich bekomme sämtliche Emails, sogar wenn Outlook nicht gestartet ist.

Ich hab das komplette Projekt attached, es lässt sich so unter Delphi 5 kompilieren und sollte sich wohl auch unter Delphi 7 so kompilieren lassen.

[EDIT] Attachment auch als .zip hinzugefügt. PS: 7Zip kannste Gratis d/l.

Gebhard 6. Mär 2009 12:55

Re: Email Adresse des Senders über MAPI holen
 
Hallo ken_jones,

als erstes vielen Dank für die große Mühe, die Du Dir gemacht hast.

Deine Vermutung zum Benutzernamen war richtig. Unter "... Standartkonto auswählen..." steht ein anderer Benutzername. Mein Problem scheint aber grundsätzlicher Art zu sein, denn es wird als Benutzername immer der Name des Steuerelementes übernommen, mit dem ich die Procedure "DisplayMyMailItems" aufrufe - egal, welchen Wert ich bei MapiConnection eintrage.

Leider kann ich zur Zeit aus technischen Gründen kein Download auf Deine Dateien durchführen. Sobald der Download bei mir wieder klappt, versuche ich es noch einmal mit Deinem Quellcode.

Schönes Wochenende und Tschüss

Gebhard

Gebhard 6. Mär 2009 15:59

Re: Email Adresse des Senders über MAPI holen
 
Hallo,

leider kann ich Deinen Download "Mapitest.7z" aus dem Betreff "MapiTest, funktionierendes Beispiel, Kompletter Sourcecode für Delphi 5" nicht öffnen. Ich habe kein Programm, welches die Suffix "7z" kennt. Umbennen in "zip" oder das Öffnen mit Notepad bringt auch nichts.

Schade

Viele Grüße

Gebhard

Gebhard 9. Mär 2009 07:43

Re: Email Adresse des Senders über MAPI holen
 
Hallo Ken_jones,

vielen Dank für Deine Script. Er funktioniert hervorragend. Es muss allerdings vorher Outlook gestartet sein, was aber nun wirklich kein Problem ist.

Viele Grüße

Gebhard

ken_jones 9. Mär 2009 13:13

Re: Email Adresse des Senders über MAPI holen
 
Freut mich, klappt somit also auch unter Delphi7.
Das mit dem Outlook hab ich nochmals geprüft. Merkwürdig, obwohl ich selber auch behaupten möchte, dass Outlook gestartet sein muss, funktioniert es auf dem alten PC ohne dass Outlook gestartet ist. Ich hab extra mit dem ProcessExplorer nach Outlook Prozessen gesucht und sogar den PC neu gestartet aber es funktioniert weiterhin ohne laufendes Outlook. Ich kann mir das auch nicht ganz erklären. Vielleicht greift er auf den Exchange Server zu.
Aber egal, hauptsache es läuft :zwinker:

Gruss,
Ken

Gruber_Hans_12345 31. Aug 2010 15:35

AW: Email Adresse des Senders über MAPI holen
 
ich hänge mich hier mal dran ....


Ich versuche gerade folgendes, ich möchte gerne eine Mail per Outlook verschicken, bzw am besten per MAPI.

Die eMail soll aber nicht sofort verschickt werden, sondern im Outlook aufgehen, damit der User den Text noch editieren kann, wenn er will.


Aber irgendwie bringe ich es mit der MapiServices nicht zusammen

Sobald ich das Submit ausführe, wirds gleich verschickt ....

Hat wer eine Idee, wie ich es damit lösen kann?


Alle Zeitangaben in WEZ +1. Es ist jetzt 04:55 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz