Synonym hat geschrieben:Code: Alles auswählen
$mail_tpl = str_replace("{{bestaetigungslink}}", 'http://domain/aktivierung.php?code='.$aktivierungscode, $mail_tpl);
Nach der Ausgabe der $mail_tpl steht dann da aber "X-Zccwvd2CfC" und das zur Sicherheit eingebaute "$mail_tpl .= $aktivierungscode;" bringt wieder den richtigen Code "58-Zccwvd2CfC".
58 ist der hexadezimale Wert für 88, und das 88. Zeichen in der ASCII-Tabelle ist … tusch …
das große X.
Und wieso steht da nun ein X? Das ganze Mailsystem stammt aus dem Computer-Mittelalter, arbeitet textbasiert und dies Anno Dazumal auch noch mit nur 7-bittigen Bytes. Um 8-bittige Daten unfallfrei per Mail zu verschieben, werden sie kodiert. Für Text gibt es dazu eine spezielle Methode namens quoted-printable, dabei können Bytes als Gleichheitszeichen gefolgt von einer zweistelligen Hexzahl maskiert werden.
Schauen wir mal in den Quelltext (!) deiner Mail, sehen wir folgendes: „aktivierung.php?code=58-Zccwvd2CfC“. Man beachte das =58 in der Mitte.
Wo immer du dir also die Mail anschaust, das Programm erwartet, dass der Text quoted-printable-kodiert ist und macht genau das, was es in dem Falle soll: Es ersetzt =58 durch das Zeichen mit der hexadezimalen Nummer 58, ein X.
Was lernen wir daraus? Niemals auf eine verarbeitete Ausgabe verlassen,
immer in den Quellcode schauen. Dort hättest du mit Sicherheit den gewünschten Text gesehen und daraufhin, völlig richtig, ein Darstellungsproblem vermutet.
Wie sich dein Problem nun lösen lässt, hängt vom Umfeld ab. Bei E-Mails solltest du dich ein wenig mit
MIME befassen und dafür Sorge tragen, dass der Kopf der Mail folgende Zeilen aufweist:
MIME-Version: 1.0
Content-Type: text/plain; charset=iso-8859-1
Content-Transfer-Encoding: 8bit
Content-Type kann natürlich genauso gut text/html sein, das musst du wissen, welches Format du nimmst. Achte aber so oder so darauf, dass du den richtigen Zeichensatz angibst. Falls du den PHP-Code und/oder die E-Mail-Texte unter Windows schreibst und keine HTML-Masken benutzt, muss dort unbedingt windows-1252 stehen, nicht iso-8859-1.
Behoben wird dein Problem durch die Angabe in der Zeile Content-Transfer-Encoding. Schreibst du dort
quoted-printable rein, hast es wieder.