Was aber ist, wenn ich wie jetzt einen gesamten Mailbody "$mailbody" "$subject" und noch weitere Variablen mit mehreren Wörtern nutze, welche nicht alle Mime codiert sind ?
Kann ich das ganze in einer Funktion auslagern und einfach den gesamten Text durchlaufen lassen, so dass ich danach einen "normalen" Fliesstext mit lesbaren Inhalten habe ?
Das MIME::Words ist speziell da, das du innerhalb des Textes mehrere Verschiedene Codierungen nutzen kannst. Und es kann sogar sein das nur einzelne Wörter Codiert sind. Es ist also bereits vorgesehen das nur teile Codiert sind.
Der Enctype müßte ja rein theoretisch nur einmal ermittelt werden je Text, oder?
Ne, wie bereits gesagt jedes Wort kann mit MIME::Words eine andere Codierung haben. Daher kannst diese nicht einmalig ermitteln.
Sollte also heissen, dass ich aus jedem Wort innerhalb vom String "$enc" ein dekodiertes Wort nach 'US-ASCII' zurückerhalte. Im falle von meinem Beispiel hat es leider nicht geklappt. Die Wörter waren weiter wie oben
beschrieben encodiert.
Nein, du erhälst sozusagen eine Binär darstellung, und der zweite Wert sagt dir in welcher Codierung der String vorhanden ist. Wenn du das in die interne Perl darstellung umwandeln möchtest musst du nochmal selber decodieren. Das was MIME::Words macht ist eben die einzelnen Wörter oder beser gesagt Zeichen zum Beispiel Base64 codiert umzuwandeln so das du es Problemlos zum Beispiel über das SMTP Protokoll senden kannst.
Was mach ich falsch, ich denke das erste Element [0] sollte doch der Header sein in richtiger Dekodierung ?
Nein, der erste Wert ist der String in binärer darstellung. Der zweite Array Wert sagt in welcher Codierung dieser ist. Du musst mit decode() also diesen Part nochmals decodieren. Aber nur wenn auch der zweite Wert gesetzt ist. Wenn kein zweites Element im Array steht brauchst du nicht dekodieren.
Warum ist per Dumper ausgegeben alles richtig ?
Das hängt alles davon ab, ob du decodiert hast oder nicht. Wenn du einen binären String hast, und dieser liegt nicht in der UTF-8 Dekodierung vor, also sagen wir mal Latin-1 und du gibst etwas aus, dann wandelt Perl 5 den Wert immer vorher binär um. Wenn du
use open ':utf8';
use open ':std';
definiert hast dann wandelt er alles vorher in einer UTF-8 Sequenz um. Wenn deine Codierung nicht richtig gesetzt ist, kann es dann durchaus passieren das er dann doppelt en/decodiert. Data::Dumper gibt den Wert direkt ohne en/decodierung aus. Das kann dann richtig aussehen, muss aber nicht. In deinem Beispiel sieht das übrigens falsch ist. Wenn es UTF-8 ist und die dekodierung richtig gesetzt ist, würde Data::Dumper dort UTF-8 Codepoints anzeigen, was es nicht tut. Ein Indikator dafür das du ein UTF-8 String hast, aber nicht dekodiert hast. Daher Perl weiß nicht das es UTF-8 ist, und sieht es als einen Binärstring an. Und wenn du es mit Data::Dumper direkt ausgiebst wird der Binärstring direkt ausgegeben. Was dann auf nem UTF-8 Terminal auch korrekt "ausschaut".