Mehrfacher Emailversand + [TUT] Email-Adressen effektiv validieren

M-P

Mitglied
PHP:
	if ($_POST['submit'])
	{		
	$Emails = $_POST["Emails"];
	
	$ats ="@";
	$emailanzahl= substr_count($Emails, $ats);
	
	$Email = explode (",",$Emails);

	while($emailanzahl>0)
	{
		$emailanzahl=$emailanzahl-1;
			//ÜBERPRÜFUNG...
			 include("mailcheck.php");
	  
				if(checkAddress(trim($Email[$emailanzahl])))
				{}
				else
				{
					header ("Location: einladung.php?fehler=1"); 
					exit;
				}
				
			//MAIL VERSAND++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
			/* Empfänger */
			$empfaenger = $Email[$emailanzahl];
			
			/* Absender */
			$absender = $_SESSION["user_nickname"];
			
			/* Betreff */
			$subject = $_SESSION["user_vorname"]."möchte dich einladen.";
			
			/* Nachricht */
			$neuezeile= "\n";
			$message = 'Hallo.';
			
			/* Baut Header der Mail zusammen */
			$headers .= 'From:' . $absender . "\n";
			$headers .= "Content-type: text/html\n";
			
			// Extrahiere Emailadressen
			$empfaengerString = implode(',', $empfaenger);
			
			/* Verschicken der Mail */
			mail($empfaenger, $subject, $message, $headers);
			
			//MAIL VERSAND++++++++++++++++++++++++++++++++++++++ENDE++++++++++++++++++++	   
		
	}
    }
echo "<strong>Einladungen an Freunde wurden versandt.</strong>";

Hier die mailcheck.php http://www.tutorials.de/forum/php-tutorials/306797-email-adressen-effektiv-validieren.html
PHP:
<?php
function checkAddress($Address, $BlacklistPath = ""){
  if(!preg_match("/^[A-Z0-9._%+-ÄÖÜäöü]+@[A-Z0-9.-ÄÖÜäöü]+\.[A-Z]{2,6}$/i", $Address))
    return false;
  
  list($LocalPart, $DomainPart) = explode("@", $Address);
  
  if($BlacklistPath){
    if(!is_file($BlacklistPath))
      return false;
    
    if(($BlacklistedDomains = file($BlacklistPath)) === false)
      return false;
    
    foreach($BlacklistedDomains as $BlacklistedDomain){
      if(trim($BlacklistedDomain) == $DomainPart)
        return false;
    }
  }
  
  if(($Connection = @fsockopen($DomainPart, 80, $ErrorNumber, $ErrorString, 5)) === false)
    return false;
  fclose($Connection);
  
  return true;
}
?>

Naja also wenn ich eine email eingebe dann wird immer der fehler aktiviert und wenn ich z.b. "sdfsdjofisdj" eingeb, dann funktioniert es.
Ich weiß is einiges an Code habs auch mit vielen If- und Forschleifen versucht zu lösen hat aber irgendwie nie geklappt =(
 
Hi

um den Fehler zu finden, mach mal statt return false return 'Fehler1'; return 'Fehler2'; usw. Dann weißt du schonmal WO das Script abbricht. Mit folgendem Schnipsel kannst du das überprüfen.
PHP:
$value = checkAdress('ich@du.er');
if( !is_bool($value) ) //return true kannst du stehen lassen'
  die($value);

Achja, und setz das include mal VOR die Whileschleife, bei 100 Emailadressen würde ie Datei dann 100mal includet werden ;)
 
Ansonsten einfach auf die Funktionalität von PHP zurückgreifen.

PHP:
var_dump(filter_var('bob@example.com', FILTER_VALIDATE_EMAIL));
 
Hi

um den Fehler zu finden, mach mal statt return false return 'Fehler1'; return 'Fehler2'; usw. Dann weißt du schonmal WO das Script abbricht. Mit folgendem Schnipsel kannst du das überprüfen.
PHP:
$value = checkAdress('ich@du.er');
if( !is_bool($value) ) //return true kannst du stehen lassen'
  die($value);

Achja, und setz das include mal VOR die Whileschleife, bei 100 Emailadressen würde ie Datei dann 100mal includet werden ;)

Er kommt ja nicht einmal zum return false - bleibt einfach hängen.

Ansonsten einfach auf die Funktionalität von PHP zurückgreifen.

PHP:
var_dump(filter_var('bob@example.com', FILTER_VALIDATE_EMAIL));

Dabei wird aber nicht überprüft, ob die Adresse gültig ist.

Ich habe es jetzt nocheinmal überarbeitet aber es bleibt weiterhin hängen:


PHP:
//EMAILEINGABE z.b.  abc@gmx.de,bcd@gmx.de,cde@gmx.de

include("mailcheck.php");

$Emails = trim($_POST["Emails"]);
	
	$ats ="@";
	$emailanzahl= substr_count($Emails, $ats);    //Beim Beispiel = 3
	$Email = explode (",",$Emails);	

	while($emailanzahl>0)                                       //3 größer als 0
	{
		$emailanzahl=$emailanzahl-1;               //-1 weil [0] auch gespeicherter Wert
			//ÜBERPRÜFUNG...
			 
				if(checkAddress2($Email[$emailanzahl]))
				{}
			else
				{
					header ("Location: einladung.php?fehler=1");  
					exit;
				}		
	}
	echo "test";

Mailcheck leicht angepasst:

PHP:
function checkAddress2($Email[$emailanzahl], $BlacklistPath = "")
  {
  if(!preg_match("/^[A-Z0-9._%+-ÄÖÜäöü]+@[A-Z0-9.-ÄÖÜäöü]+\.[A-Z]{2,6}$/i", $Email[$emailanzahl]))
    return false;
  
  list($LocalPart, $DomainPart) = explode("@", $Email[$emailanzahl]);
  
  if($BlacklistPath){
    if(!is_file($BlacklistPath))
      return false;
    
    if(($BlacklistedDomains = file($BlacklistPath)) === false)
      return false;
    
    foreach($BlacklistedDomains as $BlacklistedDomain){
      if(trim($BlacklistedDomain) == $DomainPart)
        return false;
    }
  }
  
  if(($Connection = @fsockopen($DomainPart, 80, $ErrorNumber, $ErrorString, 5)) === false)
    return false;
  fclose($Connection);
  
  return true;
}
 
Ich habe mittlerweile alles hinbekommen. Eigentlich relativ simpel. Hier mal für die Allgemeinheit, falls jemand das selbe Problem hat:
(Desweiteren habe ich das Script erweitert: Emailgrenze(Hier:3) und Zeitsperre(Hier:nicht definiert)):

PHP:
   	if ($_POST['submit'])
	{		
	
		$Emails = trim($_POST["Emails"]);
		
		$ats ="@";
		$emailanzahl= substr_count($Emails, $ats);
		
		if($emailanzahl>0)
		{
		
			$Email = explode (",",$Emails);
		
			//Maximal Emailanzahl
			if($emailanzahl>3)
			{
				echo 'Es dürfen nur maximal 3 Emails eingegeben werden. <em><a href=faq.php>Warum?</a><em><br><br>';
				$emailanzahl=$emailgrenze;
			}
			while($emailanzahl>0)
			{
				$emailanzahl=$emailanzahl-1;
				$verschicken=true;
				//EMAILPRÜFUNG
				if(!preg_match("/^[A-Z0-9._%+-ÄÖÜäöü]+@[A-Z0-9.-ÄÖÜäöü]+\.[A-Z]{2,6}$/i", $Email[$emailanzahl]))
				{
				echo 'Die Emailadresse '.$Email[$emailanzahl].' ist ungültig.<br>';
				$verschicken=false;
				}
				else
				{	
				list($LocalPart, $DomainPart) = explode("@", $Email[$emailanzahl]);
				if(($Connection = @fsockopen($DomainPart, 80, $ErrorNumber, $ErrorString, 5)) === false)
				{
				echo 'Die Emailadresse '.$Email[$emailanzahl].' ist ungültig.<br>';
				$verschicken=false;
				}
				fclose($Connection);
			
				if($verschicken==true)
				{
				//MAIL VERSAND++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
				/* Empfänger */
				$empfaenger = $Email[$emailanzahl];
				
				/* Absender */
				$absender = 'ABSENDEREMAIL';
				
				/* Betreff */
				$subject = 'BETREFF';
				
				/* Nachricht */
				$message = 'NACHRICHT';
				
				/* Baut Header der Mail zusammen */
				$headers .= 'From:' .$absender. "\n";
				$headers .= "Content-type: text/html; charset=utf-8\r\n";
				$headers .= "MIME-Version: 1.0\r\n";
				$headers .= "Content-Transfer-encoding: 8bit\r\n";
				$headers .= 'Reply-To:' . $absender . "\n"; 
				
				
				// Extrahiere Emailadressen
				$empfaengerString = implode(',', $empfaenger);
				
				/* Verschicken der Mail */
				mail($empfaenger, $subject, $message, $headers);
				
				//MAIL VERSAND++++++++++++++++++++++++++++++++++++++ENDE++++++++++++++++++++	 
				
				echo 'Email an: '.$Email[$emailanzahl].' versandt.<br>';
				$_SESSION["emails_verschickt"]=$_SESSION["emails_verschickt"]+1;
				}
			}
		}	
			
		$_SESSION["zeitsperre"]= mktime(date("h"),date("i"),date("s")+$user_zeit_sperre,date("m"),date("d"),date("Y"));
		
		echo '<br><strong>Um weitere Emails zu verschicken bitte <a href=XXX.php>Hier klicken</a>.</strong>';	
	}
	else{echo 'Da hast du wohl das @ vergessen. <a href=XXX.php>Nochmal versuchen</a>';}
    }

Beim Formular muss man natürlich, bevor man das Formular mit echo ausgibt folgendes einfügen:
PHP:
$jetzt= time (); // Jetzt
if($jetzt < $_SESSION["zeitsperre"])
	{}
echo'  FORMULAR ';
und wenn ihr ausgeben möchtet wie lange es noch dauert, bis man dass Formular/Email wieder abschicken, kann noch folgendes in die if-Klammer geschrieben werden:

PHP:
$diff=$_SESSION["zeitsperre"]-$jetzt;
		echo '<br>Es dauert noch '.strftime("%M Minute(n) und %S", $diff).
 
Zuletzt bearbeitet:
Zurück