Seite 1 von 2

PDF als Mail versenden?

Verfasst: Do, 12. Mär 2015 14:13
von satmax
Hallo,

ich möchte gernen einen PDF Ausdruck als Mail versenden. Den Ausdruck habe ich bereits und ein PDF Dokument wird korrekt erstellt. Nun wollte ich die Datei per Mail versenden:

Code: Alles auswählen

// c:\users\public\export.pdf existiert zu diesem Zeitpunkt.
	IF cPrnOptMailen 
		hMailJob = LsMailJobOpen(0)
		DebugPrint("hMailJob:", hMailJob) // Liefert  NIL
		LsMailSetOptionString(hMailJob, "Export.Mail.Body", "Test")
		LsMailSetOptionString(hMailJob, "Export.Mail.To", "demo@meinedomaine.com")
		LsMailSetOptionString(hMailJob, "Export.Mail.Subject", "Test!") 
		LsMailSetOptionString(hMailJob, "Export.Mail.AttachmentList","c:\\users\\public\\export.pdf")
		DebugPrint(LsMailSendFile(hMailJob, 0))   // Liefert NIL
		LsMailJobClose(hMailJob)
	endif
Es wird keine Mail versandt. Müssen da vorab noch Optionen gesetzt werden?

Re: PDF als Mail versenden?

Verfasst: Do, 12. Mär 2015 14:19
von Tom
Export.Mail.Provider ("MSMAPI" usw.) fehlt. Ansonsten sieht das auf den ersten Blick gut aus.

Re: PDF als Mail versenden?

Verfasst: Do, 12. Mär 2015 15:30
von satmax
Danke Tom,

das hat nichts gebracht:

Code: Alles auswählen

LsMailSetOptionString(hMailJob, "Export.Mail.Provider", "MSMAPI")
Ich denke das eigentliche Problem ist, "LsMailJobOpen" liefert nil

Code: Alles auswählen

hMailJob = LsMailJobOpen(0) // liefert NIL
Laut Doku sollte LsMailJobOpen(0) liefern:
ein Handle, das bei den meisten Funktionen als Parameter benötigt wird, um auf
die applikationsspezifischen Daten zugreifen zu können, 0 für Fehler.
aber niemals nil!

Re: PDF als Mail versenden?

Verfasst: Do, 12. Mär 2015 15:40
von Tom
Gibt es eine eingestellte Standard-Mailanwendung?

Re: PDF als Mail versenden?

Verfasst: Do, 12. Mär 2015 15:43
von satmax
Ja. Aus der Vorschau geht das auch.

Re: PDF als Mail versenden?

Verfasst: Do, 12. Mär 2015 16:29
von satmax
Wenn ich die PDF wie folgt direkt mit dem Druckjob versende funktioniert es:
LlXSetParameter(hJob, LL_LLX_EXTENSIONTYPE_EXPORT, "PDF", "Export.File", "auftrag.pdf")
LlXSetParameter(hJob, LL_LLX_EXTENSIONTYPE_EXPORT, "PDF", "Export.Path", cTemporaryPath)
LlXSetParameter(hJob, LL_LLX_EXTENSIONTYPE_EXPORT, "PDF", "Export.Quiet","1")

// Mailversand ok:
LlXSetParameter(hJob, LL_LLX_EXTENSIONTYPE_EXPORT, "PDF", "Export.SendAsMail", "1")
LlXSetParameter(hJob, LL_LLX_EXTENSIONTYPE_EXPORT, "PDF", "Export.Mail.Provider", "SMAPI")
LlXSetParameter(hJob, LL_LLX_EXTENSIONTYPE_EXPORT, "PDF", "Export.Mail.To", "demo@mydomain.com")
LlXSetParameter(hJob, LL_LLX_EXTENSIONTYPE_EXPORT, "PDF", "Export.Mail.Subject", "Auftrag Nr.:"+ ALLTRIM(str(oDlgAuftrag:oCursor:FieldGet("AuftragNr"),14,4)))
LlXSetParameter(hJob, LL_LLX_EXTENSIONTYPE_EXPORT, "PDF", "Export.Mail.Body", cMailbody)
LlXSetParameter(hJob, LL_LLX_EXTENSIONTYPE_EXPORT, "PDF", "Export.Mail.ShowDialog", "0")
Laut Beispielcode (Online FAQ) sollte das funktionieren:

Code: Alles auswählen

hMailJob := LsMailJobOpen(0)
If (hMailJob < 0); LLErrorMessage(hJob); Return NIL; Endif
Geht aber nicht da hMailJob eben NIL ist!

Zusatzfrage: welche Alternativen gibt es zum Mailversand? Eigentlich hätte mir das via Outlook gefallen, simple implementiert, einfach zu konfigurieren, alle Mails im Outlook beisammen (gesendete Mails).

Re: PDF als Mail versenden?

Verfasst: Do, 12. Mär 2015 16:39
von Martin Altmann
Markus,
mal kurz eine Frage zu dem Thema (nicht zu Deinem Problem): Wenn Du die Mail so versendest, geht die dann (im Prinzip) ohne manuellen Eingriff raus oder musst Du bei jeder Mail auf "Senden" klicken?

Viele Grüße,
Martin

Re: PDF als Mail versenden?

Verfasst: Do, 12. Mär 2015 16:41
von satmax
Es kommt die Sicherheitsabfrage von Outlook (Windows 8.1 + Outlook), dann wird aber sofort versendet.

Re: PDF als Mail versenden?

Verfasst: Do, 12. Mär 2015 17:00
von Martin Altmann
Die kommt aber nur einmalig - oder?
Oder kommt die vor jedem Job?

Viele Grüße,
Martin

Re: PDF als Mail versenden?

Verfasst: Do, 12. Mär 2015 17:03
von satmax
vor jedem JOB.

Darum experimentiere ich gerade mit LsMailSendFile() beziehungsweise suche nach einer einfachen Möglichkeit Mails mit Anhang zu versenden.

Re: PDF als Mail versenden?

Verfasst: Do, 12. Mär 2015 17:09
von Martin Altmann
Ich danke DIr - kannst mich ja mal auf dem Laufenden halten ;-)
Bezüglich Senden von Mails mit Anhang (so werde ich das wahrscheinlich mit L&L und PDFs machen): Nimm see4xb von Marshallsoft - damit kannst Du das tun. Brauchst natürlich einen SMTP-Server und entsprechende Zugangsdaten - aber die hat ja jeder Kunde in seinem Mailclient stehen (und kann diese Angaben dann in Deinem Programm einmalig zur Konfiguration angeben - wobei ich das Passwort nie speichern würde, sondern einmalig bei Bedarf abfragen und mir für die Laufzeit der Anwendung merken würde).
Aktuell senden wir mit See4xb Mails automatisiert von unserem Webserver (mit und ohne Anhänge, sowohl HTML als auch NurText - je nach Mailclientkonfiguration wird dann entweder die eine oder die andere Vriante angezeigt).
Nachteil dabei: Es läuft an Deinem Mailclient vorbei - könnte man aber umgehen, indem man die Absendeadresse auch als BCC-Adresse mit angibt.

Viele Grüße,
Martin

Re: PDF als Mail versenden?

Verfasst: Do, 12. Mär 2015 17:13
von Herbert
Outlook fragt immer.
Passiert bei mir mit dem Drag&Drop auch.

Es gibt Abhilfe
http://www.mailhilfe.de/ein-programm-ve ... -zu-senden

Das darin erwähnte Programm speichert die Frage ab. Macht den Vorgeng aber ein klein wenig langsamer. Wirkt aber.

Re: PDF als Mail versenden?

Verfasst: Do, 12. Mär 2015 17:16
von satmax
Mach ich, kannst Du einfach mal folgende Zeile versuchen:

Code: Alles auswählen

hMailJob := LsMailJobOpen(CMBTLANG_DEFAULT)
DebugPrint("hMailJob;", Valtype(hMailJob))
Mich interessiert ob hMailJob bei Dir auch NIl ist

Re: PDF als Mail versenden?

Verfasst: Do, 12. Mär 2015 17:23
von Martin Altmann
Markus,
ich habe vor, die Demo von L&L Ende nächster Woche zu installieren und dann damit ein paar erste Schritte zu unternehmen und mich allgemein damit vertraut zu machen.
So schnell wird das leider nichts werden (von meienr Seite aus) - hauptberuflich mache ich ja nichts mit Xbase++ und kann mich damit um solche Dinge nur ab und an zu Hause kümmern.

Viele Grüße,
Martin

Re: PDF als Mail versenden?

Verfasst: Do, 12. Mär 2015 18:02
von satmax
Herbert hat geschrieben:Outlook fragt immer.
Passiert bei mir mit dem Drag&Drop auch.

Es gibt Abhilfe
http://www.mailhilfe.de/ein-programm-ve ... -zu-senden

Das darin erwähnte Programm speichert die Frage ab. Macht den Vorgeng aber ein klein wenig langsamer. Wirkt aber.
Danke für den Tipp. Ägerlich ist halt immer wenn was nicht so geht wie es soll. Da habe ich heute wieder so einen Tag erwischt. :evil:

Warum funktioniert die Outlook Einstellung nicht, bei mir sind alle Einstellmöglichkeiten ausgegraut (Als Admin ausgeführt): Datei/Optionen/Trust Center/Einstellungen für das Trust Center/Programmgesteuerter Zugriff:

Re: PDF als Mail versenden?

Verfasst: Fr, 13. Mär 2015 7:23
von satmax
Zurück zum Ausgangsproblem, unter VC++ funktioniert der folgende Code einwandfrei und wie erwartet. Könnte bitte ein LL20 (19) Anwender aus dem Forum den folgenden Code testen:

Code: Alles auswählen

hMailJob := LsMailJobOpen(CMBTLANG_DEFAULT)
If (hMailJob < 0); LLErrorMessage(hJob); Return NIL; Endif   // Unter Xbase Absturz da NIL
LsMailSetOptionString(hMailJob, "Export.Mail.Provider", "MSMAPI")
LsMailSetOptionString(hMailJob, "Export.Mail.Body", "Auftrag erstellt mit")
LsMailSetOptionString(hMailJob, "Export.Mail.To", "demo@meinedomaine.com
LsMailSetOptionString(hMailJob, "Export.Mail.Subject", "Test!") 
LsMailSetOptionString(hMailJob, "Export.Mail.AttachmentList","c:\users\public\export.pdf")
LsMailSendFile(hMailJob, 0)
LsMailJobClose(hMailJob)
In erster Linie interessiert mich der Rückgabewert von LsMailJobOpen. Danke.

Re: PDF als Mail versenden?

Verfasst: Fr, 13. Mär 2015 10:26
von brandelh
Ich bin zwar kein LL Anwender, aber das kann ich beantworten:

Code: Alles auswählen

hMailJob := LsMailJobOpen(CMBTLANG_DEFAULT)
liefert entweder einen Fehlercode (< 0), oder ein Handle auf das Objekt zurück (32Bit LONG), 0 oder NIL sollte da nicht möglich sein, daher wundert mich der nächste Kommentar:
// Unter Xbase Absturz da NIL
Was aber auf jeden Fall ein Problem darstellt, ist der Name des zweiten Parameters:

Code: Alles auswählen

If (hMailJob < 0); LLErrorMessage(hJob); Return NIL; Endif   
Wenn man das besser formatiert hätte, würde der Fehler im Debugger besser sichtbar sein:

Code: Alles auswählen

If (hMailJob < 0)
   LLErrorMessage(hJob)  // müsste das nicht hMailJob heißen !
   Return NIL
Endif  
Ich denke du hast hJob statt hMailJob geschrieben ;-)

Re: PDF als Mail versenden?

Verfasst: Fr, 13. Mär 2015 10:31
von satmax
Danke Hubert, das mit hjob ist ein Tippfehler (copy & paste, würde einen Code so nie schreiben :) ), aber so weit komme ich nicht das hMailJob immer nil ist:

Code: Alles auswählen

hMailJob := LsMailJobOpen(CMBTLANG_DEFAULT)
DebugPrint("hMailJob;", Valtype(hMailJob))
ergibt im Debugprint Fenster: 10:29:20 <hMailJob;><U>
(Ich habe mir Dein Debugprint um einen 2 Parameter und um <> erweitert)

Re: PDF als Mail versenden?

Verfasst: Fr, 13. Mär 2015 11:08
von Bertram Hansen
Hallo Markus,

alternativ gibt es noch die Möglichkeit über CDO.MESSAGE.

http://www.xbaseforum.de/viewtopic.php? ... do.message

Re: PDF als Mail versenden?

Verfasst: Fr, 13. Mär 2015 11:39
von satmax
Jetzt wird es spannend, wenn man die undokumentierte Funktion "LS20ModuleInit()" vorher (beim Programmstart) aufruft dann klappt es.

Wie komme ich darauf? LL Funktionen werden via #command aufgerufen:

Code: Alles auswählen

#command  LL_FUNCTION <FUNC>([<x,...>]) ORDINAL <nOrdinal> =>      ;
FUNCTION <FUNC>([<x>])                                             ;;
  STATIC cTemplate := NIL                                          ;;
  LOCAL xRet                                                       ;;
  IF hDll == 0													 ;;
		DebugPrint("RETURN(NIL)")                                                    ;;  // Hier kommt NIL!
    RETURN(NIL)                                                    ;;
  ENDIF                                                            ;;
  IF cTemplate==NIL                                                ;;
    cTemplate := DllPrepareCall( hDll, DLL_STDCALL, <nOrdinal> ) ;;
  ENDIF                                                            ;;
  xRet := DllExecuteCall(cTemplate[,<x>])                          ;;
RETURN xRet

Warum das nun so ist dem muss ich noch nachgehen.

Re: PDF als Mail versenden?

Verfasst: Fr, 13. Mär 2015 12:17
von brandelh
die Funktion ist "undokumentiert" und muss aufgerufen werden ... das führt mich zur Frage ob du eventuell eine INCLUDE Anweisung vergessen hast ?

Viele solche Hersteller verstecken in *.CH Dateien init Aufrufe etc.

Re: PDF als Mail versenden?

Verfasst: Fr, 13. Mär 2015 14:10
von satmax
Es gibt ein Source File cmbtll20.prg + Header und ein Source File cmbtls20.prg + Header. Darin sind jeweils die LL Funktionen für XBase++ definiert. Die meisten Funktionen sind im ersten File definiert, darum geht auch alles andere bei mir.

Um die Funktionen aus cmbtls20.prg verwenden zu können, muss man LS20ModuleInit() aufrufen (nich auf LS20ModuleExit() vergessen). In der Combit Dokumentation finde ich darüber aber keine Zeile. Das hängt wohl mit der XBase++ Implementation zusammen.

Warum es hier 2 getrennte Files mit 2 getrennten ...ini() gibt ist mir eigentlich völlig unklar. IMHO sollte das alles in eine Datei.

Vielleicht hilft dieser Hinweis mal einem anderen. Sollte das alles ganz anders sein lasse ich mich gerne aufklären.

Re: PDF als Mail versenden?

Verfasst: Fr, 13. Mär 2015 16:17
von satmax
Die richtige Initialisierung vorausgesetzt geht dass mailen nun sehr einfach mit LL. Hier ein Beispiel wo auch 2 Anhänge verwendet werden. Ein Anhang wird unmittelbar zuvor via LL erstellt, der 2. Anhang (unterfertigte Lieferschein) wurde durch den User hinzugefügt :

Code: Alles auswählen

hMailJob := LsMailJobOpen(CMBTLANG_DEFAULT)
LsMailSetOptionString(hMailJob, "Export.Mail.Provider", "XMAPI")
LsMailSetOptionString(hMailJob, "Export.Mail.Body", cMailbody )
LsMailSetOptionString(hMailJob, "Export.Mail.To", cEMail)
LsMailSetOptionString(hMailJob, "Export.Mail.Subject", cSubject) 
LsMailSetOptionString(hMailJob, "Export.Mail.AttachmentList",cTemporaryPath+"Auftrag.pdf" +CHR(9)+ cPathAnhang" )
LsMailSendFile(hMailJob, 0)                                    
LsMailJobClose(hMailJob)
DebugPrint("hMailJob:", hMailJob)
Wenn man als Mail Provider XMAPI verwendet kommt auch keine weitere Abfrage von Outlook. Die Mail wird sofort versendet und ist im Outlook Mailausgang zu sehen. Vorteil, ich brauche keinerlei Passwörter und Mailaccounts verwalten.

Re: PDF als Mail versenden?

Verfasst: Sa, 14. Mär 2015 12:24
von Tom
"Ls20ModuleInit" ist - wie "Ll20ModuleInit" - keine "undokumentierte Funktion", sondern ein Beispiel dafür, wie L&L in Xbase++ eingebunden wird. Darin werden die DLLs geladen, die Wrapper für die Funktionen initialisiert usw. Du wirst auch keinen Report mit L&L herausbekommen, wenn Du nicht etwas in dieser Art machst, gelle? :wink:

Re: PDF als Mail versenden?

Verfasst: Sa, 14. Mär 2015 13:01
von satmax
Hast natürlich recht. Ich hatte die Files einfach eingebunden und nie darüber nachgedacht. Außer ganz zu Beginn mal, da habe ich LLCommon.prg leicht angepasst. Für mich war also bisher Ls20ModuleInit() eine normale LL Funktion...