Schrift
Wiki:Tipp zum Debugging: use Data::Dumper; local $Data::Dumper::Useqq = 1; print Dumper \@var;
[thread]10285[/thread]

multipart message mit MIME::Lite und utf8

Leser: 4


<< |< 1 2 >| >> 14 Einträge, 2 Seiten
Superfrank
 2007-08-31 15:06
#98932 #98932
User since
2006-09-05
164 Artikel
BenutzerIn
[default_avatar]
Hallo,
ich versuche mit

CPAN:MIME::Lite

eine Mail zu senden, wo die Nachricht ein utf8-Text und ein Anhang eine html-Datei sein soll. Leider wird der Nachrichentext nicht utf8-kodiert und die Umlaute werden daher nicht korrekt dargestellt.

So funktioniert es nicht (Umlaute in Subject funktionieren):

Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
utf8::decode($subject);

my $msg = MIME::Lite->new(
From =>"mailer\@example.com",
To =>"$email",
Bcc =>"blubb\@example.com",
Subject =>"$subject",
Type =>"multipart/mixed");

$msg->attach(
Type =>"TEXT",
Encoding =>"8bit",
content-type.charset =>"utf8",
Data =>$mail_template->output
);

$msg->attach(
Type =>"text/html",
Encoding =>"base64",
Path =>"$path",
Filename =>"htmldatei.htm");

$msg->send();


Hat jemand eine Idee?

Viele Grüsse

Frank
sid burn
 2007-08-31 15:49
#98933 #98933
User since
2006-03-29
1520 Artikel
BenutzerIn

user image
Probier mal folgendes aus:

Code: (dl )
use open ':utf8'


zum anfang deines Codes hinzufügen.

Wenn dein Skript selber in UTF8 abgespeichert wird, musst du noch ein
Code: (dl )
use utf8;
hinzufügen um Perl zu sagen das der eigene Quellcode utf8 Codiert ist.

Ansonsten musst du irgendwo angeben das die normale Message utf8 als charset hat, damit der mail Client auch utf8 auswählt für die Anzeige.


Probier das mal aus, und sage ob es klappt.
Nicht mehr aktiv. Bei Kontakt: ICQ: 404181669 E-Mail: perl@david-raab.de
Superfrank
 2007-08-31 16:04
#98934 #98934
User since
2006-09-05
164 Artikel
BenutzerIn
[default_avatar]
Hallo,
vielen Dank für Deine Antwort, ich habe das Problem soeben selbst lösen können.
Ein Fehler war, daß es nicht "utf8" sondern "utf-8" heißen muß. Dann habe ich den Text-Teil mit

Code (perl): (dl )
1
2
3
4
5
6
7
8
     my $part = MIME::Lite->new(
            Type     =>"TEXT",
            Encoding =>"8bit",
            Data     =>$mail_template->output
            );
            $part->attr("content-type.charset" => 'utf-8');

            $msg->attach($part);


eingebaut, womit es funktioniert. Womöglich ist

Code (perl): (dl )
content-type.charset =>"utf-8"


innerhalb von attach() gar nicht erlaubt?

*einWochenendeohneUmlautehabend*


Frank
Superfrank
 2007-08-31 16:12
#98935 #98935
User since
2006-09-05
164 Artikel
BenutzerIn
[default_avatar]
hmm, jetzt sind die Umlaute im Subject wieder weg und wenn ich das

Code (perl): (dl )
utf8::decode($subject);


entferne klappt ein kleines ü aber ein großes Ä nicht.

Ich guck noch mal.

Edit:
Es gibt jetzt nur noch einen Fehler mit Umlauten als Großbuchstaben im Subject.
Kleinbuchstaben sind ok aber Großbuchstaben fehlen einfach.
Superfrank
 2007-08-31 16:27
#98936 #98936
User since
2006-09-05
164 Artikel
BenutzerIn
[default_avatar]
Ich habs!!

Der Fehler, daß Großbuchstaben als Umlaute nicht im Subject dargestellt werden lag an dem tollen Kaspersky-Spamfilter. Den ausgeschaltet und schon läuft es.
Das ist dann nicht mehr mein Problem...

Viel Grüsse

Frank
sid burn
 2007-08-31 16:57
#98937 #98937
User since
2006-03-29
1520 Artikel
BenutzerIn

user image
Nur, weil es am Ende richtig ausschaut, heißt es nicht das es auch richtig ist!

Ich mache gerade selber Teste mit Mime::Lite. Bisher habe ich es noch nicht hinbekommen das er UTF8 gesendet hat. Alle seine Outputs wandelt er automatisch nach iso-8859-1 um. Das liegt am PerlIO Layer.

Einzige Möglichkeit das zu umgehen ist die Lite.pm direkt zu bearbeiten und ein "use open ':utf8'" hinzuzufügen. nur dann funktioniert überall alles korrekt mit "utf8". Ich muss nochmal schauen ob man das nicht über das MIME::Lite Interface verändern kann.

Aber habe dazu im Moment keine Zeit. Später...


So wäre das Skript eigentlich richtig:
Code (perl): (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#!/usr/bin/perl
use strict;
use warnings;
use utf8;
use open ':utf8';
use MIME::Lite;

my $msg = MIME::Lite->new(
    To       => 'example@example.com',
    Subject  => 'UTF-8 Test',
    Encoding => '8bit',
    Type     => 'text/plain',
    Data     => 'Hälöö',
);
$msg->attr('content-type.charset' => 'UTF8');
$msg->send;


Allerdiengs sendet es trotzdem in iso-8859-1 da die Anweisung "use open ':utf8'" den I/O für eine andere Dateien nämlich die MIME/Lite.pm nicht überschreibt.

Daher funktioniert es nur wenn du ein "use open ':utf8'" auch in der MIME/Lite.pm hinzufügst.
Nicht mehr aktiv. Bei Kontakt: ICQ: 404181669 E-Mail: perl@david-raab.de
Superfrank
 2007-08-31 18:32
#98941 #98941
User since
2006-09-05
164 Artikel
BenutzerIn
[default_avatar]
Du hast recht. Irgendwas ist da nicht sauber. Wenn ich eine Mail "oldschool" mit

Code (perl): (dl )
open MAIL, "| /usr/sbin/sendmail -t -oi" or die "open: $!";


sende kommen große Umlaute auch bei aktiviertem Spamfilter an. Ich werde da bei Gelegenheit nochmal nachforschen.

Viele Grüsse

Frank
sid burn
 2007-08-31 19:06
#98942 #98942
User since
2006-03-29
1520 Artikel
BenutzerIn

user image
Superfrank+2007-08-31 16:32:21--
...kommen große Umlaute auch bei...

Was sind "große Umlaute" ?
Nicht mehr aktiv. Bei Kontakt: ICQ: 404181669 E-Mail: perl@david-raab.de
Superfrank
 2007-08-31 19:08
#98943 #98943
User since
2006-09-05
164 Artikel
BenutzerIn
[default_avatar]
ÄÖÜ
sid burn
 2007-08-31 20:34
#98946 #98946
User since
2006-03-29
1520 Artikel
BenutzerIn

user image
Aus deiner einen Zeile die du gepostet hast kann man aber auch nicht sagen ob alles korrekt ist, vorallem versucht MIME::Lite intern genauso zu senden. Ob und wie Zeichen richtig dargestellt werden hängt von einigen Punkten ab:

* Ist der Sourcecode selber UTF8?
* Ist "use utf8" gesetzt damit perl darüber bescheid weiß?
* Enthält die variable etc. die man ausgiebt UTF8 Daten?
* (Ist das UTF8 Flag für eine Variable gesetzt)
* Ist "use open", "binmode" etc. so gesetzt das die Ausgabe UTF-8 ist?
* Wird der Mail ein Encoding mitgeteilt. Ist es richtig? und welches Encoding nutzt der Mail Client zur Anzeige wenn nicht?

Durch das nicht beachten einer Regel in der Kette, kann die Ausgabe falsch werden. Allerdiengs kann z.B. durch das nicht beachten mehrere dieser Regeln wieder das Ergebnis richtig aussehen. Deswegen kann es aber dazwischen immernoch Probleme geben.


Ein kleines beispiel:
* Du nutzt UTF8 in Sourcecode. Also einen Editor der in UTF8 schreibt
* Du setzt allerdiengs kein "use utf8".
* Du gibst die Daten direkt aus ohne "use open ':utf8'" oder binmode zu setzen
* Sagen wir es handelt sich um eine Webseite. Du setzt aber bei der Ausgabe das charset auf "utf8"
* Ergebnis: Die Ausgabe sieht korrekt aus:

Probleme:
* Wenn du z.B. "ä" schreibst dann siehst du auch ein "ä". Da dein Editor ja alles in UTF-8 anzeigt/schreibt. Da du aber kein "use utf8" nutzt erkennt Perl ein "ä" nicht als ein "ä" an. Sondern sieht hier zwei Bytes (zeichen) hintereinander. Defaultmäßig springt perl dann zu iso-8859-1. Also es zeigt dir dann die Zeichen aus dem iso-8859-1 Zeichensatz an. Was natürlich kein ä ist, sondern zwei "komische" zeichen.

* Da kein "use open ':utf8'" oder ähnliches benutzt wird gibt Perl Defaultmäßig alles "iso-8859-1" aus. Da du "use utf8" nicht nutzt, und die interne Darstellung sowieso schon "iso-8859-1" ist werden einfach diese beiden komischen zeichen 1:1 ausgegeben

* Allerdiengs hast du im Charset angegeben das der Browser utf8 nutzen soll. Und Glücklicherweise ergeben genau diese beiden zeichen die in iso-8859-1 sind ein "ä" in utf8. Es sieht also alles korrekt aus.

-------

Auf deiner oberen Zeile übertragen kann das jetzt vieles bedeuten. So kann man nicht sagen warum es "korrekt" arbeitet. Es hängt davon was du sonst noch so in deinem Code stehen hast.

Wenn du beispielsweise einen Editor hast der in utf8 Speichert. Du hast "use utf8" im code stehen. Und schreibst jetzt die Zeile wie oben dann würden "äöü" auch Korrekt ausgegeben.

Den Perl weiß bescheid das der Sourcecode in utf8 geschrieben ist. Das heißt ein "ä" würde auch als ein "ä" erkannt, und nicht als zwei bytes. Wenn du jetzt kein "use open ':utf8'" stehen hast oder mit binmode nicht explizit die ausgabe des Filehandes "MAIL" auf utf8 setzt dann wandelt Perl die Unicode Zeichen nach "iso-8859-1" um. Das heißt anstatt ein utf8 "ä" das zweibytes groß ist, wird die codierung eines "ä" aus dem iso-8859-1 Zeichensatzes genutzt.

Damit wird die email verschickt. Und da du keine expliziten charset angibst gehen die meisten eMail programme meist von "iso-8859-1" oder "cp1252" aus. Schlußendlich wird auch in der Mail ein richtiges "ä" angezeigt.

Alelrdiengs wird nicht wirklich utf8 genutzt. Würdest du irgendein Zeichen nutzen das nicht in iso-8859-1 vorkommt z.B. das € (Euro) zeichen. Dann würdest du dieses auch nicht in der Mail sehen.

(Obwohl das "€" (Euro) zeichen vllt. schlecht gewählt ist, gibt nämlich umstände wo du es doch siehst, trotzt iso-8859-1 Codierung das es eigentlich nicht enthält. Aber ging ja erstmal nur um das Prinzip.)
Nicht mehr aktiv. Bei Kontakt: ICQ: 404181669 E-Mail: perl@david-raab.de
<< |< 1 2 >| >> 14 Einträge, 2 Seiten



View all threads created 2007-08-31 15:06.