![]() |
Delphi-Version: 2007
MAPI Schnittstelle zu Outlook 2016 und höher
Hallo,
ich habe Probleme mit einer Verbindung zu Outlook 2016 und höher. Soll angeblich daran liegen, dass Outlook2016 nur noch MAPI/http aber nicht mehr MAPI/RPC unterstützt. Leider konnte ich keine Dokumentation finden, mit der ich weiter kommen. Ich brauche eine Möglichkeit Mails über Outlook zu senden und eine Möglichkeit Mails aus einem bestimmten Ordern von Outlook zu übernehmen. Unten ein Beispiel, wie ich aktuell auf Outlook zugreife um Mails aus einem bestimmten Ordner abzuholen. Das funktioniert bisher wie es soll, aber ab Outlook 2016 nicht mehr. Was gibt es für Alternativen, bzw. wie kann ich das gleiche für neuere Outlookversionen erreichen? Wäre super, wenn mir jemand weiter helfen könnte. Ich verwende Delphi 2007 und Delphi XE 10.1 Berlin.
Delphi-Quellcode:
uses
......, Outlook2000; procedure mailimport; var inboxfolder, importfolder : mapifolder; Outlook : TOutlookapplication; items : _items; begin ..... Outlook := TOutlookapplication.create (self); if assigned (Outlook) then begin try inboxfolder := outlook.getNamespace ('MAPI').GetDefaultFolder (olfolderinbox); if assigned (inboxfolder) then begin i := 1; while (i <= inboxfolder.Folders.Count) and not assigned (importfolder) do begin if uppercase (inboxfolder.Folders.Item(i).Name) = 'IMPORT' then importfolder := inboxfolder.Folders.Item(i) else inc (i); end; if assigned (importfolder) then begin items := importfolder.Get_Items; i := items.Count; while i > 0 do begin if items.item(i).QueryInterface(_mailitem, opmi) = s_ok then begin mi := items.item(i) as mailitem; mi.Subject, mi.Body, etc. in Datenbank speichern mi.Delete; mi := nil; if items.count < i then i := items.Count; end; dec (i); end; end; end; except end; Outlook.free; end; end; |
AW: MAPI Schnittstelle zu Outlook 2016 und höher
Hallo.
Ich verwende aktuell ActiveX/OLE und bin damit ganz zufrieden. Es geht alles was ich brauche. Mailbody is HTML, eingebettete Bilder sind möglich, etc... auch ;-) Das einzige was an braucht ist Outlook lokal installiert. Die Outlook App reicht.
Delphi-Quellcode:
Outlook: OLEVariant;
MailItem: Variant; MailInspector : Variant; Recipient: Variant; begin try Outlook := GetActiveOleObject('Outlook.Application'); except Outlook := CreateOleObject('Outlook.Application'); end; try MailItem := Outlook.CreateItem(0); // 0 = mail folder .... end; |
AW: MAPI Schnittstelle zu Outlook 2016 und höher
Danke erstmal für die Antwort.
Ich meine mich erinnern zu können, dass ich das auch mal so gemacht habe. Aus einem mir nicht mehr erinnerlichem Grund habe ich das dann auf die aktuelle Art geändert. Und das funktioniert auch mit Outlook 2016, 2019 und 365? Ich werde es mal probieren. Lokales Outlook ist da wo ich das brauche eh installiert. Sollte also kein Problem sein, |
AW: MAPI Schnittstelle zu Outlook 2016 und höher
Outlook 2019 habe ich auf meinem Rechner am rennen und mit 365 geht es auch. Das verwenden meine Anwender.
Bei älteren Versionen habe ich auch MAPI bevorzugt. Da war ActiveX ein nicht zu gewinnender Kampf. MAPI läuft auf Win10 nicht mehr rund. Irgendwie hat die Schnittstelle weniger Funktionen als vorher und MAPI CDO konnte ich nicht installieren. Ich habe noch POP3/SMTP via Komponente von /NSoftware drinne. |
AW: MAPI Schnittstelle zu Outlook 2016 und höher
Super. Vielen Dank. Ich probiere es mal aus. Bei mir habe ich Outlook 2007 installiert. Damit geht es schon mal. Ältere Versionen hat von meinen Anwendern keiner mehr. Jetzt muss ich es nur noch auf 2016, 2019 und 365 probieren.
Vielen Dank nochmal. |
AW: MAPI Schnittstelle zu Outlook 2016 und höher
Wir hatten uns nach ewigem Krampf mit der MAPI eine Konsolenanwendung gebastelt.
C# .NET und mit den Mailschnittstellen der Microsoft.Office.Interop.Outlook.dll darin, die zum Office des selben Herstellers gut funktionieren. In der Anwendung gibt es dann eine Option, wo zwischen MAPI und dieser ConsolenApp gewählt werden kann. |
AW: MAPI Schnittstelle zu Outlook 2016 und höher
Liste der Anhänge anzeigen (Anzahl: 1)
Bei mir hat ein kleiner Eingriff in die Registry geholfen - siehe angefügten Schnipsel. Da ist Microschrott wohl mit 32 und 64 bit durcheinander geraten.
|
AW: MAPI Schnittstelle zu Outlook 2016 und höher
Danke schon mal für die Antworten. Ich bin gerade dabei was auszuprobieren. Funktioniert auch schon teilweise.
Was mir fehlt ist einfach eine Referenz, wo ich die ganzen Variablen finde, die ich abfragen kann. Strg-Leertaste liefert bei OLEVariant nichts. Ich habe mir mal was aus Fundstücken im Netz zusammen gebastelt. Ich weiß da wo die ???? sind nicht wie ich zu den entsprechenden Daten komme. Wären auch noch weitere interessand wo replyto, etc. Wo finde ich eine komplette Aufzählung aller möglichen Daten, die ich aus dem OLEVariant eMail bekomme? Das gleiche interessiert mich auch für die übrigen Variants, wie Inbox und z.B. importfolder. Bitte fehlende Fehlerbehandlung und Aufräumarbeiten ignorieren. Ist nur quick and dirty, um die Funktionsweise zu testen.
Delphi-Quellcode:
function getEmails(var Subject, Sender, Adress, CC, BB, Body, Attachment : string):boolean; var oleOutlook : OLEVariant; oleNameSpace : OLEVariant; importfolder : OLEVariant; Inbox : OLEVariant; eMail : OLEVariant; i : integer; ok : boolean; begin Result := False; CoInitialize(NIL); try oleOutlook := GetActiveOleObject('Outlook.Application'); except oleOutlook := CreateOleObject('Outlook.Application'); end; try oleNameSpace := oleOutlook.GetNameSpace('MAPI'); ok := false; Inbox := oleNameSpace.GetDefaultFolder(olFolderInbox); i := 0; while i < Inbox.Folders.Count do begin if uppercase (Inbox.Folders[i+1].Name) = 'IMPORT' then begin importfolder := Inbox.Folders[i+1]; ok := true; i := Inbox.Folders.Count; end; end; if ok and (importfolder.Items.Count > 0) then begin email := importfolder.Items (1); Subject := eMail.Subject; // Sender := eMail.from; ????? Wie kriege ich den Absender Adress := eMail.to; cc := eMail.cc; bb := eMail.bcc; body := eMail.body; // Attachment := eMail.Attachments.text; ????? Wie kriege ich eine Liste der Anhänge Result := TRUE; email.delete; end; except end; oleOutlook := NULL; end; |
AW: MAPI Schnittstelle zu Outlook 2016 und höher
Zitat:
Zitat:
![]() |
AW: MAPI Schnittstelle zu Outlook 2016 und höher
Super. Vielen Dank. Das habe ich gesucht. Werde mich da mal durchkämpfen.
|
AW: MAPI Schnittstelle zu Outlook 2016 und höher
Eine weiter Möglichkeit wär die Unit C:\Program Files (x86)\CodeGear\RAD Studio\5.0\OCX\Servers\OfficeXP.pas einzubinden und TOutlookApplication zu verwenden.
Ich benutze die Version von 10.4 und Office2016 und die Strg-Leertaste funktioniert hier. |
AW: MAPI Schnittstelle zu Outlook 2016 und höher
Zitat:
![]() Die MS Hilfe hat dann geholfen um den ganzen rest rauszufinden. |
AW: MAPI Schnittstelle zu Outlook 2016 und höher
Zitat:
Das funktioniert auch sehr gut und nach meinen Tests der letzten Tage funktioniert das sogar mit Oultook365. Dachte zuerst es würde mit neueren Versionen nicht mehr funktionieren. Diese falsche Annahme war die Ausgangslage für meine Frage hier. Was mir mit TOutlookApplication noch fehlt ist das Ermitteln der richtigen E-Mailadresse des Absenders, wenn es über Exchange geht. Da kommt dann für den Absender sowas in der Art /O=EXCHANGELABS/OU=EXCHANGE ADMINISTRATIVE GROUP (FYDIBOHF11SPDLT)/CN=RECIPIENTS/CN=5D7A5C8C23DE4B74B4C8D8D80E510C80-MAILBOX1 Mit den OLEVariants konnte ich das mit
Delphi-Quellcode:
in die korrekte E-Mailadresse umwandeln. Bei TOutlookApplication fehlt mir das. Zumindest habe ich es noch nicht entdeckt.
if (email.SenderEmailType = 'EX') then
begin Sender := email.sender; if not VarIsNull (sender) then begin exchUser := sender.GetExchangeUser; if not VarIsNull (exchUser) then Absender := exchUser.PrimarySmtpAddress; end; end; |
AW: MAPI Schnittstelle zu Outlook 2016 und höher
Zitat:
Ja, die MS Hilfe habe ich jetzt die letzten Tage auch genutzt. Da steht im Prinzip alles drinnen. Das hat mir sehr geholfen. |
AW: MAPI Schnittstelle zu Outlook 2016 und höher
Kurzes feedback.
Dank eurer Hilfe konnte ich nun alles so erledigen, wie ich es mir vorstelle. Eine kleine Hürde musste ich noch überwinden und für den Fall, dass auch mal jemand in die Problematik kommt, hier eine kurze Erklärung dazu. Ich habe meine Importfunktion nun so erweitert, dass ich sämtliche Konten, die in Outlook angelegt sind, durch gehe und in die Posteingangsordner aller dieser Konten schaue, ob es da einen Unterordner mit einem bestimmten Namen gibt. Gibt es diesen, dann importiere ich alle Emails die darin enthalten sind. Als ich das hatte, kam beim Import plötzlich eine Fehlermeldung, dass es in dem OLEObjekt keine Eigenschaft CC und BCC gibt. Nach mühsamer Testerei bin ich dann dahinter gekommen, dass es bei Mails, die ich aus einem IMAP Konto hole, tatsächlich kein CC und BCC gibt. Warum das so ist, erschließt sich mir nicht ganz, aber ich habe das pragmatisch gelöst, indem ich nur Mails aus POP3 und Exchange Konten importiere. Alles andere wird ignoriert.
Delphi-Quellcode:
So funktionert es nun einwandfrei und mit der Einschränkung kann ich leben.
if not VarIsNull (Account) and ((Account.AccountType = 0) or (Account.AccountType =2)) then // olExchange, olPop3
Eventuell hat ja wer einen Hinweis für mich, der erklärt warum es in IMAP Konten bei einem Mail-Objekt kein CC und BCC gibt. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 19:30 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