Meine Güte, du machst dir das Leben vielleicht unnötig schwer.
Das merke ich... Wollte eigentlich längst fertig sein :(
Produzierst du falsch kodierte Mails? Vermutlich ja. (Zeige mal den Rückgabewert von
$email->as_string
vor dem Versand.
Falsch kodiert? Don't know...
$email->as_string
=> Du meinst diese eine Methode von LWP::UserAgent?
Hm, muss ich mal gucken, wie. Das Skript schickt die Mail und gibt ein Bild zurück. Nochmals auch für diejenigen die jetzt einsteigen, falls es doch jemand außer uns zweien gibt, der hier noch mitliest ;)
Das was auf der Testseite wie ein Formular aussieht, ist eigentlich gar keins. Beim Klick auf »Absenden« wird eine JS-Funtkion aufgerufen, dessen hier relevante Part der folgdende ist:
gE('spic').src = pf+'/cgi-bin/bmmail.pl?stamp='+parseInt(new Date().getTime()/1000)
+'&page='+encodeURIComponent(lh)
+'&title='+encodeURIComponent(document.title)
+'&sendername='+encodeURIComponent(gE('sname').value)
+'&recipientname='+encodeURIComponent(gE('rname').value)
+'&sendermail='+encodeURIComponent(gE('smail').value)
+'&recipientmail='+encodeURIComponent(gE('rmail').value)
+'&message='+encodeURIComponent(gE('message').value);
Die hier per GET verschickte Parameter lese ich mit der Methode param() des CGI-Moduls aus. Durch encodeURICompenent() kommt es also bereits als UTF-8 an, weswegen die Angaben encode('MIME-Header', $subject
) und fürs Body encode('UTF-8', $data)
nur Zeichenmurks produziert hatten.
Dann musst auch in Kauf nehmen, dass jeder Mailclient den Datenmüll auf eigene Art handhabt. Da bist du nur am Verlieren. Es hilft auch kein anderes Encoding als UTF-8.
Die Webmailer machen Murks. GMX ruft zum Beispiel den Mail-Inhalt (body) in einem IFrame auf -> dieser Inhalt wird korrekt dargestellt. Die Header-Angaben zum Absender, Empfänger und Betreff aber werden außerhalb dieses IFrames angezeigt und enthalten bei Sonderzeichen Müll.
Seitzeichen (seitzeichen.de) benutzt einen PHP-Mailer, beim Mail-Leser kommt iso-8859-1: Gibt man in deren »Formular« im Namen oder im Text Sonderzeichen wie z.B. ‰ an, werden diese in den Mails als Fragezeichen dargestellt.
Wenn ich jetzt durch die Methode decode() alle Parameter dekodiere, und dann iso-8859-1 ausliefere, erhalte ich die selben Ergebnisse wie bei Seitzeichen [1]: Korrekte Darstellung und ansonsten Fragezeichen bei evtl. Sonderzeichen - beim Letzteren aber leider »Wide character...« im Errorlog...
Die Lösung ist, es einfach richtig zu machen, statt an sekundären Problemen herumzupfriemeln.
Also UTF-8 ausliefern, und damit leben, dass GMX-User (und sicher Nutzer anderer Webmailer) im Sendernamen (From:) und Betreff Unleserliches erhalten?
An deiner Stelle hätte ich schon längst die Libraries modernisiert. Wenn du Dateien hochladen/mit Perl ausführen kannst, kannst du auch immer Module installieren.
Meine Versuche, bei 1&1 Module nachzuinstallieren sind kläglich gescheitert, permission denied hier, permission denied dort... In einem langen Thread im Archiv müsste alles noch dokumentiert sein ;) Ich kann also nur ins eigene cgi-bin kopieren...
P.
[1] Der code hierzu:
Für jeden Parameter, zB:
decode('UTF-8',$cgi->param('sendername'))
MIME::Lite:
my $email = MIME::Lite->new( 'Return-Path' => $from,
From => encode('MIME-Header',$from),
To => $cgi->param('recipientmail'),
Subject => encode('MIME-Header',$subject),
Type => 'multipart/mixed',
Encoding => '8bit'
);
my $body = MIME::Lite->new( Type => 'multipart/alternative',
Encoding => '8bit'
);
$body->attach( Type => 'text/plain; charset=iso-8859-1',
Data => encode('iso-8859-1', $plain)
);
$body->attach( Type => 'text/html; charset=iso-8859-1',
Data => encode('iso-8859-1', $html)
);
$email->attach($body);
$email->send();
Erstaunlicherweise wird hier trotz encode('MIME-Header', $foo)
bei GMX alles korrekt angezeigt. Lasse ich mir von Windows Live Mail den Quelltext anzeigen, sehe ich im Header:
From: =?UTF-8?B?4oCwLVRlc3Qg?=patrickx@example.com
To: patricky@example.com
Subject: =?UTF-8?B?RWluZSBMaW5rZW1wZmVobHVuZyB2b24g4oCwLVRlc3Qg?=(patrickx@example.com)
Zum Vergleich nochmals der Code meiner »UTF-8-Variante«:
Kein »decode()«,
my $email = MIME::Lite->new( 'Return-Path' => $from,
From => $from,
To => $cgi->param('recipientmail'),
Subject => $subject,
Type => 'multipart/mixed',
Encoding => '7bit',
'Auto-Submitted' => 'auto-generated'
);
my $body = MIME::Lite->new( Type => 'multipart/alternative',
Encoding => '8bit'
);
$body->attach( Type => 'text/plain; charset=UTF-8',
Data => $plain
);
$body->attach( Type => 'text/html; charset=UTF-8',
Data => $html
);
$email->attach($body);
$email->send();
From: ‰-Test patrickx@example.com
To: patricky@example.com
Subject: Eine Linkempfehlung von ‰-Test (patrickx@example.com)
‰-Test wird aber korrekt als ‰-Test angezeigt (Mail-Ansicht)