Formatierte Signatur in Thunderbird Topic is solved

Stelle Fragen zur Programmierung mit Autohotkey

Moderator: jNizM

Rockett
Posts: 9
Joined: 07 May 2024, 02:15

Formatierte Signatur in Thunderbird

07 May 2024, 03:10

Autohotkey Version 1

Hallo Zusammen,

leider habe ich massive Probleme aktuell damit, mein Script zum laufen zu bringen. Diverse Methoden um formatierten Text (Farbe und Größe) in eine Email einzufügen habe ich bereits getestet. Die zunächst erfolgversprechende Methode einen "clip" zu erstellen, der später in die Zwischenablage kopiert wird, bricht gerade zusammen.

Hier erstmal mein Code.

Fürs erstellen des Clips:

Code: Select all

^!k::
Send ^c ; copy selected text and images to the clipboard
Sleep, 1000
FileAppend,  %ClipboardAll%, rawclip.clip
Return
Danach benenne ich die Datei natürlich so um wie ich um unteren Code benötige

Für das laden des Clips und ausgeben in der Email:

Code: Select all

::mfg::
FileRead, Clipboard, *c usersignatur\mfg.clip
Sleep 200 
Send ^v
Return
Unmittelbar, nachdem der clip erstellt ist, funktioniert das auch wunderbar. Farbe und Größe stimmen. Irgendwann im laufe des Tages, spätestens am nächsten Tag, kopiert er die Formatierung dann nicht mehr und gibt die Signatur in diesem fall unformatiert aus.

Ich verstehe einfach nicht, woran das liegt. Danach muss ich den Clip neu erstellen, damit es wieder funktioniert. So kann ich das natürlich nicht wirklich brauchbar an einen Benutzer weitergeben.

Es ist auch keine besonders aufwendige Formatierung, lediglich Farbe Braun und Größe 8px.

Hat jemand das selbe Problem vielleicht oder kann helfen. Ich hab das ganze Internet durchsucht und auch alle Beiträge im Archvierten Forum von 2009 bis 2015 gelesen. Da sind aber Codes teilweise nicht mehr verfügbar, weil der Download down ist. Da gibt es ähnliche Ansätze, die ich mir als Beispiel hätte nehmen können.

Ich hoffe sehr ihr könnt mir helfen. Vielen Dank!
just me
Posts: 9763
Joined: 02 Oct 2013, 08:51
Location: Germany

Re: Formatierte Signatur in Thunderbird

07 May 2024, 04:42

Moin,

ich habe das vor vielen Jahren auch mal probiert. Das Ergebnis war identisch. Anscheinend behalten die im Clipboard enthaltenen Daten hinsichtlich der Formatierung Abhängigkeiten von den Daten der Anwendung, aus der sie kopiert wurden. Dies Abhängigkeiten können später aus welchem Grund auch immer nicht mehr aufgelöst werden. Die Formatierung geht damit größtenteils verloren. Ich habe bisher keine Lösung gefunden.
Rockett
Posts: 9
Joined: 07 May 2024, 02:15

Re: Formatierte Signatur in Thunderbird

07 May 2024, 05:14

Gibt es sonst einen anderen Ansatz der 2024 funktioniert? :)

Ich habe gesehen das es z.B. Word programmspezifisch funktionieren soll. Ich muss ehrlich gestehen, das suchen in diesem Forum ist eine Qual und funktioniert zum teil gar nicht. Ich bekomme immer die Meldung ich hätte eben schon gesucht und solle es in 30 Sekunden noch mal versuchen.
KHA
Posts: 408
Joined: 21 Aug 2018, 11:11

Re: Formatierte Signatur in Thunderbird  Topic is solved

07 May 2024, 06:13

Hi,
Wie wäre es mit folgendem Ansatz:
Inhalt von mfg.txt
<p style='font-size: 26px; color: red; font-family: Arial; font-weight: bold'> Dies ist ein Beispieltext</p>

Code: Select all

#NoEnv
#Singleinstance Force

FileRead, HtmlText, mfg.txt
::mfg::
SetClipboardHTML(HtmlText)
  SendInput ^v
return

SetClipboardHTML(HtmlBody, HtmlHead:="", AltText:="") {       ; v0.67 by SKAN on D393/D42B
Local  F, Html, pMem, Bytes, hMemHTM:=0, hMemTXT:=0, Res1:=1, Res2:=1   ; @ tiny.cc/t80706
Static CF_UNICODETEXT:=13,   CFID:=DllCall("RegisterClipboardFormat", "Str","HTML Format")

  If ! DllCall("OpenClipboard", "Ptr",A_ScriptHwnd)
    Return 0
  Else DllCall("EmptyClipboard")

  If (HtmlBody!="")
  {
      Html     := "Version:0.9`r`nStartHTML:00000000`r`nEndHTML:00000000`r`nStartFragment"
               . ":00000000`r`nEndFragment:00000000`r`n<!DOCTYPE>`r`n<html>`r`n<head>`r`n"
                         . HtmlHead . "`r`n</head>`r`n<body>`r`n<!--StartFragment -->`r`n"
                              . HtmlBody . "`r`n<!--EndFragment -->`r`n</body>`r`n</html>"

      Bytes    := StrPut(Html, "utf-8")
      hMemHTM  := DllCall("GlobalAlloc", "Int",0x42, "Ptr",Bytes+4, "Ptr")
      pMem     := DllCall("GlobalLock", "Ptr",hMemHTM, "Ptr")
      StrPut(Html, pMem, Bytes, "utf-8")

      F := DllCall("Shlwapi.dll\StrStrA", "Ptr",pMem, "AStr","<html>", "Ptr") - pMem
      StrPut(Format("{:08}", F), pMem+23, 8, "utf-8")
      F := DllCall("Shlwapi.dll\StrStrA", "Ptr",pMem, "AStr","</html>", "Ptr") - pMem
      StrPut(Format("{:08}", F), pMem+41, 8, "utf-8")
      F := DllCall("Shlwapi.dll\StrStrA", "Ptr",pMem, "AStr","<!--StartFra", "Ptr") - pMem
      StrPut(Format("{:08}", F), pMem+65, 8, "utf-8")
      F := DllCall("Shlwapi.dll\StrStrA", "Ptr",pMem, "AStr","<!--EndFragm", "Ptr") - pMem
      StrPut(Format("{:08}", F), pMem+87, 8, "utf-8")

      DllCall("GlobalUnlock", "Ptr",hMemHTM)
      Res1  := DllCall("SetClipboardData", "Int",CFID, "Ptr",hMemHTM)
  }

  If (AltText!="")
  {
      Bytes    := StrPut(AltText, "utf-16")
      hMemTXT  := DllCall("GlobalAlloc", "Int",0x42, "Ptr",(Bytes*2)+8, "Ptr")
      pMem     := DllCall("GlobalLock", "Ptr",hMemTXT, "Ptr")
      StrPut(AltText, pMem, Bytes, "utf-16")
      DllCall("GlobalUnlock", "Ptr",hMemTXT)
      Res2  := DllCall("SetClipboardData", "Int",CF_UNICODETEXT, "Ptr",hMemTXT)
  }

  DllCall("CloseClipboard")
  hMemHTM := hMemHTM ? DllCall("GlobalFree", "Ptr",hMemHTM) : 0

Return (Res1 & Res2)
}
User avatar
gregster
Posts: 9224
Joined: 30 Sep 2013, 06:48

Re: Formatierte Signatur in Thunderbird

07 May 2024, 07:43

Rockett wrote:
07 May 2024, 05:14
Ich habe gesehen das es z.B. Word programmspezifisch funktionieren soll. Ich muss ehrlich gestehen, das suchen in diesem Forum ist eine Qual und funktioniert zum teil gar nicht. Ich bekomme immer die Meldung ich hätte eben schon gesucht und solle es in 30 Sekunden noch mal versuchen.
Benutz doch unsere 'Google Custom Search' (dort ist auch die (engl.) Dokumentation und das archivierte Forum inkludiert und es kann entsprechend geflitert werden):
https://www.autohotkey.com/search/
(auch über den Link 'Web Search' oben links im Forum zu erreichen.)
Rockett
Posts: 9
Joined: 07 May 2024, 02:15

Re: Formatierte Signatur in Thunderbird

08 May 2024, 07:09

KHA wrote:
07 May 2024, 06:13
Hi,
Wie wäre es mit folgendem Ansatz:
Inhalt von mfg.txt
<p style='font-size: 26px; color: red; font-family: Arial; font-weight: bold'> Dies ist ein Beispieltext</p>

Code: Select all

#NoEnv
#Singleinstance Force

FileRead, HtmlText, mfg.txt
::mfg::
SetClipboardHTML(HtmlText)
  SendInput ^v
return

SetClipboardHTML(HtmlBody, HtmlHead:="", AltText:="") {       ; v0.67 by SKAN on D393/D42B
Local  F, Html, pMem, Bytes, hMemHTM:=0, hMemTXT:=0, Res1:=1, Res2:=1   ; @ tiny.cc/t80706
Static CF_UNICODETEXT:=13,   CFID:=DllCall("RegisterClipboardFormat", "Str","HTML Format")

  If ! DllCall("OpenClipboard", "Ptr",A_ScriptHwnd)
    Return 0
  Else DllCall("EmptyClipboard")

  If (HtmlBody!="")
  {
      Html     := "Version:0.9`r`nStartHTML:00000000`r`nEndHTML:00000000`r`nStartFragment"
               . ":00000000`r`nEndFragment:00000000`r`n<!DOCTYPE>`r`n<html>`r`n<head>`r`n"
                         . HtmlHead . "`r`n</head>`r`n<body>`r`n<!--StartFragment -->`r`n"
                              . HtmlBody . "`r`n<!--EndFragment -->`r`n</body>`r`n</html>"

      Bytes    := StrPut(Html, "utf-8")
      hMemHTM  := DllCall("GlobalAlloc", "Int",0x42, "Ptr",Bytes+4, "Ptr")
      pMem     := DllCall("GlobalLock", "Ptr",hMemHTM, "Ptr")
      StrPut(Html, pMem, Bytes, "utf-8")

      F := DllCall("Shlwapi.dll\StrStrA", "Ptr",pMem, "AStr","<html>", "Ptr") - pMem
      StrPut(Format("{:08}", F), pMem+23, 8, "utf-8")
      F := DllCall("Shlwapi.dll\StrStrA", "Ptr",pMem, "AStr","</html>", "Ptr") - pMem
      StrPut(Format("{:08}", F), pMem+41, 8, "utf-8")
      F := DllCall("Shlwapi.dll\StrStrA", "Ptr",pMem, "AStr","<!--StartFra", "Ptr") - pMem
      StrPut(Format("{:08}", F), pMem+65, 8, "utf-8")
      F := DllCall("Shlwapi.dll\StrStrA", "Ptr",pMem, "AStr","<!--EndFragm", "Ptr") - pMem
      StrPut(Format("{:08}", F), pMem+87, 8, "utf-8")

      DllCall("GlobalUnlock", "Ptr",hMemHTM)
      Res1  := DllCall("SetClipboardData", "Int",CFID, "Ptr",hMemHTM)
  }

  If (AltText!="")
  {
      Bytes    := StrPut(AltText, "utf-16")
      hMemTXT  := DllCall("GlobalAlloc", "Int",0x42, "Ptr",(Bytes*2)+8, "Ptr")
      pMem     := DllCall("GlobalLock", "Ptr",hMemTXT, "Ptr")
      StrPut(AltText, pMem, Bytes, "utf-16")
      DllCall("GlobalUnlock", "Ptr",hMemTXT)
      Res2  := DllCall("SetClipboardData", "Int",CF_UNICODETEXT, "Ptr",hMemTXT)
  }

  DllCall("CloseClipboard")
  hMemHTM := hMemHTM ? DllCall("GlobalFree", "Ptr",hMemHTM) : 0

Return (Res1 & Res2)
}
Danke! Das macht genau was ich brauche! Html kann ich von daher ist das optimal!

Wäre es zu viel verlangt, wenn du uns sagen könntest, was die einzelnen schritte tun? Ich würde es gerne auch verstehen, wenn dir das zuviel aufwand ist, kann ich das natürlich verstehen und bin erstmal total dankbar für deine Lösung!

@gregster
danke für den Tipp mit der Suche!
KHA
Posts: 408
Joined: 21 Aug 2018, 11:11

Re: Formatierte Signatur in Thunderbird

08 May 2024, 10:37

Die Funktion stammt von SKAN, er kann am besten erklären, was sie macht.
Aber hier ist, was ich verstehe:

Die Funktion ermöglicht das Kopieren von HTML-Inhalten in die Zwischenablage.

Hier ist eine kurze Schritt-für-Schritt-Erklärung:
1. Öffnen der Zwischenablage
2. Leeren der Zwischenablage
3. Erstellung von HTML-Header und -Body
4. Konvertierung in UTF-8 und Speicherung
(Die Konvertierung in UTF-8 sowie das Erstellen und Laden von Speicherblöcken sind mir nicht ganz klar, aber @just me ist der Profi auf diesem Gebiet und kann das bestimmt erklären.)
5. Schließen der Zwischenablage und Freigabe von Ressourcen
just me
Posts: 9763
Joined: 02 Oct 2013, 08:51
Location: Germany

Re: Formatierte Signatur in Thunderbird

09 May 2024, 03:32

Moin, ich versuche mal, die restlichen Geheimnisse zu klären.

Den Aufbau des HTML-Clipboardformats hat Microsoft bestimmt, höchstwahrscheinlich so, dass die eigenen Anwendungen am meisten davon profitieren.
Damit man überhaupt die gültige FormatID erhält, muss sich die Anwendung über die ebenfalls von Microsoft vordefinierte Zeichenfolge HTML Format "registrieren".

Code: Select all

CFID := DllCall("RegisterClipboardFormat", "Str", "HTML Format", "UInt") ; HTML clipboard format ID
So erhält man die 'aktuelle' FormatID des HTML-Formats.

Für den Aufbau des im Clipboard abgelegten Formats gibt es strikte Vorgaben. Die englische Beschreibung findet sich hier: HTML Clipboard Format. Das Format besteht im Kern aus drei Bereichen:
  1. Formatheader
  2. HTML-Element
  3. Formatfooter
Die Daten müssen im Format UTF-8 gespeichert werden.

SKANs Funktion setzt nun dieses Format zusammen und schließt dabei die in HtmlBody und HtmlHead (kann leer sein) übergebenen Werte ein.
Dann bestimmt er, wie viele Bytes das im UTF-8 Format benötigt

Code: Select all

      Bytes    := StrPut(Html, "utf-8")
reserviert einen globalen Speicherbereich passender Größe

Code: Select all

      hMemHTM  := DllCall("GlobalAlloc", "Int",0x42, "Ptr",Bytes+4, "Ptr")
holt sich einen Pointer für den Bereich

Code: Select all

      pMem     := DllCall("GlobalLock", "Ptr",hMemHTM, "Ptr")
und schreibt den Text als UTF-8 in diesen Bereich

Code: Select all

      StrPut(Html, pMem, Bytes, "utf-8")
Mit den folgenden

Code: Select all

      F := DllCall("Shlwapi.dll\StrStrA", "Ptr",pMem, "AStr","<html>", "Ptr") - pMem
      StrPut(Format("{:08}", F), pMem+23, 8, "utf-8")
Paaren sucht er im globalen Speicherbereich nach dem Beginn der Zeichenfolgen <html>, <\html>, <!--StartFra und <!--EndFragm und versorgt die Offsets für
StartHTML, EndHTML, StartFragment und EndFragment. Das Ganze wird dann ins Clipboard geschrieben und fertig.
User avatar
LuckyJoe
Posts: 347
Joined: 02 Oct 2013, 09:52

Re: Formatierte Signatur in Thunderbird

09 May 2024, 04:27

Hallo zusammen,

wow, tolle Funktion! :clap:

Die einzulesende Text-Datei ("mfg.txt") muss nach meinem Testen im Ansi-Format vorliegen. Ich bin seit geraumer Zeit dabei, mit AHK v1.x eine Textbausteinverwaltung zu erstellen und habe die Dateien alle im UTF-8-Format vorliegen. Wie muss SetClipboardHTML() angepasst werden, damit auch UTF-8-Dateien eingelesen werden können? Ich habe dazu in einem Forum zwar etwas gefunden (viewtopic.php?f=83&t=116080), aber ich bekomme das nicht angepasst. Ich würde gerne in v1.x weiterentwickeln.
Herzliche Grüße aus dem Rheinland
Lucky Joe
just me
Posts: 9763
Joined: 02 Oct 2013, 08:51
Location: Germany

Re: Formatierte Signatur in Thunderbird

09 May 2024, 05:11

Moin,

wenn Du die Funktion mit in Dateien gespeicherten Bausteinen verwenden willst, ist die Codierung relativ egal, weil Du die Daten als Text einlesen musst. Dabei werden Sie automatisch in das Format Deiner AHK-Version (ANSI/Unicode) konvertiert. Dafür müssen UTF-8 Dateien aber eine BOM haben, wenn Du beim Lesen bzw. über FileEncoding keine Kodierung vorgibst.
User avatar
LuckyJoe
Posts: 347
Joined: 02 Oct 2013, 09:52

Re: Formatierte Signatur in Thunderbird

09 May 2024, 09:05

@just me: Danke, auch für die Erklärungen der Funktion!
Herzliche Grüße aus dem Rheinland
Lucky Joe
Rockett
Posts: 9
Joined: 07 May 2024, 02:15

Re: Formatierte Signatur in Thunderbird

10 May 2024, 06:16

Danke für eure Zeit und Mühe! Bin begeistert
Rockett
Posts: 9
Joined: 07 May 2024, 02:15

Re: Formatierte Signatur in Thunderbird

10 May 2024, 08:58

Hab noch ne Frage dazu... ich bekomme es nicht hin, den code 2x hintereinander mit einem trigger auszulösen.

Ich denke ich mache da einfach 100 syntax fehler.

Das sind die Zwei, die eingelesen und hintereinander ausgelöst werden sollen. Der trigger dafür ist ::.kd::

htmlsnippets\.kd.txt
usersignatur\mfg.txt

Ich weiß nicht ob es sinn macht meine 10 fehlversuche hier zu posten :) Glaube das verwirrt nur.
KHA
Posts: 408
Joined: 21 Aug 2018, 11:11

Re: Formatierte Signatur in Thunderbird

10 May 2024, 09:23

z.B

Code: Select all

FileRead, HtmlText, htmlsnippets.kd.txt
FileRead, HtmlText1, usersignaturmfg.txt

::.kd::
SetClipboardHTML(HtmlText HtmlText1)
  SendInput ^v
return
*nicht getestet, müsste aber funktionieren.
Rockett
Posts: 9
Joined: 07 May 2024, 02:15

Re: Formatierte Signatur in Thunderbird

13 May 2024, 02:41

@KHA Bingo! Funktioniert. Zu simpel :lol: Was ich alles für nen mist probiert habe willst du gar nicht wissen

Return to “Ich brauche Hilfe”

Who is online

Users browsing this forum: No registered users and 29 guests