Zur Navigation

Kontaktformular mit Umlauten, Sonderzeichen?

1 Marko

Hallo Jörg

Hier mein Beginn des Kontaktformulars:

<?php


date_default_timezone_set('Europe/Berlin');

$headers .= "Mime-Version: 1.0\r\n";
$headers .="Content-Type: text/html; charset=UTF-8";
         
$ihre_email 				= "meine email-adresse@web.de";
$betreff_der_nachrichten 	= "Eine Nachricht von Ihrem französischen Formular.";

require_once('../../func.inc.php');
$meldungen = "";

array_escape_and_strip($_POST);
array_unescape($_POST);

if(isset($_POST['action'])){

	switch($_POST['action']){

		case 'submit':
		
		   if(empty($_POST['name'])){
				$meldungen .= "S'il vous plaît entrer votre nom.<br>";
				$error = 1;
			}

Ich habe oben gleich " $headers" eingefügt.

Es geht um ä ü und die ganzen französischen Zeichen usw.

Ich kann aus dem französichen Formular die französichen Zeichen schreiben, sie kommen auch im Kontroll Formular an, werden angezeigt, auch ä und ö usw.

Aber in der Mail-Nachricht da ist alles verunstaltet, nicht zu lesen?

Oder ich muss noch eine Liste anlegen für jeden möglichen Buchstaben?

Gruß
Marko

09.04.2017 10:59

2 Jörg Kruse

Der Code, den du oben gepostet hast, ist unvollständig - es fehlt z.B. der Aufruf einer Mail-Funktion

Ich kann aus dem französichen Formular die französichen Zeichen schreiben, sie kommen auch im Kontroll Formular an, werden angezeigt, auch ä und ö usw.

Mit welchem Content-Type wird denn die betreffende Webseite angezeigt, hast du dort eine Meta-Angabe "charset" angegeben?

Aber in der Mail-Nachricht da ist alles verunstaltet, nicht zu lesen?

Was heißt "alles verunstaltet" - nicht nur die Umlaute, sonden alle Zeichen? im Mail-Body, im Betreff oder in beidem?

09.04.2017 21:13 | geändert: 09.04.2017 21:14

3 Marko

Hallo
Jörg

Danke der Antwort, klar wichtiges fehlte.

Im Kontaktformular steht oben:
<!DOCTYPE html>
 <html lang="de">
 <head>
 <meta charset="utf-8">

In der Mail-Nachricht sind nur jeweils die Sonderzeichen nicht zu lesen.
Die ist im Betreff, in der Nachricht, und dem übermittelten Namen, Email Adresse so.

Kontaktformular:

<?php

date_default_timezone_set('Europe/Berlin');

$ihre_email 				= "meine -email-adresse.de";
$betreff_der_nachrichten 	= "Eine Nachricht von Ihrem Formular.";

require_once('func.inc.php');
$meldungen = "";

array_escape_and_strip($_POST);
array_unescape($_POST);

if(isset($_POST['action'])){

	switch($_POST['action']){

		case 'submit':
		
		   if(empty($_POST['name'])){
				$meldungen .= "Bitte geben Sie Ihren Namen ein.<br>";
				$error = 1;
			}

			if(!check_email($_POST['email'])){
				$meldungen .= "Bitte geben Sie eine richtige E-Mail Adresse ein.<br>";
				$error = 1;
			}
			
			if(empty($_POST['betreff'])){
				$meldungen .= "Bitte geben Sie einen Betreff ein.<br>";
				$error = 1;
			}	
			
			if(empty($_POST['text'])){
				$meldungen .= "Bitte geben Sie eine Nachricht ein.<br>";
				$error = 1;
			}

			if($error) { break; }

			$message =  "Es wurde eine Nachricht hinterlassen:\n\n".
						"Kontaktdaten:\n".
						"Name: $_POST[name]\n".
						"Betreff: $_POST[betreff]\n".
						"E-Mail: $_POST[email]\n".
						"Telefon: $_POST[telefonnummer]\n".
						"Fax: $_POST[faxnummer]\n".
						"------------------------- Nachricht -------------------------\n\n".
						"$_POST[text]\n\n".
						"------------------------- ENDE -------------------------\n\n".
						"Uhrzeit: ".date('d.m.Y - H:i:s');

			$x = @mail($ihre_email,addslashes($betreff_der_nachrichten),$message,"from: $_POST[email]");

			if($x){
				$meldungen2 .= "Vielen Dank, Ihre Nachricht ist bei uns eingegangen!";
				$_POST = array();
				break;
			}

			$meldungen .= "Aufgrund eines technischen Fehlers konnten wir Ihre Nachricht nicht empfangen.<br>".
						  "Bitte setzen Sie sich anderweitig mit uns in Verbindung.<br>Vielen Dank für Ihr Verständnis!";
			break;

	}

}

?>

Wie ich schon schrieb, eingeben im Kontaktformular kann ich alle Sonderzeichen, werden auch richtig angezeigt. Im 2. Formular zur Ansicht was abgesendet werden soll ebenfalls alles richtig dargestellt, dann beende ich das mit absenden.

Beste Grüße
Marko

10.04.2017 09:11

4 Jörg Kruse

Also sind die Daten UTF-8 codiert. Die Mail muss dann auch einen entsprechenden Content-Type-Header enthalten. Das ist hier nicht der Fall:

			$x = @mail($ihre_email,addslashes($betreff_der_nachrichten),$message,"from: $_POST[email]");

Wenn auch der Betreff Umlaute enthält, muss dieser auch noch auf eine spezielle Art codiert werden. Im Code deines ersten Posts befindet sich ja ein Betreff mit Umlaut

In der Dokumentation zur Funktion mail() findert sich in den Kommentaren die Definition einer Funktion mail_utf8():

http://php.net/manual/de/function.mail.php#108669

Die könntest du in deine func.inc.php einbauen und dann statt der mail() Funktion verwenden.

10.04.2017 10:20

5 Marko

Hallo

Habe jetzt diesen Auszug ganz oben in die Datei func.inc.php eingefügt:

Nach einigen anderen Tests hatte ich nur Fehlermeldungen.

<?
#############################################################
function mail_utf8($to, $from_user, $from_email,
                                             $subject = '(No subject)', $message = '')
   {
      $from_user = "=?UTF-8?B?".base64_encode($from_user)."?=";
      $subject = "=?UTF-8?B?".base64_encode($subject)."?=";

      $headers = "From: $from_user <$from_email>\r\n".
               "MIME-Version: 1.0" . "\r\n" .
               "Content-type: text/html; charset=UTF-8" . "\r\n";

     return mail($to, $subject, $message, $headers);
   }
#############################################################
function check_email($email){

	return eregi("^[_a-z0-9-]([-_.]?[a-z0-9])*@[a-z0-9]([-_.]?[a-z0-9])+[.][a-z0-9]+$",$email);

}

usw, usw.
#############################################################

Selbige Zeile hatte ich noch so belassen:
$x = @mail($ihre_email,addslashes($betreff_der_nachrichten),$message,"from: $_POST[email]");

So wird jetzt das Formular erst einmal wieder abgesendet aber ohne Umlaute.

Es wurde eine Nachricht hinterlassen:

Kontaktdaten:
Name: hä
Betreff: hü
E-Mail: 123@aol.com
Telefon:
------------------------- Nachricht -------------------------

Hälötü

------------------------- ENDE -------------------------

Uhrzeit: 11.04.2017 - 11:00:55
Gruß
Marko

11.04.2017 10:47 | geändert: 11.04.2017 11:09

6 Jörg Kruse

Selbige Zeile hatte ich noch so belassen:

$x = @mail($ihre_email,addslashes($betreff_der_nachrichten),$message,"from: $_POST[email]");

Stattdessen musst du dort jetzt die Funktion mail_utf8() verwenden:

$x = mail_utf8(
    $ihre_email,
    $_POST['email'],
    $_POST['email'],
    $betreff_der_nachrichten,
    $message
);

$_POST['email'] musst du zweimal als Funktions-Argument angeben, einmal als User- und einmal als Email-Angabe. Das addslashes() habe ich mal weggelassen, weil sich mir dessen Sinn hier nicht erschließt.

Normalerweise sollte man $_POST['email'] nicht ungeprüft an die Mail-Funktion übergeben, da das Formular andernfalls über eine Email-Header-Injection zum Spammen missbraucht werden könnte. Da du weiter oben $_POST['email'] auf Gültigkeit überprüft hast, geht das so aber wohl in Ordnung:

			if(!check_email($_POST['email'])){
				$meldungen .= "Bitte geben Sie eine richtige E-Mail Adresse ein.<br>";
				$error = 1;
			}

11.04.2017 12:06 | geändert: 11.04.2017 12:12

7 Marko

Hallo
Die Idee es in die func.inc.php einzubauen fand ich gut, da ich mehrere Kontaktformulare habe, auch mit längeren Auswertungen, immer mit einem Zeilenumbruch wie oben schon einmal gezeigt.

In dieser Form hatte ich das nicht versucht, die Formatierung der Nachricht ist nun verschoben, ich hatte mit /n/n oder <b> oder /r/n probiert ohne Erfolg.
Es wurde eine Nachricht hinterlassen von der DEU Seite: Kontaktdaten: Name: hä Betreff: hä E-Mail: 123@aol.com Telefon: ------------------------- Nachricht ------------------------- Hälütö ------------------------- ENDE ------------------------- Uhrzeit: 11.04.2017 - 21:46:21 

Ich hatte einmal versucht verschiedene oder mehrere Mailadressen zu verwenden, dass geht nicht. Sollte auch so sein.

Gruß
Marko

11.04.2017 21:59 | geändert: 11.04.2017 22:08

8 Jörg Kruse

               "Content-type: text/html; charset=UTF-8" . "\r\n";

OK, die Funktion versendet HTML-Mails

Entweder den Content-Type ändern, so dass reine Text-Mails versendet werden:

               "Content-type: text/plain; charset=UTF-8" . "\r\n";

... oder mit nl2br() HTML-Umbrüche erzeugen:

$x = mail_utf8(
    $ihre_email,
    $_POST['email'],
    $_POST['email'],
    $betreff_der_nachrichten,
    nl2br($message)
);

Ich hatte einmal versucht verschiedene oder mehrere Mailadressen zu verwenden, dass geht nicht.

Was heißt "mehrere Mailadressen" - meherere Empfänger-Adressen? Wie hast du es denn probiert? für $ihre_email sollte dann eine komma-separierte Liste von Emailadressen übergeben werden. Am besten du postest mal den Code und ggf. Fehlermeldungen

12.04.2017 09:16

9 Marko

Hallo

Danke für die Hilfe.

text/plain;

Das hat es wieder berichtigt.

Mit den Mailadressen meinte ich nur die Eingabe, mann kann nur eine Adresse eingeben, und so soll es sein.

Beste Grüße
Mark

12.04.2017 20:22

10 Jörg Kruse

Achso, da hatte ich dich missverstanden - dann ist ja alles in Ordnung soweit :)

12.04.2017 20:53

Beitrag schreiben (als Gast)

Die Antwort wird nach der Überprüfung durch einen Moderator freigeschaltet.





[BBCode-Hilfe]