Outlook und Attachments

Nutzung, Komponenten, .NET

Moderator: Moderatoren

Mario Ulbig

Outlook und Attachments

Beitrag von Mario Ulbig »

Möglicherweise hat jemand eine Lösung für mich.

Ich versuche aus einer XBase Appl. Outlook mit Empfänger EMail-Adresse zu öffnen und eine PDF Datei einzubinden.

Ohne PDF Datei geht es ohne Probleme.

Ich versuche es über DLLCall mit der Shell32.DLL.

Für eine schnelle Antwort wäre ich Euch sehr dankbar.

Gruß Mario
Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 12906
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg
Hat sich bedankt: 19 Mal
Danksagung erhalten: 45 Mal

Re: Outlook und Attachments

Beitrag von AUGE_OHR »

hi,
Mario Ulbig hat geschrieben: Ich versuche aus einer XBase Appl. Outlook mit Empfänger EMail-Adresse zu öffnen und eine PDF Datei einzubinden.
du willst "senden", richtig ?

suche mal auf der Alaska Homepage in der ASCN Section nach
SOCMAPI zum "senden" per MAPI sowie :
C:\ALASKA\XPPW32\SOURCE\samples\activex\olimport\
um an die Outlook Empfänger Adressen ran zu kommen.

mit den beiden "Bausteinen" sollte du dir eine Schnittstelle zusammen
stellen können.

gruss by OHR
Jimmy
Benutzeravatar
Lewi
1000 working lines a day
1000 working lines a day
Beiträge: 830
Registriert: Di, 07. Feb 2006 14:10
Wohnort: Hamburg
Danksagung erhalten: 2 Mal

Beitrag von Lewi »

In Verbindung mit der Api-Funktion "ShellExecute" kannst mit dem Aufruf von Outlook eine Datei übergeben:

Code: Alles auswählen

ShellExecuteA(GetApp():getHWnd(), SHELL_OPEN, cExe, " /a "+cFile, "", SW_SHOW)
Für "cExe" bietet sich an über API in der Registry den Eintrag "HKEY_CLASSES_ROOT\
\mailto\shell\open\command" auszulesen und den String zu nach der Anwendung zu extrahieren.

Gruß, Olaf
Mario Ulbig

Beitrag von Mario Ulbig »

Hallo Olaf,

vielen Dank für die schnelle Antwort. Leider bekomme ich bei
dem Aufruf die Outlookfehlermeldung:

"Das Befehlszeilenargument ist ungültig. Überprüfen Sie den verwendeten Befehl."

Nachstehen der Code

Gruß Mario

/////////////////////////////////////////////////////////////////////////
FUNCTION OpenEMail( cAdresse, cAnhang )
PRIVATE cDest, cDatei


cDest :="mailto:"+alltrim(cAdresse)
cDatei :=alltrim(cAnhang)

DllCall("SHELL32.DLL",DLL_STDCALL,"ShellExecuteA",AppDeskTop():getHWnd(),"Open",cDest," /a "+cDatei,CurDir(),SW_RESTORE)
RETURN(NIL)
Benutzeravatar
Lewi
1000 working lines a day
1000 working lines a day
Beiträge: 830
Registriert: Di, 07. Feb 2006 14:10
Wohnort: Hamburg
Danksagung erhalten: 2 Mal

Beitrag von Lewi »

Hallo Mario,
beachte die Freizeichen bei dem Parameter: " /a " + cFile. Also jeweils ein Freizeichen vor und nach dem Parameter "/a"

Den Parameter "cDir" brauchst Du nicht notwendiger Weise. Der Pfad kann auch in der Datei enthalten sein.

Beispiel:

DllCall("SHELL32.DLL",DLL_STDCALL,"ShellExecuteA",AppDeskTop():getHWnd(),"Open",cDest," /a c:\TEMP\MEINEDATEI.DOC","",SW_RESTORE)


Gruß, Olaf
Mario Ulbig

Beitrag von Mario Ulbig »

Sorry Olaf,

aber bei mir scheint die Sache nicht zu funktionieren. Ich habe es mit
Variable und auch mit Pfad und Dateiangabe. Die Fehlermeldung ist
immer die gleiche. (siehe oben)

cDest :="mailto:"+alltrim(cAdresse)
cDatei :=alltrim(cAnhang)

DllCall("SHELL32.DLL",DLL_STDCALL,"ShellExecuteA",AppDeskTop():getHWnd(),"Open",cDest," /a d:\start.txt","",SW_RESTORE)


oder

DllCall("SHELL32.DLL",DLL_STDCALL,"ShellExecuteA",AppDeskTop():getHWnd(),"Open",cDest," /a "+cDatei,"",SW_RESTORE)

Woran könnte es noch liegen?

Guß Mario
Benutzeravatar
Lewi
1000 working lines a day
1000 working lines a day
Beiträge: 830
Registriert: Di, 07. Feb 2006 14:10
Wohnort: Hamburg
Danksagung erhalten: 2 Mal

Beitrag von Lewi »

Welcher Wert hat "cDest"?
Falls es der komplette Wert aus der Registry ist, mußt Du ihn separieren, so das das nur noch ->PFAD\OUTLOOK.EXE übrig bleibt.

Im Registry-Key selbst steht z.B.: "c:\PROGRA~1\MICROS~2\OFFICE11\OUTLOOK.EXE" -c IPM.Note /m "%1"
Mario Ulbig

Beitrag von Mario Ulbig »

Super Olaf,

diesmal ging OUTLOOK auf und mein Attachment hängt dran.
In cDest stand "mailto:mustermann@mail.de"

D.h. ich sollte Outlook direkt aufrufen. Wenn es mit diesem Aufruf OK ist
und mit der Option /a eine Datei anhängen kann, so gibt es bestimmt
auch noch die Optionen für Empfänger und Betreff.

Stimmt das, und wenn ja kannst du mir die auch noch nennen.
Ich wäre ständig in deiner Schuld! :D

Danke Mario
Benutzeravatar
Lewi
1000 working lines a day
1000 working lines a day
Beiträge: 830
Registriert: Di, 07. Feb 2006 14:10
Wohnort: Hamburg
Danksagung erhalten: 2 Mal

Beitrag von Lewi »

Zu 1.
Du hast sicherlich den falschen Registry-Schlüssel gezogen. Unter "HKEY_CLASSES_ROOT\
\mailto\shell\open\command" sollte sich eigentlich kein "mailto:" befinden.

Zu 2.
Die Aufrufparameter für Outlook findest Du hier:
http://www.docoutlook.de/outlook/ol2000 ... ameter.htm

Normaler Weise werden "Betreff" und "Text" über "mailto:" an das Mail-Programm übergeben. Soweit ich weiß, können über "mailto" allerdings keine Dateien an eine eMail-Nachricht angefügt werden.
Mario Ulbig

Beitrag von Mario Ulbig »

Sorry Olaf, auch wenn ich nerve.

Aber dieser Part ist sehr wichtig.
Der Registryeintrag wird korr. ausgelesen. Sobald ich versuche
eine EMail Adresse an Outlook zu übermitteln, geht nur noch Outlook
auf und steht im Hauptfenster. (da wo alle Ordner sichtbar sind)
Sprich er ignoriert die nachfolgenden Parameter.

In der Registry steht folgender Aufruf:
"C:\PROGRA~1\MICROS~2\Office\OUTLOOK.EXE" -c IPM.Note /m "%1" /a "%2"

Das heißt doch, das Outlook mit zwei Parametern zurecht kommen
sollte, oder?

Hat es schon mal jemand geschafft Outlook zu öffnen und eine Datei als
Anhang und eine EMailadresse für den Empfänger zu übergeben, wenn ja
WIE.

Danke Mario
Benutzeravatar
Lewi
1000 working lines a day
1000 working lines a day
Beiträge: 830
Registriert: Di, 07. Feb 2006 14:10
Wohnort: Hamburg
Danksagung erhalten: 2 Mal

Beitrag von Lewi »

Hallo Mario,
das wird nur über ActiveX gehen.
Ich baue mal ein Beispiel und poste es später.

Gruß, Olaf
Benutzeravatar
Wolfgang Ciriack
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2934
Registriert: Sa, 24. Sep 2005 9:37
Wohnort: Berlin
Hat sich bedankt: 13 Mal
Danksagung erhalten: 34 Mal
Kontaktdaten:

Beitrag von Wolfgang Ciriack »

Wie schon Jimmy erwähnte, ich mach das auch mit SOCMAPI, lad dir das mal von der Alaska-Seite herunter, ist sehr einfach zu verstehen und funktioniert einwandfrei. Wenn du dazu dann noch Fragen hast, kann ich dir morgen notfalls auch noch ein Stüch Code senden.
Viele Grüße
Wolfgang
Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 12906
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg
Hat sich bedankt: 19 Mal
Danksagung erhalten: 45 Mal

Beitrag von AUGE_OHR »

hi,

wichtig bei SOCMAPI ist das du es im Thread startest !

Code: Alles auswählen

PROCEDURE MAPISEND(cJahr,cMonat,aJOB)
LOCAL cAdresses    := "Testi@Testmann.de"
LOCAL cSubject     := "DATEV Dateien 20"+cJahr+"/"+cMonat 
LOCAL cMessage     := ""
LOCAL cAttachments := ""
LOCAL nFlag        :=  NOFLAG
...
   cMessage := "hi,"+CRLF+;
               "anbei die DATEV Daten 20"+cJahr+"/"+cMonat+CRLF+CRLF+;
               "Umsatz "+cMWSTVOLL+"% :"+STR(sum14,9,2)+CRLF+;
               "Mwst   "+cMWSTVOLL+"% :"+STR(mwst14,9,2)+CRLF+;
               "Umsatz "+cMWSTHALB+"% :"+STR(sum7,10,2)+CRLF+;
               "Mwst   "+cMWSTHALB+"% :"+STR(mwst7,9,2)+CRLF+CRLF+;
               "Mwst Gesamt "+STR(mwstges,9,2)+CRLF+;
               "Skonto "+STR(skontoges,8,2)+CRLF+;
               "Endsumme "+STR(endsumme,12,2)+CRLF+CRLF+;
               "gebucht nach DATEV "+STR(nEndsume,12,2)+CRLF+CRLF+;
               "Differenz :"+STR((nEndsume-endsumme),12,2)+CRLF+CRLF+;
               "mfg."+CRLF+;
               "Jimmy"

   IF TESTZIP(cJahr,cMonat)
      cAttachments := ZPATH+"YIU"+cJahr+cMonat+".ZIP"
      IF FILE(cAttachments)

      ELSE
         MSGBOX("bitte erstellen sie "+cAttachments+" manuell")
         cAttachments := ""
      ENDIF
   ENDIF
   //
   // so und nun einen Thread starten, dann funktioniert es
   //
   oMAPI := Thread():new()
   oMAPI:start("SENDNOW", cAdresses , cSubject  ,cMessage  , cAttachments , nFlag)

RETURN

PROCEDURE SENDNOW(cAdresses , cSubject  ,cMessage  , cAttachments , nFlag)
LOCAL nErr

    //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

        //-- Pop up maileditor
*        MsgBox("mail will be send with Maileditor popping up")
        nErr := DllExecuteCall( scDLLSocMapiSendMail , cAdresses , cSubject  ,cMessage  , cAttachments , nFlag )
        if nErr != SUCCESS_SUCCESS .and. nErr != MAPI_USER_ABORT
            break nErr
        endif

*        //-- Store mail directly to outbox
*        MsgBox("mail will be stored directly to outbox")
*        nErr := DllExecuteCall( scDLLSocMapiPostMail , cAdresses , cSubject  ,;
*                                                       cMessage  , cAttachments , nFlag)
*        if nErr != SUCCESS_SUCCESS
*            break nErr
*        endif
*        MsgBox("mail successfully stored to outbox")

    RECOVER USING nErr
        NotifyError (nErr)
    END SEQUENCE

    DllExecuteCall(scDLLSocMapiLogoff)

RETURN
gruss by OHR
Jimmy
Benutzeravatar
Lewi
1000 working lines a day
1000 working lines a day
Beiträge: 830
Registriert: Di, 07. Feb 2006 14:10
Wohnort: Hamburg
Danksagung erhalten: 2 Mal

Beitrag von Lewi »

Hier nun eine Mail-Versandfunktion für Outlook mittels ActiveX:

Code: Alles auswählen

#include "activex.ch"
#pragma library( "ascom10.lib" )

Function MailWithOutlook( cAdress, cSubject, cBody, cAttach)

Local oMail
Local oOutlook
Local oMailItem := NIL

   cAdress  := IIF( cAdress == NIL,"", cAdress)
   cSubject := IIF( cBody  == NIL ,"", cSubject)
   cBody    := IIF (cBody == NIL, "", cBody )

   oOutlook := CreateObject("Outlook.Application")
   IF Empty( oOutlook )
     MsgBox( "Outlook nicht installiert" )
     RETURN ( NIL )
   ENDIF


   oMail          := oOutlook:CreateItem(0)
   oMail:Recipients:Add( cAdress)
   oMail:Subject  := cSubject
   oMail:body     := cBody
   if ! emty( cAttach )
      oMail:Attachments:Add(cAttach)
   ENDIF
   oMail:Send()
   oMail:= NIL
   oOutLook:quit()
   oOutlook:destroy()

Return ( NIL )
Falls kein Exchange-Server im Einsatz ist, erfolgt leider eine Sicherheitsmeldung beim Versand einer Mail. Siehe dazu einen Beitrag unter:
http://zerbit.de/artikel/show.asp?id=19

Mit der Outlook Redemption v. 4.3 lässt sich allerdings das Problem der Sicherheitsabfrage umgehen: http://www.dimastr.com/redemption/

Gruß, Olaf
Benutzeravatar
Koverhage
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2470
Registriert: Fr, 23. Dez 2005 8:00
Wohnort: Aalen
Hat sich bedankt: 102 Mal
Danksagung erhalten: 3 Mal
Kontaktdaten:

Beitrag von Koverhage »

Hallo Olaf,

wie kann man feststellen ob OUTLOOK oder OutLookExpress benutzt wird ?

Gruss
Klaus
Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 12906
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg
Hat sich bedankt: 19 Mal
Danksagung erhalten: 45 Mal

Beitrag von AUGE_OHR »

hi,
Koverhage hat geschrieben: wie kann man feststellen ob OUTLOOK oder OutLookExpress benutzt wird ?
... oder irgend ein anderer Mail Client. Antwort in der Registry wie Olaf
schon sagte unter :
HKEY_CLASSES_ROOT\mailto\shell\open\command
gruss by OHR
Jimmy
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15695
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Beitrag von brandelh »

Hallo Levi,

geht das auch mit Outlook-Express oder nur mit Outlook ?
Gruß
Hubert
Benutzeravatar
Tom
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 9358
Registriert: Do, 22. Sep 2005 23:11
Wohnort: Berlin
Hat sich bedankt: 101 Mal
Danksagung erhalten: 361 Mal
Kontaktdaten:

Beitrag von Tom »

Hallo, Hubert.

Das funzt mit allen Outlook-Versionen.

Ich kann nur davon abraten, mit RunShell auf irgendwelche Applikationen parametrisiert zuzugreifen. Damit hat man sehr wenig Kontrolle. Active X ist in dieser Hinsicht weitaus komfortabler, außerdem schneller - und man hat die Möglichkeit, eine eigene Fehlerbehandlung zu integrieren, die Applikation zu "verstecken" und vieles mehr.
Herzlich,
Tom
Benutzeravatar
Lewi
1000 working lines a day
1000 working lines a day
Beiträge: 830
Registriert: Di, 07. Feb 2006 14:10
Wohnort: Hamburg
Danksagung erhalten: 2 Mal

Beitrag von Lewi »

Moin Hubert,
ob es mit OE Express funktioniert weiß ich nicht. OE Express versteht auch kein VB.

Bei OE Express bleibt nur die "Mailto:"-Möglichkeit, allerdings lassen sich so keine Anhänge anfügen.

Gruß, Olaf
Benutzeravatar
Lewi
1000 working lines a day
1000 working lines a day
Beiträge: 830
Registriert: Di, 07. Feb 2006 14:10
Wohnort: Hamburg
Danksagung erhalten: 2 Mal

Beitrag von Lewi »

Tom. bist Du Dir dessen sicher, dass es auch mit OE Express funktioniert? Ich habe da meine Zweifel!

Nachtrag: Falls ja, wo finde ich denn Informationen zum Object-Modell von OE-Express?
Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 12906
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg
Hat sich bedankt: 19 Mal
Danksagung erhalten: 45 Mal

Beitrag von AUGE_OHR »

hi,
Lewi hat geschrieben: Tom. bist Du Dir dessen sicher, dass es auch mit OE Express funktioniert? Ich habe da meine Zweifel!

Nachtrag: Falls ja, wo finde ich denn Informationen zum Object-Modell von OE-Express?
wie du schon angezweifelt hast gibt es für "OutLook Express" keine
activeX Schnittstelle. Das Beispiel von Olaf geht nur mit "Outlook"

beides sind aber MAPI Clients sodas SOCMAPI damit funktioniert !

gruss by OHR
Jimmy
Mario Ulbig

Beitrag von Mario Ulbig »

An alle die, die mir so schnell geholfen haben.

Erst einmal ein großes DANKE, für die schnelle Reaktion. Ich habe das
Problem mit der SOCMAPI.DLL gelößt. Muß aber sagen, das was Tom gepostet hat erscheint mir sinnvoll, so das ich einen zweiten Versuch
starten werde.

Ich werde mir den Code von Olaf mal zur Brust nehmen.

Dieses Forum habe ich bereits einigen Leuten empfohlen.

Gruß Mario
Mario Ulbig

Beitrag von Mario Ulbig »

Hallo Olaf,

danke für dein Outlook Sample. Eine Frage, besteht denn die
möglichkeit Outlook zu öffnen wenn keine EMail Adresse (An) übergeben
wird. Wäre prima wenn das funktioniert.

Danke Mario
Benutzeravatar
Lewi
1000 working lines a day
1000 working lines a day
Beiträge: 830
Registriert: Di, 07. Feb 2006 14:10
Wohnort: Hamburg
Danksagung erhalten: 2 Mal

Beitrag von Lewi »

Hallo Mario,
ja klar.

Die Zeile

Code: Alles auswählen

   cAdress  := IIF( cAdress == NIL,"", cAdress) 
sorgt dafür.

Gruß, Olaf
Mario Ulbig

Beitrag von Mario Ulbig »

Hallo Olaf,

bei mir nicht. Es kommt eine Fehlermeldung worin steht,
das eine Adresse übergeben werden muß. Hätte auch eine PDF-Datei
mit einer Hardcopy, leider habe ich keine Ahnung wie ich die bei
euch einbinde.

Gruß Mario

Antworten