DeWitt: Problem bei Multipart-Mail mit Sonderzeichen

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

--
selfcode ie:% fl:( br:< va:) ls:} fo:| rl:( n4:° ss:) de:] js:| ch:] sh:( mo:| zu:(
<< Life is just a moment in eternity, yet every life echoes there >>
  1. --++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++--

    hier hat es zwei -- am Ende.
    Hast du die irrtümlich reingebastelt?
    Er findet nämlich das Ende des Parts nicht...

    mfg Beat

    --
    Woran ich arbeite:
    X-Torah
    ><o(((°>    ----       ><o(((°>
       <°)))o><                      ><o(((°>o
    1. 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

      1. 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

        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

        --
        Woran ich arbeite:
        X-Torah
        ><o(((°>         ><o(((°>
           <°)))o><                      ><o(((°>o
        1. 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

          --
          selfcode ie:% fl:( br:< va:) ls:} fo:| rl:( n4:° ss:) de:] js:| ch:] sh:( mo:| zu:(
          << Life is just a moment in eternity, yet every life echoes there >>
          1. 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

            --
            Woran ich arbeite:
            X-Torah
               <°)))o><                      ><o(((°>o