UTF-8 mail
Michael
- php
0 Felix Riesterer1 Tom0 michael0 Tom1 UTF-8 mail SMTP
Edgar Ehritt0 Der Martin0 Tom
hallo alle zusammen. nachdem ich bei einem mail() mailer mit anhang erfolgreich das Umlaut problem mit UTF-8 beseitigen konnte, stehe ich bei einen einfachen mailer ohne anhang an.
der code des mailers sieht bis jetzt so aus:
<?php
$name = $_POST["name"];
$absender = $_POST["absender"];
$empfaenger = $_POST["empfaenger"];
$betreff = $_POST["betreff"];
$message = $_POST["message"];
mail($empfaenger, $betreff, $message,"From: $name <$absender>");
?>
gibt es vielleicht eine möglichkeit diesem mail utf-8 mitzusenden? damit es keine komischen zeichen bei umlauten auf dem mailclient gibt?
Lieber Michael,
ich habe eben im Archiv mal danach gesehen, wann ich vor diesem Problem stand. Diese zwei Links habe ich für Dich:
</archiv/2008/2/t166093/#m1083111>
</archiv/2008/11/t179502/#m1184637>
Liebe Grüße,
Felix Riesterer.
Hello,
hallo alle zusammen. nachdem ich bei einem mail() mailer mit anhang erfolgreich das Umlaut problem mit UTF-8 beseitigen konnte, stehe ich bei einen einfachen mailer ohne anhang an.
der code des mailers sieht bis jetzt so aus:
<?php
$name = $_POST["name"];
$absender = $_POST["absender"];
$empfaenger = $_POST["empfaenger"];
$betreff = $_POST["betreff"];
$message = $_POST["message"];mail($empfaenger, $betreff, $message,"From: $name <$absender>");
?>
Oh jeh, das kann ein längerer Thread werden!
> gibt es vielleicht eine möglichkeit diesem mail utf-8 mitzusenden? damit es keine komischen zeichen bei umlauten auf dem mailclient gibt?
Es gäbe als erstes die Möglichkeit, dass Du mal hier im Archiv nach "MIME Mail" oder "Form Mailer" und "Mail Header Injection" suchst, und Dir die Threads dann sehr genau duchliest.
Das, was Du da gerade im Begriff bist zu bauen, ist eine Spamschleuder.
Darüber kann dann jeder unter Deinem Namen Kinderpornos versenden.
Und was das für Deinen Hals momentan bedeuten kann, weißt Du ja sicher.
Generell zur Mail:
Die Header müssen alle so codiert werden, dass sie nur noch ASCII (7-Bit !) Zeichen enthalten.
Für den Mail-Body muss ebenfalls ein passendes Content-Encoding und ein Tranfer-Encoding engegeben werden, das führt aber bei fehlerhafter Angabe "nur" zur vergurkten Anzeige.
Liebe Grüße aus dem schönen Oberharz
Tom vom Berg
![](http://selfhtml.bitworks.de/Virencheck.gif)
--
Nur selber lernen macht schlau
<http://bergpost.annerschbarrich.de>
juhui, ich habs geschaft...
hier der code:
<?php
$name = $_POST["name"];
$absender = $_POST["absender"];
$empfaenger = $_POST["empfaenger"];
$betreff = $_POST["betreff"];
$message = $_POST["message"];
$Header = "From: $name <$absender>"; //absender Mailadresse mit Name
$Trenner = md5(uniqid(time()));
$Header .= "\n";
$Header .= "MIME-Version: 1.0";
$Header .= "\n";
$Header .= "Content-Type: multipart/mixed; boundary=$Trenner";
$Header .= "\n\n";
$Header .= "This is a multi-part message in MIME format";
$Header .= "\n";
$Header .= "--$Trenner";
$Header .= "\n";
$Header .= "Content-Type: text/plain; charset=UTF-8"; //UTF-8 sorgt dafür, dass die umlaute richtig angezeigt werden
$Header .= "\n";
$Header .= "Content-Transfer-Encoding: 8bit";
$Header .= "\n\n";
$Header .= "$message";// eingabetext von textarea
mail($empfaenger, $betreff,"",$Header);
?>
danke für die Hilfe
Hello,
juhui, ich habs geschaft...
Na, hoffentlich geht das Ding nicht online!
Abgesehen von den Sicherheitslücken: Wo erden die Header encoded?
Und warum führst Du diese nutzlosen Umkopiervorgänge durch?
$name = $_POST["name"];
$absender = $_POST["absender"];
$empfaenger = $_POST["empfaenger"];
$betreff = $_POST["betreff"];
$message = $_POST["message"];
Liebe Grüße aus dem schönen Oberharz
Tom vom Berg
Hallo Michael,
[code lang=php]
$Header .= "\n";
das mit den Zeilenumbrüchen im Kontext eines Mailheader ist bei PHP immer so eine Sache. "\n" kann gutgehen, muss es aber nicht. Auf *NIX-Systemen sucht sich PHP beim Kompilieren die jeweiligen C-Headerdateien des vorinstallierten sendmail-Programms. Wie es unter Windows aussieht weiß ich nicht.
So kann "\n" durch das sendmail-Programm unberührt bleiben, aber auch zu "\r\n" umgewandelt werden. Ich merke das nur an, falls Du dieses Script man portieren willst und feststellst, es läuft auf einem anderen System nicht sorgenfrei.
$Header .= "MIME-Version: 1.0\n";
$Header .= "Content-Type: multipart/mixed; boundary=$Trenner\n";
Diesen Content-Type benutzt Du jedenfalls keinesfalls, soweit aus Deinem Posting hervorgeht. multipart/mixed wird dazu genutzt um eine Nachricht mit Anhängen auszuzeichnen. Wahrscheinlich willst Du Content-Type text/plain verwenden. Der wiederum benötigt dann auch keine boundary. Dieser damit ausgezeichnete Wert (bei Dir "$Trenner") wird als unikate Zeichenkette genutzt, um die einzelnen Teile einer Nachricht für das Mailprogramm anzugeben. Dieses ist z. B. für multipart/mixed oder auch multipart/alternative wichtig. Überdenke also, ob Du auf diese (für mich eher überflüssig-falsche) Angabe nicht ganz verzichtest
$Header .= "\n";
$Header .= "Content-Type: text/plain; charset=UTF-8"; //UTF-8 sorgt dafür, dass die umlaute richtig angezeigt werden
$Header .= "\n";
$Header .= "Content-Transfer-Encoding: 8bit";
Diese Angabe ist eigentlich den Mailservern vorbehalten. Mails wurden, als das SMT-Protokoll verfasst wurde standardmäßig mit 7 Bit durch die Leitungen gejagt. Man könnte spötteln, dass erst später ein kluger Kopf darauf aufmerksam wurde, dass eben doch nicht alle auf der Welt Engländer sind.
8 Bit decken aber nicht annähernd den Zeichenvorrat von UTF-8 ab. Ich hoffe, dass ist Dir soweit auch klar. Dieser Header hat, so wie sein Name es auch aussagt, nur mit dem Transfer der Nachricht zutun. Jedenfalls ist es richtig, dass hier charset, wie auch in HTTP, für die gewünschte Anzeige sorgt. ;)
Gruß aus Berlin!
eddi
Hallo,
»» $Header .= "\n";
das mit den Zeilenumbrüchen im Kontext eines Mailheader ist bei PHP immer so eine Sache. "\n" kann gutgehen, muss es aber nicht.
ja, das Thema wurde hier bereits mehrfach diskutiert.
Auf *NIX-Systemen sucht sich PHP beim Kompilieren die jeweiligen C-Headerdateien des vorinstallierten sendmail-Programms. Wie es unter Windows aussieht weiß ich nicht.
Unter Windows wird PHP in aller Regel als fertig compiliertes Binary installiert, so dass eine derartige Adaption nicht möglich wäre; zudem gibt es unter Windows normalerweise kein sendmail - PHP nimmt *direkt* Kontakt zum SMTP-Server auf.
»» $Header .= "MIME-Version: 1.0\n";
»» $Header .= "Content-Type: multipart/mixed; boundary=$Trenner\n";
Diesen Content-Type benutzt Du jedenfalls keinesfalls, soweit aus Deinem Posting hervorgeht. [...]
Danke, dass du mir mit diesem Einwand samt Erläuterung zuvorgekommen bist. ;-)
»» $Header .= "Content-Transfer-Encoding: 8bit";
Diese Angabe ist eigentlich den Mailservern vorbehalten.
Ja, und sie wird von den meisten Mailclients vorsorglich eingefügt, um auch bei den MTAs sicherzustellen, dass auch 8bit-weise übertragen wird.
8 Bit decken aber nicht annähernd den Zeichenvorrat von UTF-8 ab.
Äh, doch. UTF-8 deckt zwar Zeichencodes bis in die Millionen ab, wird aber immer nur mit einer Sequenz von Bytes codiert. Ein 8bit-Übertragungsweg ist damit auch ohne weitere Umcodierung absolut ausreichend.
Ciao,
Martin
Hello,
$Header .= "\n";
das mit den Zeilenumbrüchen im Kontext eines Mailheader ist bei PHP immer so eine Sache. "\n" kann gutgehen, muss es aber nicht. Auf *NIX-Systemen sucht sich PHP beim Kompilieren die jeweiligen C-Headerdateien des vorinstallierten sendmail-Programms. Wie es unter Windows aussieht weiß ich nicht.
Wird da wirklich etwas abhängig von Sendmail-Header-Dateien eincompiliert?
Ich habe das so in Erinnerung, dass unter Linux das "sendmail"-Script bemüht wird, dem die fertig vorbereitete Mail per Pipe übergeben wird. Dieses Script benötigt dann natürlich für seine Eingangsgröße die Einstellungen, wie sie auf der Kommandozeile herrschen, also mit "\n" die Umbrüche.
Dafür gibt es auch den Pfad zum Script:
http://de3.php.net/manual/en/mail.configuration.php#ini.sendmail-path
Liebe Grüße aus dem schönen Oberharz
Tom vom Berg
Hi Tom,
Wird da wirklich etwas abhängig von Sendmail-Header-Dateien eincompiliert?
früher ja. War sendmail (oder ein Adäquat, bzw. dessen Headerdatein) nicht verfügbar, gab es die Funktion mail() gar nicht. Den heutigen Stand musste ich mir erstmal wieder erlesen (danke für die Nachfrage) und kann nur grobschlecht sagen: Es ist dem nicht mehr so.
configure; Zeile 12729 -> 12766
PHP_ALT_PATH=/usr/bin:/usr/sbin:/usr/etc:/etc:/usr/ucblib:/usr/lib
# Extract the first word of "sendmail", so it can be a program name with args.
set dummy sendmail; ac_word=$2
echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
echo "configure:12734: checking for $ac_word" >&5
if eval "test \"`echo '$''{'ac_cv_path_PROG_SENDMAIL'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
case "$PROG_SENDMAIL" in
/*)
ac_cv_path_PROG_SENDMAIL="$PROG_SENDMAIL" # Let the user override the test with a path.
;;
?:/*)
ac_cv_path_PROG_SENDMAIL="$PROG_SENDMAIL" # Let the user override the test with a dos path.
;;
*)
IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":"
ac_dummy="$PATH:$PHP_ALT_PATH"
for ac_dir in $ac_dummy; do
test -z "$ac_dir" && ac_dir=.
if test -f $ac_dir/$ac_word; then
ac_cv_path_PROG_SENDMAIL="$ac_dir/$ac_word"
break
fi
done
IFS="$ac_save_ifs"
;;
esac
fi
PROG_SENDMAIL="$ac_cv_path_PROG_SENDMAIL"
if test -n "$PROG_SENDMAIL"; then
echo "$ac_t""$PROG_SENDMAIL" 1>&6
else
echo "$ac_t""no" 1>&6
fi
PHP_VAR_SUBST="$PHP_VAR_SUBST PROG_SENDMAIL"
Letztlich hatte ich ja schon über die mangelhafte Dokumentation PHPs gewettert. Es trifft also nicht mehr zu. PHP greift nicht mehr darauf zurück und es wird nur noch der Pfad zum Programm gesucht. Diese Prozedur kann, wie Du ja auch schriebst, angesichts der Konfigurationsdirektive "sendmail_path" nur als Bonbon bezeichnet werden. Für die Version 4.* sollte dies aber noch (hoff) zutreffen. ;)
Ich habe das so in Erinnerung, dass unter Linux das "sendmail"-Script bemüht wird, dem die fertig vorbereitete Mail per Pipe übergeben wird. Dieses Script benötigt dann natürlich für seine Eingangsgröße die Einstellungen, wie sie auf der Kommandozeile herrschen, also mit "\n" die Umbrüche.
So ist es auch noch heute. sendmail, was auch eine Testanwendung sein kann, liest vom stdin
die Nachricht ein.
Gruß aus Berlin!
eddi