Thomas: Hartnäckige "bare linefeeds" beim Versand über Net::SMTP

Hallo!

Beim Versand von Mails habe ich ein hartnäckiges Problem mit "bare linefeeds". Beispiel für eine Fehlermeldung (anonymisiert):

-----------------------------------------------
SMTP error from remote server after transfer of mail text:
host aaa.bbb.de[77.xxx.xx.xxx]:
451 See http://pobox.com/~djb/docs/smtplf.html.
-----------------------------------------------

Ich hatte schon mal vor einiger Zeit wegen der Problematik gepostet, dass eine Authentifizierung mit MIME:Lite nicht funktionierte. Daher hatte ich die Erstellung des Mailcorpus zum Versand in das Modul Net:SMTP eingebettet, was im Prinzip, d.h. in 95% der Fälle auch gut funktioniert. Die Einbettung ist praktisch, da ich HTML-Mails versenden muss, teilweise mit mehreren attachments. Hier ein Code-Ausschnitt:

..........................................................

-- Authentifizierung mit Net::SMTP

$smtp = Net::SMTP->new('smtp.1und1.de', Timeout => 30);
$smtp->auth('xxx.de', 'yyy');
$absender = "zzz";
$smtp->mail($absender);
$smtp->to($email);

-- Zusammenstellung mit MIME::Lite ----------------------

my $msg = MIME::Lite->new(
     From    =>$absender,
     To      =>$email,
     Subject =>$betreff,
     Type    =>'multipart/related'
     );
$msg->attach(Type => 'text/html',
     Data  => $hmail
     );

-- Versand mit Net::SMTP -------------------------------

$smtp->data();
$smtp->datasend($msg -> as_string());
$smtp->dataend();
$smtp->quit;
.........................................................

Seit ich den Versand über Net::SMTP mache, bekomme ich hartnäckig in ca. 5% der Fälle o.g. 451-Fehlermeldung. Dieses Problem trat beim unauthentifizierten Versand über MIME::Lite nicht auf.

Ich habe sowohl den Text ($hmail) als auch $betreff auf verschiedene Weisen gefiltert. Das mag doppelt und unnötig erscheinen, aber man probiert halt herum, wenn man nicht weiterkommt. Irgendwo hatte ich gelesen, dass je nach Anwendung und Betriebssystem \r nicht unbedingt dasselbe ist wie \015. Dann hatte ich den Verdacht, dass ich in das Modul Net::SMTP irgendwie wieder ein \012 ohne ein \015 einschleicht, daher habe ich $/ verändert (setze den Wert anschließend wieder zurück).
Irgendwo anders habe ich gelesen, dass manche Mailer Zeilenlängen von über 748 Zeichen mit einem alleinstehenden \012 "ergänzen", daher habe ich auch dies in allen Templates kontrolliert.

.......................................................

-- Fehler beseitigen (smtp-Konventionen)

$/="\015\012";

$html =~ s/\r/ /gi; # avoid bare line feeds
$html =~ s/\015/ /gi; # avoid bare line feeds
$html =~ s/\n/\015\012/gi;
$html =~ s/\012/\015\012/gi;

$betreff =~ s/\r/ /gi; # avoid bare line feeds
$betreff =~ s/\015/ /gi; # avoid bare line feeds
$betreff =~ s/\012/\015\012/gi;

my $leer=chr(0);
$hmail =~ s/$leer/ /gi; # avoid 0-characters

.......................................................

Kurzum - hat jemand noch eine Idee, was ich noch tun könnte, um das Problem zu beheben?

Danke,
Thomas

  1. Hallo,

    bevor der Feed verschwindet, hier noch die wahrscheinliche Auflösung.

    http://www.nabble.com/getting-Message.as_string()-to-put-CR-LF-on-end-of-each-line--td9401329.html

    brachte mich auf den Gedanken. Tatsächlich fügt $msg -> as_string() den Header und den Abschluß selbst dann mit einfachen Zeilenenden \n an, wenn $/ verändert wird. Also müssen die Zeilenenden anschließend gefiltert werden, vorher reicht nicht.

    Das Problem scheint außer mir keiner zu haben? Oder Ihr versendet etwa keine authentifizierten HTML-Mails mit diversen attachments mit SMTP von einem Windows-Server aus ActivePerl?

    (:-))
    Thomas