TProcess und Parameter für Thunderbird -compose

volker
Beiträge: 24
Registriert: Mi 14. Nov 2012, 14:36
OS, Lazarus, FPC: Rosa Linux Desktop R8 (L 1.6, FPC 2.6.4)
CPU-Target: 32Bit

TProcess und Parameter für Thunderbird -compose

Beitrag von volker »

Hallo, Frage an die Experten:
Ich möchte mit TProcess eine EMail im Thunderbird erstellen. Gemäß der Anleitung:
http://kb.mozillazine.org/Command_line_ ... derbird%29
klappt dies auch - leider nur ansatzweise.
Wenn ich in der Shell z.B. dieses Kommando eingebe, funktioniert alles wunderbar:
thunderbird -compose "to='john@example.com',subject='dinner',body='How about dinner tonight?',attachment='/tmp/speisekarte.pdf'"
Es geht das E-Mail-Verfassen-Fenster vom Thunderbird aus und alle Felder sind ausgefüllt wie gewünscht, auch der Anhang.

Wenn ich allerdings im TProcess folgendes mache, geht nur das Thunderbird-EMail-Verfassen-Fenster auf und NIX ist ausgefüllt.

Code: Alles auswählen

AProcess.Executable := '/usr/bin/thunderbird';
AProcess.Parameters.Add ('-compose');
AProcess.Parameters.Add ('"to='#39'john@example.com'#39',subject='#39'dinner'#39',body='#39'How about dinner tonight?'#39',attachment='#39'/tmp/speisekarte.pdf'#39'"');

Meine Idee war, die einfachen Anführungszeichen durch #39 zu ersetzen, aber das scheint nicht zu funktionieren.
Unter http://www.corlit.com/misc_help_page_co ... _line.html wird eine etwas andere Syntax der Anführungszeichen empfohlen (keine doppelten um den gesamten Parameter, sondern doppelte um die einzelnen Bereiche), also etwa so:
thunderbird -compose to="person@example.com",subject="Your Email Subject"
aber auch das funktioniert nicht mit TProcess, (der Tip dort mit dem HTML-Body und die Kommas durch , zu ersetzen funktioniert übrigens sehr gut)

Im Moment helfe ich mir, in dem das Lazarus Programm ein temporäres Shell-Skript mit dem ganzen thunderbird -compose Kram gemäß obiger Syntax schreibt, das mit fpChmod ausführbar setzt und dieses dann per TProcess ausführt. Aber das ist umständlich und nicht so elegant, eben ein Workaround.

Meine Frage jetzt also endlich: Weiß jemand, wie ich die Parameter von TProcess setzen muss, damit dieser "Verhau" von doppelten und einfachen Anführungszeichen korrekt an das Thunderbird EMail Programm übergeben wird?

Vielen Dank für Eure Hilfe!

Benutzeravatar
theo
Beiträge: 10497
Registriert: Mo 11. Sep 2006, 19:01

Re: TProcess und Parameter für Thunderbird -compose

Beitrag von theo »

K.A. hast du auch andere Varianten getestet.
AProcess.CommandLine oder ShellExecute?

S.a. http://wiki.freepascal.org/Executing_Ex ... _Quotes.29

Socke
Lazarusforum e. V.
Beiträge: 3158
Registriert: Di 22. Jul 2008, 19:27
OS, Lazarus, FPC: Lazarus: SVN; FPC: svn; Win 10/Linux/Raspbian/openSUSE
CPU-Target: 32bit x86 armhf
Wohnort: Köln
Kontaktdaten:

Re: TProcess und Parameter für Thunderbird -compose

Beitrag von Socke »

Debugge TProcess und schau nach, wie der Parameter übergeben wird.
Die doppelten Anführungszeichen sind angegeben, damit deinen Shell aus dem gesamten String einen einzigen Parameter macht, der an Thunderbird übergeben wird. TProcess setzt sie unter Windows selbsständig; unter Linux ist das nicht notwendig, da die Parameter einzeln übergeben werden können.

Nach meiner Einschätzung sollte folgendes funktionieren:

Code: Alles auswählen

AProcess.Executable := '/usr/bin/thunderbird';
AProcess.Parameters.Add ('-compose');
AProcess.Parameters.Add ('to=''john@example.com'',subject=''dinner'',body=''How about dinner tonight?'',attachment=''/tmp/speisekarte.pdf''');

theo hat geschrieben:ShellExecute

ShellExecute ist schon ein gewagter Versuch unter Linux :wink:
MfG Socke
Ein Gedicht braucht keinen Reim//Ich pack’ hier trotzdem einen rein

Benutzeravatar
theo
Beiträge: 10497
Registriert: Mo 11. Sep 2006, 19:01

Re: TProcess und Parameter für Thunderbird -compose

Beitrag von theo »

Socke hat geschrieben:ShellExecute ist schon ein gewagter Versuch unter Linux :wink:

Ja Sorry, war nur so ein "Brainstorming". ;-)

Aber was anderes: Kann jemand begründen, warum TProcess.CommandLine direkt "Deprecated" ist?
Ich meine es mag ja für bestimmte Parameterarten ungeeignet sein, aber muss es deshalb gleich ausgemustert werden?
Als "Convenience" Variante ist es doch OK.

volker
Beiträge: 24
Registriert: Mi 14. Nov 2012, 14:36
OS, Lazarus, FPC: Rosa Linux Desktop R8 (L 1.6, FPC 2.6.4)
CPU-Target: 32Bit

Re: TProcess und Parameter für Thunderbird -compose

Beitrag von volker »

Vielen Dank für die Antworten,
ich werde mal die Version von Socke und den Hinweis von theo ausprobieren.
Ich hatte nur mit den doppelten und einfachen Anführungszeichen gespielt und alles hat nicht funktioniert.

Ich finde es auch mehr als unschön, dass TProcess.CommandLine "Deprecated" ist und jedesmal der Compiler diesen Hinweis bringt, als ob man alles falsch gemacht hätte! Ich werd's trotzdem mal ausprobieren, vielen Dank noch mal!

EDIT: Grade ausprobiert: Funktioniert NICHT die Version von Socke.

marcov
Beiträge: 1100
Registriert: Di 5. Aug 2008, 09:37
OS, Lazarus, FPC: Windows ,Linux,FreeBSD,Dos (L trunk FPC trunk)
CPU-Target: 32/64,PPC(+64), ARM
Wohnort: Eindhoven (Niederlande)

Re: TProcess und Parameter für Thunderbird -compose

Beitrag von marcov »

theo hat geschrieben:
Socke hat geschrieben:ShellExecute ist schon ein gewagter Versuch unter Linux :wink:

Aber was anderes: Kann jemand begründen, warum TProcess.CommandLine direkt "Deprecated" ist?


Es ist einfach weg nicht Unix Kompatibel. Unix API will die Parameter vereinzelt haben. (sehe "man execve"), Commandlines sind eine Sache der Shell. Also wenn man auf API Ebene ein Commandine vom User bekommt muss man das Parsen und dafür einen halben Shell integrieren, weil Leute immer wieder mit obskurer Escape und Quotierung ausnahmen kommen.

Nach 5 Jahre immer wieder andere Quoting Bugs behoben zu haben, waren Michael und ich das satt. Schlimmer, es ist/war auch nicht ganz stabil weil die exakte Wirkung von .Commandline variiert(e) von Version nach Version. Wirklich jede Version bis 2.4.4 war anders. (danach werden Bugs in Commandline nicht mehr behoben weil es deprecated war)

Daneben gab es auch ähnliche Problemen mit Quotung auf andere OSen, und wir wollen nicht ein neues Shell->API (Quotierung, Escapes) System für jedes Platform entwerfen, und es gab Fragen über Mischung von Quote Systemen, und sind eben auf Unix details der Quotierung teilweise exakter Shell abhängig (Debian fing an bash durch dash zu ersetzen), und und und...

Also Schluss damit. Nur noch vereinzelte Argumenten, und ich will nie wieder ein .CommandLine Frage oder Bugreport sehen.,

Ich meine es mag ja für bestimmte Parameterarten ungeeignet sein, aber muss es deshalb gleich ausgemustert werden?


Aber Leute die damit aus Convenience anfangen kommen immer wieder in die Problemen, und haben dann schon ihr ganzes Programm (Eingabe, Persistenz) aufs Commandline Prinzip umgestellt und wollen nur noch einen Escape/Quote usw Ausnahme mehr um das sie die Teilen nicht umschreiben wollen.

Leute wählen anfangs immer den einfachsten Weg, auch wenn sie damit später in die Problemen kommen.

Ein typisches anderes Beispiel, und schon im TProcess Bereich ist das Leute immer wieder mit die TProcess Wiki Code anfangen die nicht für "lange" Output geeignet ist. IMHO soll das Beispiel verschwinden. Entweder RunCommand oder "volles" TProcess, nichts dazwischen.

Als "Convenience" Variante ist es doch OK.


Dafür gibst fpsystem. (oder shellexecute auf Windows) Das ist ein richtige Commandline interface. Es ist nicht Portabel, aber Commandlines sind das auch nicht, also kein Problem :D

Auch kann man selber sh -c "ganze commandzeile" mit TProcess ausführen.

Fpsystem und seine Shell Konventionen haben aber nichts mit TProcess zu tun.

Auch diesen Thread macht wahrscheinlich wieder dieser selben Fehler. Es gibt kein API Funktion um ein Commandline wie im Shell aus zu führen, und ALLE Quotes und Escape sind Shell spezifisch. Das heißt, außer fpsystem, aber diese Funktion startet einen Shell.

Es ist wirklich sehr einfach. Ausführen wie im Shell -> fpsystem. Nicht? Binary bitte mit vollem Pfad, Parameter vereinzelt und keinerlei Shell spezifische Quotierung. Die braucht man auch nicht, weil das Shell Quote System rein da ist um der Commandline in vereinzelte Parameter auf zu teilen. (auch das Shell muss schließlich execve ausführen).

Es gibt aber Ausnahmen, nämlich Programme, meist von nicht-Unix Ursprung, die Shell "verbotene" Zeichen (wie Quotes) unbedingt im Parameter haben wollen. Die Shell hat dafür eine Menge obskurer Möglichkeiten um solche Zeichen zu Escapen.

Vielleicht ist das hier das Problem, weil sehr große Crossplatform Anwendungen wie OpenOffice und Mozillaware oft ein bisschen Typisch sind, und dann soll man entweder fpsystem nutzen, oder einfachweg mit STRACE gucken was der Shell wirklich exekutiert, und das imitieren. So haben wir das originell mit Commandline auch gemacht

Aber zuerst versuchen: alle Quotes raus entweder Doppelt oder #39

Benutzeravatar
theo
Beiträge: 10497
Registriert: Mo 11. Sep 2006, 19:01

Re: TProcess und Parameter für Thunderbird -compose

Beitrag von theo »

OK, Danke.
Ich interpretiere das aber trotzdem so, dass wenn man weiß das keine Komplikationen vorkommen, CommandLine vertretbar ist (z.B. "/usr/bin/which progname")

Und keine weitere "CommandLine Frage oder Bugreport" von mir. Versprochen! :wink:

Socke
Lazarusforum e. V.
Beiträge: 3158
Registriert: Di 22. Jul 2008, 19:27
OS, Lazarus, FPC: Lazarus: SVN; FPC: svn; Win 10/Linux/Raspbian/openSUSE
CPU-Target: 32bit x86 armhf
Wohnort: Köln
Kontaktdaten:

Re: TProcess und Parameter für Thunderbird -compose

Beitrag von Socke »

marcov hat geschrieben:Aber zuerst versuchen: alle Quotes raus entweder Doppelt oder #39

Das war ja in mein Ansatz, nur scheint er nicht zu funktionieren.

Daher ist wohl strace die nächstebeste Möglichkeit umd die tatsächlichen Parameter zu ermitteln. Daran hatte ich gar nicht gedacht.
MfG Socke
Ein Gedicht braucht keinen Reim//Ich pack’ hier trotzdem einen rein

marcov
Beiträge: 1100
Registriert: Di 5. Aug 2008, 09:37
OS, Lazarus, FPC: Windows ,Linux,FreeBSD,Dos (L trunk FPC trunk)
CPU-Target: 32/64,PPC(+64), ARM
Wohnort: Eindhoven (Niederlande)

Re: TProcess und Parameter für Thunderbird -compose

Beitrag von marcov »

theo hat geschrieben:OK, Danke.
Ich interpretiere das aber trotzdem so, dass wenn man weiß das keine Komplikationen vorkommen, CommandLine vertretbar ist (z.B. "/usr/bin/which progname")


Ist

Code: Alles auswählen

RunCommand('/usr/bin/which',['progname'],s);


wirklich so viel Schwieriger?

marcov
Beiträge: 1100
Registriert: Di 5. Aug 2008, 09:37
OS, Lazarus, FPC: Windows ,Linux,FreeBSD,Dos (L trunk FPC trunk)
CPU-Target: 32/64,PPC(+64), ARM
Wohnort: Eindhoven (Niederlande)

Re: TProcess und Parameter für Thunderbird -compose

Beitrag von marcov »

Socke hat geschrieben:
marcov hat geschrieben:Aber zuerst versuchen: alle Quotes raus entweder Doppelt oder #39

Das war ja in mein Ansatz, nur scheint er nicht zu funktionieren.


Es gab noch immer single Quotes in deinen post? Ich meine

Code: Alles auswählen

 
    AProcess.Executable := '/usr/bin/thunderbird';
    AProcess.Parameters.Add ('-compose');
    AProcess.Parameters.Add ('to=john@example.com,subject=dinner,body=How about dinner tonight?,attachment=/tmp/speisekarte.pdf');


und alle Kommas mit #& encodieren. Oder einfachweg fpsystem nutzen, wenn es keine Pipes gibt.

Daher ist wohl strace die nächstebeste Möglichkeit umd die tatsächlichen Parameter zu ermitteln. Daran hatte ich gar nicht gedacht.


Man muss etwas mit k/strace Parameter spielen um strace zu überzeugen im falls eines fork's das Child zu folgen.

Benutzeravatar
theo
Beiträge: 10497
Registriert: Mo 11. Sep 2006, 19:01

Re: TProcess und Parameter für Thunderbird -compose

Beitrag von theo »

marcov hat geschrieben:wirklich so viel Schwieriger?


Nein, überhaupt nicht. Es ist nur so, dass kein Schwein welches die Deutsche Übersetzung von "Executing External Programs" liest auf diese Idee kommt.
Dort steht weder von fpSystem noch von RunCommand irgend etwas.
Und weil das so ist, nimmt man an, diese Funktionen seien nicht der empfohlene Weg.

EDIT: Habe mal wenigstens den "Überblick : Vergleich" eingehängt, damit man auf Ideen kommt.

Socke
Lazarusforum e. V.
Beiträge: 3158
Registriert: Di 22. Jul 2008, 19:27
OS, Lazarus, FPC: Lazarus: SVN; FPC: svn; Win 10/Linux/Raspbian/openSUSE
CPU-Target: 32bit x86 armhf
Wohnort: Köln
Kontaktdaten:

Re: TProcess und Parameter für Thunderbird -compose

Beitrag von Socke »

theo hat geschrieben:EDIT: Habe mal wenigstens den "Überblick : Vergleich" eingehängt, damit man auf Ideen kommt.

Ich habe mal die Tabelle im deutschen Artikel überarbeitet.

Wie oben schon geschrieben wurde, sind wohl die ganzen Artikel über das Starten von Programmen verbesserungswürdig.
MfG Socke
Ein Gedicht braucht keinen Reim//Ich pack’ hier trotzdem einen rein

Benutzeravatar
theo
Beiträge: 10497
Registriert: Mo 11. Sep 2006, 19:01

Re: TProcess und Parameter für Thunderbird -compose

Beitrag von theo »

Socke hat geschrieben:Wie oben schon geschrieben wurde, sind wohl die ganzen Artikel über das Starten von Programmen verbesserungswürdig.


Joh, Freiwillige vor! :wink:
Findest du den englischen Wiki Beitrag "übersetzenswert" oder ist der auch verbesserungswürdig?

Socke
Lazarusforum e. V.
Beiträge: 3158
Registriert: Di 22. Jul 2008, 19:27
OS, Lazarus, FPC: Lazarus: SVN; FPC: svn; Win 10/Linux/Raspbian/openSUSE
CPU-Target: 32bit x86 armhf
Wohnort: Köln
Kontaktdaten:

Re: TProcess und Parameter für Thunderbird -compose

Beitrag von Socke »

theo hat geschrieben:Findest du den englischen Wiki Beitrag "übersetzenswert" oder ist der auch verbesserungswürdig?

Ja, aber nicht so stark. Dort wird immerhin erklärt, dass CommandLine als deprecated eingestuft ist und die hier genannten Alternativen genutzt werden sollen.

Ein anderer Vorschlag wäre, die Beispiele in einzelne Seiten aufzuteilen und diese nur zu verlinken. Dann kann man in dem Hauptartikel die allgemeinen Konzepte und Vorgehensweisen zeigen.
MfG Socke
Ein Gedicht braucht keinen Reim//Ich pack’ hier trotzdem einen rein

Benutzeravatar
theo
Beiträge: 10497
Registriert: Mo 11. Sep 2006, 19:01

Re: TProcess und Parameter für Thunderbird -compose

Beitrag von theo »

Ich frage mich gerade, ob die Pflege der ganzen Sprachen/Übersetzungen nicht einfach eine massive Ressourcenverschwendung ist und letztlich immer unbefriedigend bleibt.
Im Grunde ist man doch besser bedient, wenn gar nicht erst die eingeschränkte Deutsche, Niederländische etc. Version vorgesetzt bekommt sondern gleich die Englische Version liest.

So viel Englisch muss man auch als Hobby Programmierer verstehen, sonst ist man ohnehin stark "behindert" im Beschaffen von Informationen.
Meistens geht es ja um Code Snippets und notfalls gibt es noch Google Translate.

Somit würden auch Erweiterungen wie sie Socke bei "Überblick : Vergleich" gemacht hat, gleich der Allgemeinheit zugutekommen.
Ich finde es nicht so gut, wenn jede Übersetzung ihr eigenes Süppchen kocht

Antworten