Fehler bei der Überprüfung der eMail

Basteidel

Grünschnabel
Hallo in die Runde,

leide finde ich den Grund nicht, warum mein php-Code nicht funktioniert.

Kurz zum Sachverhalt: Ich möchte einfach in einem Kontaktformular zur Bestellung eines Newsletters die angegebene Mail prüfen (Syntax, Domain, etc) Das dürfte eigentlich für jeden (ausser mir) kein Problem sein, es gibt ja auch haufenweise Beiträge dazu. Ich habe hier im Forum schon mehere Funktionen gefunden und alle ausprobiert. :)

Leider geben alle Funktionen immer den Wert "falsch" aus, auch wenn die eMail richtig ist. An der Funktion selbst kann es also nicht liegen. Ich vermute mal, dass es daran liegt, dass die Funktion die eMail im Quellocode der Ursprungsseite nicht findet, und somit logischer Weise immer sagt: "falsch" :(

Vieleich ist es möglich, das mir jemand weiter hilft?

Der Code des Formulars:


HTML:
<form action="../ext/newsletter.php3" method="post" name="feedback" onSubmit="chkFormular()">            
		    <font size="2"><b>Auch Sie m&ouml;chten den kostenlosen Newsletter erhalten?</b><br>
            <br>
            Bitte geben Sie hier Ihre Postleitzahl ein:</font><br>
            <br>
            <input type="Text" name="PLZ" size="10" maxlength="5" style="font-size: 10pt; font-family: Arial; font-style: 
            normal; font-weight: normal; color: #fe8625; border-style: groove; float: none; background-color: #ffffff;"><br>
            <br>
            <font size="2">Bitte geben Sie hier Ihre eMail-Adresse ein:</font><br>
            <br>
            <input type="Text" name="eMail" size="25" maxlength="50" style="font-size: 10pt; font-family: Arial; 
            font-style: normal; font-weight: normal; color: #fe8625; border-style: groove; float: none; background-color: #ffffff;">
            &nbsp;&nbsp;
            <p>
            <button name="submit" type="submit"><font class="text4"><b>JA!</b></font></button>
            </form>


Und dazu der php Code, der auf einer weiteren Seite steht:

PHP:
<?
$eMail = $_POST["eMail"];

function checkEmail($eMail) {       
  // Syntax prüfen
 if(preg_match("/^( [a-zA-Z0-9] )+( [a-zA-Z0-9\._-] )*@( [a-zA-Z0-9_-] )+( [a-zA-Z0-9\._-] +)+$/" , $eMail)) {
  // Domain prüfen
  list($username,$domain)=split('@',$eMail);
  if(!checkdnsrr($domain, 'MX')) {
   return false;
  }

  if(!fsockopen($domain,25,$errno,$errstr,30)) {
   return false;
  }
  return true;
 }
 return false;
}
  
if($eMail == "") 
  	{ // Prüfen, ob das Feld eMail gefüllt ist
  	$e_text1 = "SORRY!";
  	$e_text2 = "Ohne eMail-Adresse geht's leider nicht!";
  	}
else 	
	{
  	if(checkEmail($eMail) == false) 
        {// Prüfen, ob die eMail die richtige Syntax hat
		$e_text1 = "SORRY!";
  		$e_text2 = "Die angegebene eMail ist nicht gültig!";
		}    
	else
        {// Das Ergebnis der Prüfung der eMail ist positiv
		$e_text1 = "VIELEN DANK!";
  	    $e_text2 = "Bald bekommen auch Sie den Newsletter.";
		
	    $mailto  = "mail@meineadresse.de";
	    $from    = $_POST["eMail"];
	    $from2   = $_POST["PLZ"];
	    $message = 	'Die neue eMail Adresse für den Newsletter lautet: '.$_POST["eMail"].'
					 Die eingegebene PLZ lautet: '.$_POST["PLZ"].'';
	    mail( "$mailto",  "Newsletter-Bestellung",  "$message",  "From:$mailto\nCC:$cc\nBCC:$bcc" ); 
	    }
	}
?>

Dem php-Code schließt sich noch weiterer HTML-Code an, in dem dann über den echo Befehl die ermittelten Werte ausgegeben werden.

Für Eure Hilfe wäre ich ungemein Dankbar

Herzliche Grüße

Basteidel
 
Ich würde mit dem Debuggen der Funktion checkEmail() damit anfangen, schrittweise auszugeben, was alles schief gelaufen ist:

PHP:
function checkEmail($eMail)
{
  if(!isset($eMail))
  {
    echo "No email address given to check!";
    return false;
  }  
  
  // Syntax prüfen
  if(preg_match("/^( [a-zA-Z0-9] )+( [a-zA-Z0-9\._-] )*@( [a-zA-Z0-9_-] )+( [a-zA-Z0-9\._-] +)+$/" , $eMail))
  {
    echo "Syntax is ok; ";
    // Domain prüfen
    list($username,$domain)=split('@',$eMail);
    
    echo "Domain of email address is $domain; ";
    if(!checkdnsrr($domain, 'MX'))
    {
      echo "checkdnsrr() failed!";
      return false;
    }
    echo "checking dns record of domain was ok; ";

    if(!fsockopen($domain,25,$errno,$errstr,30))
    {
      echo "connecting to domain using port 25 failed using error message $errstr and code $errno";
      return false;
    }
    
    echo "Connecting to domain was ok; ";
    return true;
  }
  
  echo "Syntax check failed";
  return false;
}
 
Wozu die E-Mail-Adresse mit preg_match() prüfen, wenn man doch mit filter_var() eine der leichtesten Möglichkeiten geboten bekommt, die es gibt? Für den E-Mail-Filter muss die Konstanste FILTER_VALIDATE_EMAIL angegeben werden.
 
Von filter_var() hab ich noch nie was gehört. Das würde ja plötzlich alle Probleme dieser (PHP-)Welt lösen :-O Wurde das mit PHP 5 neu eingeführt?

Wie genau ist diese Funktion bei E-Mail-Adressen? Erkennt sie zuverslässig alle? Hab schon viel über "den einzige wahren RegEx" für E-Mail-Adressen gelesen und bin für mich zu dem Schluss gekommen, dass es da mehr als nur eines Regex bedarf, um eine Adresse wirklich genau zu validieren...
 
Du prüfst mit dieser Funktion, ob die angegebene Zeichenkette eine gültige E-Mail-Adresse enthält. Wenn dem so ist, so gibt die Funktion die validierte E-Mail-Adresse zurück, ansonsten FALSE. Den Rest musst du weiterhin so prüfen, wie du es bisher auch gehandhabt hast (also DNS und Domain).
 
Hallo und vielen Dank für die Antworten!

@saftmeister

Ich habe versucht, Deinen Code zu kopieren und auszuführen. Leider gibt die Funktion in den einzelnen Prüfschritten überhaupt nichts aus. Das hat mich auf die Idee gebracht, dass sie gar nicht ausgeführt wird. Daher habe ich mal den gesamten Inhalt der Funktion gelöscht und nur

PHP:
function checkEmail($eMail) { }

stehen lassen. Das Ergebnis war identisch. Kann es denn sein, dass die Funktion gar nicht ausgeführt wird und deswegen immer "false" gilt? Woran kann das liegen?

Tausche ich bei
PHP:
  	if(checkEmail($eMail) == false)
das "false" gegen "true" aus, wird auch der zweite Teil der wenn-dann-Funktion ("VIELEN DANK!..." und Mailversand) ausgeführt. Was ja auch dafür spricht, dass immer "false" gilt.



@einfach nur crack

wie sieht den die Syntax der filter_var() genau aus? Gibt es dazu schon einen Beitrag? Und ist dafür nicht php 5.2.0 Vorraussetzung?

Nochmals herzlichen Dank!

Basteidel
 
Moin,

Hab schon viel über "den einzige wahren RegEx" für E-Mail-Adressen gelesen und bin für mich zu dem Schluss gekommen, dass es da mehr als nur eines Regex bedarf, um eine Adresse wirklich genau zu validieren...

Wenn du dies irgendwo gelesen hast, dann ist das Mumpitz :-)

Eine einzig wahre Prüfung würde vorraussetzen, dass es eine allgemeingültige und von allen auf schärfste eingehaltene Syntax für den Aufbau einer Mailadresse gibt, was nicht der Fall ist.

Vorraussetzung ist mindestens PHP 5.2.0

Die Benutzung denkbar einfach:

Code:
$mail=filter_var('hans@wurst.de', FILTER_VALIDATE_EMAIL)
$mail ist entweder die gefilterte Mailadresse oder im Fehlerfall false

Aber was kein RegExp mit 100%iger Sicherheit kann, kann auch FILTER_VALIDATE_EMAIL nicht.
Das ist eine grobe Syntaxprüfung, es wird nichtmal auf eine gültige TLD geprüft.
Code:
hans@wurst.suppentopf
geht da genauso durch :-)

Eine nahezu sichere Prüfung bietet nur der Kontakt zum betreffenden Mailserver.
 
Kurz noch eine Anmerkung von mir.

Du musst eine Confirm E-Mail generieren lassen, damit der Besucher X seine E-Mail Adresse bestätigt. Das ist Pflicht in Deutschland.
Andernfalls könntest du da große Probleme bekommen.

Begründung: Jeder Benutzer könnte da einfach von irgendwem eine E-Mail eintragen und das ist ja nicht sinn der sache.
 
Hallo in die Runde,

vielen lieben Dank für Eure Antworten, auch wenn die mir nicht geholfen haben, da sie irgendwie an meinem Problem vorbeigingen.

Ich habe aber eine Lösung gefunden, indem ich die Funktion einen festen Wert ausgeben lasse. Dafür habe ich das "False" bei return in Anführungszeichen gesetzt:

PHP:
function checkEmail($eMail) {       
  // Syntax prüfen
 if(preg_match("/^( [a-zA-Z0-9] )+( [a-zA-Z0-9\._-] )*@( [a-zA-Z0-9_-] )+( [a-zA-Z0-9\._-] +)+$/" , $eMail)) {
  // Domain prüfen
  list($username,$domain)=split('@',$eMail);
  if(!checkdnsrr($domain, 'MX')) {
   return "false";
  }
  if(!fsockopen($domain,25,$errno,$errstr,30)) {
   return "false";
  }
  return "true";
 }
 return "false";
}

Keine Ahnung ob das im Sinne des Erfinders ist, aber nun klappt es.


@djbergo

Danke für Deinen Hinweis mit der Bestätigungsmail. Habe ich gleich umgesetzt.

Basteidel
 
Zurück