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

Code: Alles auswählen

ShellExecuteA(...)
zu finden. Mail-Adresse und Betreff klappen schon. Fehlt nur noch der Haupttext und Anhang 8) .

Uli

Re: MAPI Schnittstelle für eMails

Verfasst: Mo, 20. Mär 2017 16:33
von Bertram Hansen
Hallo Uli,

die Idee mit

Code: Alles auswählen

ShellExecuteA(...)
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

Code: Alles auswählen

ShellExecuteA(...)
funktioniert glaube ich nicht mit Dateianhang.
Ja, Du hast (teilweise) recht :o . 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 8) .
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

Code: Alles auswählen

#pragma library ("ot4xb.lib")
aus der ot4xb.ch lösche, funktioniert es :badgrin: .
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 8)

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 Ausfhrung 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? :color:
-
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? :color:
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 :angry6: .

Hat irgend jemand eine Idee?

Uli