Seite 1 von 2
MAPI Schnittstelle für eMails ERLEDIGT
Verfasst: Mo, 20. Mär 2017 14:00
von UliTs
Hallo allerseits,
ich setze seit bald 10 Jahren die MapiDemo.prg ein. Siehe auch:
Martin Altmann hat geschrieben:Hallo Wolfgang,
so habe ich das bei mir eingebunden:
Code: Alles auswählen
snDllHandle := DllLoad( "SocMapi.Dll" )
if snDllHandle == 0
MsgBox("SOCMAPI.DLL nicht gefunden!")
return
endif
//Get Function handles from DLL.
scDLLSocMapiIsInit := DllPrepareCall( snDllHandle, DLL_STDCALL, "SocMapiIsInit" )
scDLLSocMapiInit := DllPrepareCall( snDllHandle, DLL_STDCALL, "SocMapiInit" )
scDLLSocMapiDeInit := DllPrepareCall( snDllHandle, DLL_STDCALL, "SocMapiDeInit" )
scDLLSocMapiIsLoggedOn:= DllPrepareCall( snDllHandle, DLL_STDCALL, "SocMapiIsLoggedOn" )
scDLLSocMapiLogon := DllPrepareCall( snDllHandle, DLL_STDCALL, "SocMapiLogon" )
scDLLSocMapiLogoff := DllPrepareCall( snDllHandle, DLL_STDCALL, "SocMapiLogoff" )
scDLLSocMapiSendMail := DllPrepareCall( snDllHandle, DLL_STDCALL, "SocMapiSendMail" )
scDLLSocMapiPostMail := DllPrepareCall( snDllHandle, DLL_STDCALL, "SocMapiPostMail" )
scDLLInboxOpen := DllPrepareCall( snDllHandle, DLL_STDCALL, "InboxOpen" )
scDLLInboxClose := DllPrepareCall( snDllHandle, DLL_STDCALL, "InboxClose" )
scDLLInboxGoTop := DllPrepareCall( snDllHandle, DLL_STDCALL, "InboxGoTop" )
scDLLInboxSkip := DllPrepareCall( snDllHandle, DLL_STDCALL, "InboxSkip" )
scDLLAskFlag := DllPrepareCall( snDllHandle, DLL_STDCALL, "AskFlag" )
scDLLAskBufferSize := DllPrepareCall( snDllHandle, DLL_STDCALL, "AskBufferSize" )
scDLLStuffBuffer := DllPrepareCall( snDllHandle, DLL_STDCALL, "StuffBuffer" )
scDLLCountRecipients := DllPrepareCall( snDllHandle, DLL_STDCALL, "CountRecipients" )
scDLLCountAttachments := DllPrepareCall( snDllHandle, DLL_STDCALL, "CountAttachments" )
scDLLSaveAttachments := DllPrepareCall( snDllHandle, DLL_STDCALL, "SaveAttachments" )
scDLLMarkAsRead := DllPrepareCall( snDllHandle, DLL_STDCALL, "MarkAsRead" )
//initialize MAPI
if DllExecuteCall( scDLLSocMapiIsInit ) == 0
nErr := DllExecuteCall( scDLLSocMapiInit )
if nErr != 0
MsgBox("MAPI kann nicht initialisiert werden! Errorcode: " + ALLTRIM(str(nErr)) )
return
endif
endif
//if not already logged on, Logon to new MAPI session
if DllExecuteCall( scDLLSocMapiIsLoggedOn ) == 0
if (nErr := DllExecuteCall(scDLLSocMapiLogon)) != SUCCESS_SUCCESS
NotifyError( nErr )
return
endif
endif
.....
BEGIN SEQUENCE
nErr := DllExecuteCall( scDLLSocMapiSendMail , mailadr , ConvToAnsiCP( alltrim( ::Subject:editBuffer() ) ), ConvToAnsiCP( mailtext ), "", NOFLAG )
if nErr != SUCCESS_SUCCESS .and. nErr != MAPI_USER_ABORT
break nErr
endif
RECOVER USING nErr
NotifyError (nErr)
END SEQUENCE
....
//Logoff from MAPI session
DllExecuteCall(scDLLSocMapiLogoff)
Viele Grüße,
Martin
Jetzt wird bei einem Kunden von GroupWise auf Outlook gewechselt. Nachdem auf einigen Rechnern
Office 2016 installiert wurde, wird das Xbase-Programm von Windows beendet sobald versucht wird, eine Mail zu senden.
Kennt jemand anders das Problem? Kennt jemand einen Work Around?
Uli
Re: MAPI Schnittstelle für eMails
Verfasst: Mo, 20. Mär 2017 14:09
von UliTs
Das habe ich noch gefunden:
http://www.xbaseforum.de/viewtopic.php? ... 16#p101031
AUGE_OHR hat geschrieben:...
auf einem 64bit OS() mit Office 64bit funktioniert SocMapi nicht mehr um eine Email in den Post-Ausgang zu legen.
bei RunShell() mit "Mailto:" kann man zwar eine Email in den Post-Ausgang legen aber man bekommt damit kein Anhang ran
nun kann man aber Outlook wohl mit Parametern aufrufen (ungetestet übernommen)
Code: Alles auswählen
OUTLOOK.EXE /c ipm.note /a c:\attach.txt /m "sven@email.com;other@email.com &cc=other2@email.com &bcc=other3@email.com &subject=abc &body=Blah"
...
Re: MAPI Schnittstelle für eMails
Verfasst: Mo, 20. Mär 2017 15:45
von Rudolf
Hallo,
MAPI geht auch mit OT4XB, ist aber glaube ich nicht offizielle da ich dafür etwas zahlen musste, gebe es aber gerne weiter.
Grüße
Rudolf
Re: MAPI Schnittstelle für eMails
Verfasst: Mo, 20. Mär 2017 16:12
von UliTs
Oh, das hört sich gut an
.
Ansonsten versuche ich gerade eine Lösung mittels
zu finden. Mail-Adresse und Betreff klappen schon. Fehlt nur noch der Haupttext und Anhang
.
Uli
Re: MAPI Schnittstelle für eMails
Verfasst: Mo, 20. Mär 2017 16:33
von Bertram Hansen
Hallo Uli,
die Idee mit
funktioniert glaube ich nicht mit Dateianhang.
Re: MAPI Schnittstelle für eMails
Verfasst: Mo, 20. Mär 2017 16:41
von Rudolf
Hallo Uli,
ist unterwegs
Grüße
Rudolf
Re: MAPI Schnittstelle für eMails
Verfasst: Di, 21. Mär 2017 14:45
von UliTs
Bertram Hansen hat geschrieben:Hallo Uli,
die Idee mit
funktioniert glaube ich nicht mit Dateianhang.
Ja, Du hast (teilweise) recht
. Bei manchen Mailprogrammen funktioniert es, bei anderen nicht. Also: diese Lösung ist gestorben.
Ich habe jetzt auf jeden Fall eine Lösung mit Delphi (kann man
mit Delphi auch DLLs generieren, mit denen Xbase++ zurecht kommt?).
Ich schaue mir gleich auch noch Rudolfs Lösung an. Da fehlt mir aber die ot4xb.ch ...
Re: MAPI Schnittstelle für eMails
Verfasst: Di, 21. Mär 2017 15:04
von brandelh
QuickPDF ist auch in Delphi geschrieben, mit PowerBasic werden die generierten DLLs auch zu normalen Windows DLLs, warum sollte das mit Delphi anders sein.
Re: MAPI Schnittstelle für eMails
Verfasst: Di, 21. Mär 2017 15:45
von UliTs
Stimmt, danke. Habe ich ja auch schon selbst geschrieben
.
Jetzt versuche ich aber noch Rudolfs Lösung hinzubekommen.
Aber ich bekomme immer den Fehler
Code: Alles auswählen
ALINK: fatal error ALK4001: cannot open file "ot4xb.lib"
obwohl ich den Pfad richtig in der Project.xpj angegeben habe. Woran kann das liegen?
Uli
Re: MAPI Schnittstelle für eMails
Verfasst: Di, 21. Mär 2017 16:24
von Rudolf
Hallo Uli,
ist die lib im Projektverzeichnis ? Vielleicht irgendwo ein #pragma Library("ot4xb.lib") mit falschen Pfad ?
Grüße
Rudolf
Re: MAPI Schnittstelle für eMails
Verfasst: Di, 21. Mär 2017 16:28
von UliTs
So, sieht gut aus.
Wenn ich die Zeile
aus der ot4xb.ch lösche, funktioniert es
.
Ich vermute, ein BUG in Xbase (da hier nicht der Pfad aus der XPJ-Datei genommen wird).
Morgen mache ich weiter und bringe es hoffentlich zu einem guten Ende
Re: MAPI Schnittstelle für eMails
Verfasst: Di, 21. Mär 2017 16:29
von UliTs
Rudolf hat geschrieben:Vielleicht irgendwo ein #pragma Library("ot4xb.lib") mit falschen Pfad ?
Hallo Rudolf, ja das war die Ursache..
Re: MAPI Schnittstelle für eMails
Verfasst: Di, 25. Apr 2017 14:59
von UliTs
Hallo Rudolph (oder andere),
leider passiert es, dass sich das xBase-Programm je nach Rechnereinstellung sang- und klanglos verabschiedet. Einer der Administratoren setzt dann alle möglichen Standards in GroupWise auf "On" und dann funktioniert es wieder.
In den nächsten Wochen folgt eine Umstellung von GroupWise auf Outlock. Auf dem Testrechner mit Outlock verabschiedet sich das Programm ebenfalls. Allerdings kommt von Windows eine Fehlermeldung:
- "Das Programm wird aufgrund eines Problems nicht richtig ausgeführt. Das Programm wird geschlossen, und Sie werden benachrichtigt, wenn eine Lösung verfügbar ist"
Laut Aussage des Admins sind alle Standars in Office auf "On" gesetzt.
Kennt jemand das Problem und weiß jemand eine Lösung?
Uli
Re: MAPI Schnittstelle für eMails
Verfasst: Di, 25. Apr 2017 15:07
von Rudolf
Hallo Ulli,
bei mir hat es viele Jahre problemlos funktioniert, da könnte sonst nur Pablo helfen. Aber ich denke er braucht dann auch genauere Angaben über den Fehler.
Grüße
Rudolf
Re: MAPI Schnittstelle für eMails
Verfasst: Di, 25. Apr 2017 15:22
von UliTs
Danke für die Info, Rudolph.
Es passiert, wenn man unter Windows unter
Einstellungen/Standardprogramme/Programmzuordnungen festlegen/Outlock 2016/Standards für dieses Programm festlegen
unter MAPI/E-Mail senden Outlock 2016 als Standard auswählt.
Zum Einsatz ist noch 1.90.331
.
Uli
Re: MAPI Schnittstelle für eMails
Verfasst: Di, 25. Apr 2017 19:21
von ramses
Hallo Uli
du gehst den falschen Weg. Mit folgender Funktion kannst du auch mit 64Bit Outlook mailen.
Code: Alles auswählen
#include "common.ch"
#include "Xbp.ch"
#include "Appevent.ch"
#include "Gra.ch"
#pragma Library( "ascom10.lib" )
function sendOutlookMail(cAdresses,cSubject,cMessage,xAttachments)
local oMsg, oOutLook, oEM, bAlterFehlerblock := ErrorBlock()
local arr, ret_val := .f.
default cAdresses to "", cSubject to "", cMessage to "", xAttachments to ""
oOutLook := CreateObject( "Outlook.Application" )
IF Empty( oOutLook )
msgbox("MS-Outlook ist nicht oder nicht korrekt installiert!" + chr(13) + "Fehlernr.: " + ltrim(str(ComLastError())) )
return .f.
ENDIF
ErrorBlock({|oError|OutlookFehler(oError)})
begin sequence
oMsg := oOutlook:CreateItem(0)
oMsg:display()
oEM := oMsg:Recipients:Add( cAdresses )
*oEM:resolve
*oEM:type := 2
oMsg:Subject := cSubject
if "<HTML>" $ upper(cMessage)
oMsg:bodyformat := 2 // Html
oMsg:HTMLbody := cMessage
else
oMsg:bodyformat := 1 // Plaintext
oMsg:body := cMessage
endif
if valtype(xAttachments) = "A"
arr := xAttachments
else
arr := { xAttachments }
endif
for a = 1 to len(arr)
if !empty(arr[a])
if ! ":" $ arr[a]
msgbox("Filename ung")
else
oMsg:Attachments:Add( arr[a] )
endif
endif
next
*oMsg:Application:Quit()
*oMsg:Quit()
oOutLook:destroy()
ret_val := .t.
end sequence
ErrorBlock(bAlterFehlerblock)
return(ret_val)
static function outlookfehler(oError)
msgbox("In Outlook ist folgender Fehler aufgetreten: " + oError:description + " Bei Ausfhrung von: " + oError:operation)
break()
return(NIL)
Ach ja, die 1.90.XXX solltest du entsorgen ......
Gruss Carlo
Re: MAPI Schnittstelle für eMails
Verfasst: Mi, 26. Apr 2017 10:00
von Rudolf
Hallo,
wenn irgendwie geht würde ich auf SEE4XB oder Chilkat ActiveX umstellen, hier hat man wesentlich mehr Kontrolle und Möglichkeiten und beide laufen sehr zuverlässig bei mir.
Grüße
Rudolf
Re: MAPI Schnittstelle für eMails
Verfasst: Mi, 26. Apr 2017 10:31
von AUGE_OHR
Rudolf hat geschrieben:wenn irgendwie geht würde ich auf SEE4XB oder Chilkat ActiveX umstelle
ich würde nicht auf solche 3-PP Lösungen gehen ...
@Ulli : wenn du nur senden willst würde ich auf Windows Bordmittel
CDO zurückgreifen was wohl noch bis 2024 unterstützt wird.
Re: MAPI Schnittstelle für eMails
Verfasst: Mi, 26. Apr 2017 13:20
von Bertram Hansen
Hallo Jimmy,
vorher hast du das eventuelle Endedatum von CDO?
Re: MAPI Schnittstelle für eMails
Verfasst: Mi, 26. Apr 2017 17:01
von UliTs
Erstmal danke für die diversen Tipps!
Ramses, Deine Lösung funktioniert aber nur mit Outlock, oder?
-
Was ist CDO?
-
Jetzt habe ich kurzerhand eine DLL in Delphi geschrieben, die die MAPI-Schnittstelle benutzt und ein DELPHI-Testprogramm.
Das funktioniert auch gut sowohl mit GroupWise als auch mit Outlock
.
Dann habe ich die Delphi-DLL ins xBase-Programm eingebunden: unter GroupWise klappt es (wie bisher) weiterhin aber mit Outlock auch weiterhin nicht
.
Deshalb kam mir die Idee, dass für die DLL nicht genügend Speicher zur Verfügung steht, weil vielleicht Outlock extrem Speicherhungrig ist ....
Könnte das sein? Kann ich das irgendwie unter xBase beeinflussen?
Ansonsten habe ich derzeit nur noch die Idee, statt einer DLL ein DELPHI-Programm aufzurufen, welches den Job macht...
Re: MAPI Schnittstelle für eMails
Verfasst: Mi, 26. Apr 2017 18:51
von ramses
@UliTs, ja die Funktion geht nur mit Outlook. Aber die SOCMAPI.DLL funktioniert doch nur mit Outlook 2016 nicht, mit anderen Mailprogramms läuft die.
Re: MAPI Schnittstelle für eMails
Verfasst: Do, 27. Apr 2017 1:34
von AUGE_OHR
Bertram Hansen hat geschrieben:vorher hast du das eventuelle Endedatum von CDO?
ich hatte das irgendwo im Zusammenhang mit Exchange Server gelesen das CDO nicht mehr mit den "neuen" Versionen zusammen arbeiten soll.
ich muss mal meinen Bruder fragen was sich da für die Clients geändert hat denn er administriert solche Exchange Netzwerke.
---
der "Witz" an CDO ist ja das man damit direkt "einen" SMTP Server anwählen kann und nicht nur den "gedachten" Exchange Server.
im Grunde ist es also eine Sicherheitslücke die M$ wohl ebenso wie POP3, zugunsten von IMAP, abschaffen möchte.
Re: MAPI Schnittstelle für eMails
Verfasst: Do, 27. Apr 2017 9:23
von Bertram Hansen
UliTs hat geschrieben:
Was ist CDO?
Hallo Uli,
schau mal unter
http://www.xbaseforum.de/viewtopic.php? ... &hilit=cdo
Re: MAPI Schnittstelle für eMails
Verfasst: Do, 27. Apr 2017 9:23
von Rolf Ramacher
also ich sende mit SEE4XB klappt hervorragend.
Re: MAPI Schnittstelle für eMails
Verfasst: Di, 09. Mai 2017 11:27
von UliTs
UliTs hat geschrieben:Danke für die Info, Rudolph.
Es passiert, wenn man unter Windows unter
Einstellungen/Standardprogramme/Programmzuordnungen festlegen/Outlock 2016/Standards für dieses Programm festlegen
unter MAPI/E-Mail senden Outlock 2016 als Standard auswählt.
Zum Einsatz ist noch 1.90.331
.
Uli
Es ist doch zum kotzen! Jetzt habe ich eine Lösung, die mit Delphi (vermutlich auch Xbase++) zu funktionieren scheint, aber was passiert?
1) Die Mail wird zwar aufbereitet und Outlock öffnet sich mit einem Fenster und der Mail aber das Fenster ist Modal gegenüber Outlock und die Benutzer können so nicht andere Inhalte aus anderen Mails kopieren ...
2) Die Mail wird nicht als HTML-Mail sondern als Textmail angezeigt (wie kann ich das in Outlock ändern?)
Wenn ich allerdings keinen Body angebe, wird die Mail als HTML-Mail angezeigt
3) Wenn ich die Empfängeradresse vorher durch Delphi angegeben habe und die Mail versende, kommt selbige mit dem Vermerk, dass sie nicht versendet werden kann, sofort zurück. Lösche ich aber die Empfängeradresse und tippe sie erneut ein, funktioniert es
.
Hat irgend jemand eine Idee?
Uli