![]() |
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! |
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 ![]() Grüße vom marabu |
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? |
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 |
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: ![]() Und dann noch die MAPI Services von Evocorp ![]() 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:
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.
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; 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. |
Re: Email Adresse des Senders über MAPI holen
Liste der Anhänge anzeigen (Anzahl: 1)
So, hier die versprochene Version:
Zuerst die ![]() 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. |
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 |
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. |
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? |
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. |
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 :?: |
Re: Email Adresse des Senders über MAPI holen
Du könntest Outlook mittels
![]() Grüße vom marabu |
Re: Email Adresse des Senders über MAPI holen
und wo bekomm ich den pfad her?
soll ja auf möglichst vielen systmem laufen? |
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; |
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? |
Re: Email Adresse des Senders über MAPI holen
So etwas könnte klappen:
Delphi-Quellcode:
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.
var
hOutlook: HWND; begin hOutlook := FindWindow('Outlook', nil); if hOutlook = 0 then begin // Outlook muss geöffnet werden end; end; |
Re: Email Adresse des Senders über MAPI holen
Zitat:
|
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 |
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? |
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. |
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. |
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 |
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 |
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 |
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 |
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 10:25 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz