Problem bei Multipart-Mail mit Sonderzeichen
DeWitt
- perl
Hallo SELFHTML-Gemeinde,
Ein Skript, das ich eigentlich schon seit längerem verwende, und das bis jetzt eigentlich auch problem funktioniert hat, macht plötzlich Zicken. Da ich den Fehler partout nicht finde, wollte ich mal hier um Rat fragen - manchmal sieht man ja einfach den Wald vor lauter Bäumen nicht.
Mein Problem ist, dass Sonderzeichen in einer Plain-Text-Mail problemlos angezeigt werden, in einer Multipart-Email jedoch nicht:
Plain-Text:
===CODE ANFANG====
To: dew1tt@gmx.de
From: foo@bar.de (Foo Bar)
Subject: Test
Content-Transfer-Encoding: quoted-printable
MIME-Version: 1.0
Content-Type: text/plain; charset=ISO-8859-1
Das gärende Öl fließt über die Äcker
===CODE ENDE====
Multipart-Mail:
===CODE ANFANG====
To: dew1tt@gmx.de
From: foo@bar.de (Foo Bar)
Subject: DTest
Content-Transfer-Encoding: quoted-printable
MIME-Version: 1.0
Content-Type: multipart/alternative; "boundary=++webmailboundary_alt++"
This is a multi-part message in MIME format.
--++webmailboundary_alt++
Content-Type: text/plain; charset="ISO-8859-1"
Content-Transfer-Encoding: quoted-printable
Das gdrende Vl flie_t |ber die Dcker
--++webmailboundary_alt++
Content-Type: text/html; charset="ISO-8859-1"
Content-Transfer-Encoding: quoted-printable
Das gdrende Vl flie_t |ber die Dcker
--++webmailboundary_alt++--
-------
===CODE ENDE====
Die uninteressanten Header-Angaben, die während dem Mailtransfer hinzukommen, habe ich entfernt. Was mich wundert, sind allerdings die Striche ("-------") am Ende der Multipart-Mail, da diese auch nicht aus meinem Programm stammen.
Hier der Ausschnitt aus dem objektorientierten Modul, das den Mailversand übernimmt:
===CODE ANFANG====
my $boundary_alt = "++webmailboundary_alt++";
# Mail-Programm starten
if ( open(MAIL,"|".$this->{'mailprog'}." -t") ) {
#Mailheader
print MAIL "To: ".join(", ",@{$this->{'to'}})."\n";
print MAIL "From: ".$this->{'from'};
print MAIL " (".$this->{'namefrom'}.")" if exists($this->{'namefrom'});
print MAIL "\n";
print MAIL "Cc: ".join(", ",@{$this->{'cc'}})."\n" if exists($this->{'cc'});
print MAIL "Bcc: ".join(", ",@{$this->{'bcc'}})."\n" if exists($this->{'bcc'});
print MAIL "Subject: ".$this->{'subject'}."\n";
print MAIL "Content-Transfer-Encoding: quoted-printable\n";
print MAIL "MIME-Version: 1.0\n";
#Mail-Subheader, wenn HTML-Teil vorhanden
if ( exists($this->{'htmltext'}) ) {
print MAIL "Content-Type: multipart alternative; \"boundary=$boundary_alt\"\n\n";
print MAIL "This is a multi-part message in MIME format.\n";
#Plain-Text
print MAIL "--$boundary_alt\n";
}
#Plain-Text
print MAIL "Content-Type: text/plain; charset=\"ISO-8859-1\"\n";
print MAIL "Content-Transfer-Encoding: quoted-printable\n\n";
print MAIL $this->{'text'}."\n\n";
#Mail-Subheader, wenn HTML-Teil vorhanden
if ( exists($this->{'htmltext'}) ) {
#HTML-Text
print MAIL "--$boundary_alt\n";
print MAIL "Content-Type: text/html; charset=\"ISO-8859-1\"\n";
print MAIL "Content-Transfer-Encoding: quoted-printable\n\n";
print MAIL $this->{'htmltext'};
#Mail-Boundary schließen
print MAIL "\n--$boundary_alt--";
}
close(MAIL);
return 1;
}
else {
# [...] Fehlerbehandung
return undef;
}
===CODE ENDE====
Vielleicht findet jemand den Fehler/das Problem? Ich lasse mich auch gerne über die korrekte Angabe des "Content-Transfer-Encoding" belehren, da ich diese Angabe einfach von anderen Multipart-Mails "abgeschaut" habe ;).
Ciao,
David //aka DeWitt
--++webmailboundary_alt++
Content-Type: text/html; charset="ISO-8859-1"
Content-Transfer-Encoding: quoted-printableDas gdrende Vl flie_t |ber die Dcker
--++webmailboundary_alt++--
hier hat es zwei -- am Ende.
Hast du die irrtümlich reingebastelt?
Er findet nämlich das Ende des Parts nicht...
mfg Beat
hier hat es zwei -- am Ende.
Hast du die irrtümlich reingebastelt?
Er findet nämlich das Ende des Parts nicht...mfg Beat
Nachdem ich damit die Boundary schließe, stimmt das mit den zwei "--" am Ende schon:
" The boundary delimiter line following the last body part is a
distinguished delimiter that indicates that no further body parts
will follow. Such a delimiter line is identical to the previous
delimiter lines, with the addition of two more hyphens after the
boundary parameter value."
http://tools.ietf.org/html/rfc2046
Ciao,
David //aka DeWitt
Nachdem ich damit die Boundary schließe, stimmt das mit den zwei "--" am Ende schon:
" The boundary delimiter line following the last body part is a
distinguished delimiter that indicates that no further body parts
will follow. Such a delimiter line is identical to the previous
delimiter lines, with the addition of two more hyphens after the
boundary parameter value."
Im Fall des letzten Delimiters ist das offenbar richtig.
Da kann ich nur noch fragen, ob du auch mit
use MIME::QuotedPrint;
$encoded = encode_qp($decoded);
$decoded = decode_qp($encoded);
Die entsprechenden Teile auch encoded hast.
Es sieht eben so aus, als ob kein Encoding auf dem Server statt gefunden hat. In deinem Quelltext finde ich auch nichts dergleichen.
mfg Beat
Da kann ich nur noch fragen, ob du auch mit
use MIME::QuotedPrint;$encoded = encode_qp($decoded);
$decoded = decode_qp($encoded);Die entsprechenden Teile auch encoded hast.
Es sieht eben so aus, als ob kein Encoding auf dem Server statt gefunden hat. In deinem Quelltext finde ich auch nichts dergleichen.
Das wars! Super, danke! Ich hatte (an einer anderer Stelle) den Text bisher nur über
use Encode;
encode('ISO-8859-1',$this->{'htmltext'});
formattiert, aber das war wohl nicht genug.
Eine kleine Frage zum Schluss: Wann sollte man "quoted-printable"- und wann "8bit"-encoding verwenden? Und gibt es einen zu MIME::QuotedPrint vergleichbaren Encoder auch für 8bit-encoding? In der Rubrik MIME gibt es nur noch einen Encoder für Streams.
Ciao,
David //aka DeWitt
Eine kleine Frage zum Schluss: Wann sollte man "quoted-printable"- und wann "8bit"-encoding verwenden? Und gibt es einen zu MIME::QuotedPrint vergleichbaren Encoder auch für 8bit-encoding? In der Rubrik MIME gibt es nur noch einen Encoder für Streams.
Soviel ich verstehe, ist 7bit historisch bedingt, und quoted-printable war die erste verlässliche Methode, mehr zeichen als die ASCII Zeichen verlässlich zu Transportieren. Mittlerweile sollte man aber mit 8bit encoding durchkommen. Ich hatte mit 8bit auf jeden Fall bisher keine Probleme.
Ein Sonderfall sind die Mail header. Dort gibt es nochmals ein besonderes Encoding.
Wenn irgendwas Besonderes im Subject hast, musst du das Subject mit einem nochmals anderen Modul encodieren
use Encode qw/encode decode/;
$utf8 = decode('MIME-Header', $header);
$header = encode('MIME-Header', $utf8);
So du kannst jetzt auf den MIME Standard fluchen. Da bist du nicht der einzige.
mfg Beat