Mailversand von Sonderzeichen ist fehlerhaft

andralin

Erfahrenes Mitglied
Hallo Leute,

ich versuch mich grad an der Mail-Funktion von PHP und habe das eigentlich ganz gut gelöst. Mails werden als HTML verschickt. Aber mit den Sonderzeichen habe ich Probleme!

Mailfunktion:
Code:
function send_register_mail($nick, $pass, $vname, $nname, $strasse, $str_nr, $plz, $ort, $land, $url, $mail, $tel, $handy, $info)
	{
		global $site_url, $admin_mail, $session_ident, $site_name, $session_ident;
		$reg_key = substr($session_ident,0,16);	
		$sitelink = $site_url . "x_registration_form.php?nick=$nick&regkey=$reg_key";
		include_once("mail_templates/register_mail_2_new_user.php");
		if(!site_mail_sender($mail, "Registrierung von $vname $nname alias $nick bei $site_url", $mail_text_body))
			return "Ein E-Mail zur Authentifizierung der E-Mail Adresse konnte nicht gesendet werden!";
	}

include Datei mit Mailbody (register_mail_2_new_user.php)
Code:
<?PHP 

$mail_text_body = "
				<html><head>				
				<title>Unbenanntes Dokument</title>
				<style type='text/css'>
				<!--
				body {
					font-family: Verdana, Arial, Helvetica, sans-serif;
					color: #996600;
					background-color: #FFFFCC;
				}
				-->
				</style>
				</head>
				<body>
";

$mail_text_body .= 
	"
			<p>Hallo $vname $nname,</p>
			<p>mit Angabe dieser E-Mail Adressse wurde ein Benutzerkonto auf $site_name($site_url) erstellt.</p>
			<p>Folgende Daten wurden angegeben</p>
			<p>Benutzer Name: $nick alias $vname $nname</p>
			<p>Passwort: $pass</p>
			<p>Adresse:<br>
			$strasse $str_nr<br>
			$plz $ort ($land)</p>
			<p>E-Mail: $mail<br> 
			Websseite: $url<br>
			<br>
			Telefon: $tel<br>
			Handy: $handy<br>
			</p>
			<p>Registrierungstext:<br>
			$info<br>
			<br>
			Zur Sicherstellung das eine ernsthafte Anmeldung vorliegt muss dieses Konto mit folgendem Link bestätigt werden!<br>
			<a href='$sitelink' target='_blank'>Bitte einmal anklicken um die E-Mail Adresse und das damit verbundene Konto zu bestätigen!</a></p>
	"; 

$mail_text_body	.=	"</body></html>";

?>

Aber statt Strasse bekomme ich Straße gemailt!

Wo ist mein Fehler?

LG Andralin
 
So, den Mailbody habe ich mal geändert, aber die Sonderzeichen gibt es immer noch nicht im Mail...

Code:
<?PHP 

$mail_text_body = "
				<!DOCTYPE html PUBLIC '-//W3C//DTD XHTML 1.0 Transitional//EN' 'http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd'>
				<html xmlns='http://www.w3.org/1999/xhtml'>
";

$mail_text_body .= "
				<head>
				<meta http-equiv='Content-Type' content='text/html; charset=utf-8'>		
				<title>Unbenanntes Dokument</title>
				<style type='text/css'>
				<!--
				body {
					font-family: Verdana, Arial, Helvetica, sans-serif;
					color: #996600;
					background-color: #FFFFCC;
				}
				-->
				</style>
				</head>
				<body>
";

$mail_text_body .= "
			<p>Hallo $admin_name, </p>
			<p>ein neuer Benutzer hat sich mit folgenden Daten auf $site_name($site_url) registriert.</p>
			<p><strong>Benutzer Name:</strong> $tmp_nick(<FONT COLOR='grey'>#$tmp_usr_nr</FONT>) alias $tmp_fullname</p>
			<p><strong>Adresse:</strong><br>
			$tmp_adr</p>
			<p><strong>E-Mail:</strong> $tmp_mail<br>
			    <strong>Websseite: </strong>$tmp_web<br>
			<br>
			<strong>Telefon:</strong> $tmp_tel<br>
			<strong>Handy: </strong>$tmp_hndy<br>
			</p>
			<p><strong>Registrierungstext:</strong><br>
			$tmp_info</p>
			<p><strong>Zeitstempel:</strong> $tmp_datum<br>
		        <br>
			    Zur Sicherstellung das eine ernsthafte Anmeldung vorliegt wurde dieses Konto per E-Mail aktiviert!</p>

"; 

$mail_text_body	.=	"</body></html>";

?>
 
Dann hast du es vermutlich falsch gemacht. Bei der mail()-Funktion-Funktion können zusätzliche Header-Felder im vierten Parameter angegeben werden.

Auch ein Beispiel aus Deinem Link hab ich nun probiert. Komisch das der folgende Code im Subject und im Body unterschiedliche Ausgaben zur Folge hat die aber alles andere nur keine Sonderzeichen ausgeben.


Beispiel:
Code:
<?PHP 

# -=-=-=- MIME BOUNDARY
$mime_boundary = "----MSA Shipping----".md5(time());
# -=-=-=- MAIL HEADERS
$to = "foto@dirk-moll.de";

$subject = "Test-Mail mit Ü's und Ä's zum Testen";
$headers = "From: Dirk Moll <system@dirk-moll.de>\n";
$headers .= "Reply-To: Dirk Moll <system@dirk-moll.de>\n";
$headers .= "MIME-Version: 1.0\n";
$headers .= "Content-Type: multipart/alternative; boundary=\"$mime_boundary\"\n";

$message .= "--$mime_boundary\n";
$message .= "Content-Type: text/html; charset=UTF-8\n";
$message .= "Content-Transfer-Encoding: 8bit\n\n";

$message .= "<html>\n";
$message .= "<body style=\"font-family:Verdana, Verdana, Geneva, sans-serif; font-size:12px; color:#666666;\">\n";

$message .= "Das ist mein Mail das auch Ü's und Ö's können soll!";


$message .= "</body>\n";
$message .= "</html>\n";
# -=-=-=- FINAL BOUNDARY
$message .= "--$mime_boundary--\n\n";
# -=-=-=- SEND MAIL
$mail_sent = @mail( $to, $subject, $message, $headers );
echo $mail_sent ? "Mail sent" : "Mail failed";

?>

SUBJECT: (Quadrate standen vor den 's konnten aber nicht kopiert werden!)
Test-Mail mit 's und 's zum Testen
Test-Mail mit Ö's und Ä's zum Testen sollte hier stehen

BODY:
Das ist mein Mail das auch ?s und ?s k??n soll!
Das ist mein Mail das auch Ö's und Ä's können soll! (sollte hier stehen!)
 
Erst einmal musst du wissen, mit welcher Kodierung die Daten tatsächlich kodiert sind. Und in deinem Beispiel scheint das definitiv nicht UTF-8 zu sein.

Weitergehend erlaubt das SMTP nur ASCII-Zeichen, weswegen auch der Betreff speziell kodiert werden muss (siehe Encoded-word-Kodierung).

Zusammengefasst, sollte Folgendes (bei UTF-8-Daten) funktionieren:
PHP:
$to = "foto@dirk-moll.de";
$subject = "Test-Mail mit Ü's und Ä's zum Testen";

$headers = "From: Dirk Moll <system@dirk-moll.de>\n";
$headers .= "Reply-To: Dirk Moll <system@dirk-moll.de>\n";
$headers .= "MIME-Version: 1.0\n";
$headers .= "Content-Type: text/html; charset=UTF-8\n";
$headers .= "Content-Transfer-Encoding: 8bit\n\n";
$headers .= "Subject: =?utf-8?b?".base64_encode($subject)."?=\n";

$message = "<html>\n";
$message .= "<body style=\"font-family:Verdana, Verdana, Geneva, sans-serif; font-size:12px; color:#666666;\">\n";
$message .= "Das ist mein Mail das auch Ü's und Ö's können soll!";
$message .= "</body>\n";
$message .= "</html>";

$mail_sent = @mail( $to, null, $message, $headers );
echo $mail_sent ? "Mail sent" : "Mail failed";
 
Erst einmal musst du wissen, mit welcher Kodierung die Daten tatsächlich kodiert sind. Und in deinem Beispiel scheint das definitiv nicht UTF-8 zu sein.

Weitergehend erlaubt das SMTP nur ASCII-Zeichen, weswegen auch der Betreff speziell kodiert werden muss (siehe Encoded-word-Kodierung).

Zusammengefasst, sollte Folgendes (bei UTF-8-Daten) funktionieren:
PHP:
$to = "foto@dirk-moll.de";
$subject = "Test-Mail mit Ü's und Ä's zum Testen";

$headers = "From: Dirk Moll <system@dirk-moll.de>\n";
$headers .= "Reply-To: Dirk Moll <system@dirk-moll.de>\n";
$headers .= "MIME-Version: 1.0\n";
$headers .= "Content-Type: text/html; charset=UTF-8\n";
$headers .= "Content-Transfer-Encoding: 8bit\n\n";
$headers .= "Subject: =?utf-8?b?".base64_encode($subject)."?=\n";

$message = "<html>\n";
$message .= "<body style=\"font-family:Verdana, Verdana, Geneva, sans-serif; font-size:12px; color:#666666;\">\n";
$message .= "Das ist mein Mail das auch Ü's und Ö's können soll!";
$message .= "</body>\n";
$message .= "</html>";

$mail_sent = @mail( $to, null, $message, $headers );
echo $mail_sent ? "Mail sent" : "Mail failed";



OK im Body geht es nun. Werde mir morgen anschauen wo der Fehler ist. Aber das Subject geht nicht. Subject ist leer dafür steht es aber über dem Text im Mail-Body. Aber ich denke ich werde morgen mehr sehen. Wenn ich da noch mal in Ruhe drüber schau.
 
Lösung: so gehts dann mit Sonderzeichen! Hat mir keine Ruhe mehr gelassen.

Code:
<?PHP
	
	function re_htmlentities($html)	
	{		
	  $arr = get_html_translation_table(HTML_ENTITIES);
	  $arr = array_flip($arr);
	  return strtr($html, $arr);
	}
	
	$to = "foto@dirk-moll.de";
	$subject = "Test-Mail mit Ü's und Ä's zum Testen";
//	$subject = re_htmlentities($subject);
	
	$subject = '=?utf-8?b?'.base64_encode ($subject).'?=';
	
	$headers = "From: Dirk Moll <system@dirk-moll.de>\n";
	$headers .= "Reply-To: Dirk Moll <system@dirk-moll.de>\n";
	$headers .= "MIME-Version: 1.0\n";
	$headers .= "Content-Type: text/html; charset=UTF-8\n";
	$headers .= "Content-Transfer-Encoding: 8bit\n\n";
	//$headers .= "Subject: =?utf-8?b?".base64_encode($subject)."?=\n";
	
	$message = "<html>\n";
	$message .= "<body style=\"font-family:Verdana, Verdana, Geneva, sans-serif; font-size:12px; color:#666666;\">\n";
	$message .= "Das ist mein Mail (Test 4) das auch Ü's und Ö's können soll!";
	$message .= "</body>\n";
	$message .= "</html>";
	
	$mail_sent = @mail( $to, $subject, $message, $headers );
	echo $mail_sent ? "Mail sent" : "Mail failed";  
?>
 
Zurück