8791 sujets

Développement web côté serveur, CMS

Voilà mon souci, j'avais fais un formulaire de contact pour mon site perso et j'ai décidé de le sécuriser en mettant la vérification d'adresse e-mail.

Le souci est qu'il me vérifie l'écriture de l'adresse correctement, mais qu'elle que soit l'adresse rentrée lors de la vérification du domaine mon script m'affiche le message d'erreur que j'ai configuré (adresse mail non valide).

J'ai bien tenté de modifier mon script surtout la partie avant le Doctype, j'ai placé des commentaires à divers endroits pour localiser le problème mais en vain.


<?PHP
	session_start();
	$_SESSION['nsession'] = $_POST['nformu'];
	$_SESSION['mailsession'] = $_POST['mailformu'];
	$_SESSION['objetsession'] = $_POST['objetformu'];
	$_SESSION['areasession'] = $_POST['areaformu'];
	
	// Fonction de vérification validité du mail
	
	function valid_email($email)
	{	$email = strtolower(trim($email));
		$car_dom = '[-\.a-z0-9]{0,62}[a-z0-9]';
		$car_ext = '[a-z]{2,63}';
		$user = '[-\.a-z0-9_]{1,31}';
		$dom = $car_dom.'\.'.$car_ext;
		$motif = '^'.$user.'@('.$dom.')$';
		
		//Test de l'écriture
		if(ereg($email,$motif))
		{	$test = checkdnsrr($motif,'MX');
		}
		return $test;
	}
?>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">

<head>
</head>

<body>
	<div id="pere">
		<div id="ban">
			<div id="haut">
			</div>
		
			<div id="menu">
			</div>
		</div>
		
		<div id="center">
			<?PHP
				include ('includes/menugch1.php');
			?>
			
			<div id="ctr">
				<h1>-- Formulaire --</h1>
				<h2>Afin d'entrer en relation avec nous, veuillez remplir ce formulaire.</h2>
				<br />
				<div id="messmail">
					<?PHP
						str_replace("\r",'',$_POST['mailformu']);
						str_replace("\n",'',$_POST['mailformu']);
						if (isset($_POST['submit']))
						{	if (!empty($_POST['nformu']) &&
							    !empty($_POST['mailformu']) &&	valid_email($_POST['mailformu']) &&
								$_POST['objetformu'] != '-- Sélectionner --' &&
							    !empty($_POST['areaformu']))
								{	$headers = "From: ".$_POST['mailformu']."\n";
									$headers.="X-Sender: ".$_POST['mailformu']."\n";
									$headers .= "X-Mailer: PHP\n";
									$headers .= "Return-Path: <".$_POST['mailformu'].">\n";
									$headers .= "Content-Type: text/html;charset=iso-8859-1\n";
									$mail = 'mon adresse mail';
									$sujet = 'mail de dol-celeb.com';
									$corps = $_POST['nformu'].' <br />'.$_POST['objetformu'].'<br /> '.$_POST['areaformu'];
									$test = mail($mail,$sujet,$corps,$headers);
										if($test == 1) 
										{	echo'<span class="good">Votre mail a bien été envoyé, nous vous répondrons dans un delai le plus court possible</span>';
										}
										else
										{	echo'<span class="notgood">L\'envoie du mail a échoué, veuillez recommencer ultérieurement.</span>';
										}
								}
								elseif (!valid_email($_POST['mailformu']))
								{	echo'<p class="notgood">L\'adresse e-mail n\'est pas valide.</p>';
								}
								else
								{	echo'<p class="notgood">Les champs signalés par un astérisque sont incorrects.</p>';
								}
						 }
					?>
				</div>
				<br />
				<div id="formulaire">
				<form method="post" action="formulaire.php" >
					<fieldset><legend>Civilité et coordonnées</legend>
						<br />
						<p><label>Nom/Pseudo : </label>
							<input type="text" id="nformu" name="nformu" size="20" maxlength="30" 
							value="<?PHP echo $_SESSION['nsession']; ?>" />
							<?PHP
								if(empty($_SESSION['nsession']))
								{ ?>	<span class="notgood">*</span>
							<?PHP } ?>
						</p>
						<br />
						<p><label>e-mail : </label>
							<input type="text" id="mailformu" name="mailformu" size="30" maxlength="50" class="calage" 
							value="<?PHP echo $_SESSION['mailsession']; ?>" />
							<?PHP
								if(empty($_SESSION['mailsession']) || !valid_email($_POST['mailformu']))
								{ ?>	<span class="notgood">*</span>
							<?PHP } ?>
						</p>	
					</fieldset>
					
					<fieldset>
						<legend>Votre demande :</legend>
							<br />
							<br />
							<p><label>Objet :</label>
								<select name="objetformu" id="objetformu">
									<option selected="selected">	
										<?PHP
											if (isset($_POST['objetformu']))
											{	echo $_SESSION['objetsession'];
											}
											else
											{	echo'-- Sélectionner --';
											}
										?>
									</option>
									<option>Remarque/Suggestion sur le site</option>
									<option>Demande de partenariat</option>
									<option>Collaborer au site (articles, dessins, fanfics,...)</option>
									<option>A propos du forum</option>
									<option>Autre</option>
								</select>
							<?PHP
								if(empty($_SESSION['objetsession']) || $_SESSION['objetsession'] == '-- Sélectionner --')
								{ ?>	<span class="notgood">*</span>
							<?PHP } ?>
							</p>
							<br />
							<br />
							<p><label>Votre texte : </label>
							<?PHP 
								if(empty($_SESSION['areasession']))
								{ ?>	<span class="notgood">*</span>
							<?PHP } ?>
							<br />
							<textarea cols="62" rows="8" id="areaformu" name="areaformu"><?PHP echo $_SESSION['areasession']; ?></textarea>
							</p>
					</fieldset>
					<br />
					<div id="button">
						<input type="submit" id="submit" name="submit" value="envoyer" class="button" />
					</div>
				</div>
				</form>

			</div>
			
		</div>
		
		<div id="pied">
			<div id="bg">
			</div>
		</div>
	</div>

</body>
</html>

Modifié par Ripper Roo (21 Feb 2008 - 12:59)
Administrateur
es-tu bien sûr que la fonction
checkdnsrr
est activée sur ton hébergement ? elle est notamment indisponible sous windows.

le plus simple est de vérifier la syntaxe sans faire de résolution sur le MX.
à savoir :
function valid_email($email) {
return eregi('^[_a-z0-9-]+(\.[_a-z0-9-]*)*@[a-z0-9-]+(\.[a-z0-9-]+)+$', $email);
}

Modifié par dew (15 Feb 2008 - 00:25)
dew a écrit :
es-tu bien sûr que la fonction
checkdnsrr
est activée sur ton hébergement ? elle est notamment indisponible sous windows.

le plus simple est de vérifier la syntaxe sans faire de résolution sur le MX.
à savoir :
function valid_email($email) {
return eregi('^[_a-z0-9-]+(\.[_a-z0-9-]*)*@[a-z0-9-]+(\.[a-z0-9-]+)+$', $email);
}


Effectivement je en savais pas pour cette fonction. Je suis chez OVH je vais vérifier. sinon je vais modifier ma fonction comme tu le suggères. Je vais consulter aussi ton lien Felipe. Je vous tiens au courant. Merçi !
Bonjour a tous,

Ripper Roo, la fonction de verif d'email de ton script n'est pas bonne.
Il sagit pour moi d'un soucis au niveau de l'exploration de l'adresse, j'ai modifier la recherche du domaine avec un expression réguliaire que j'utilise pour justement decouper les adresses mail au niveau de @


Essai comme ceci (j'ai essayer sur un bout de page sur 1and1 et sur une machine dédié chez OVH ca fonctionne):


Remplace :

// Fonction de vérification validité du mail

	

	function valid_email($email)

	{	$email = strtolower(trim($email));
		$car_dom = '[-\.a-z0-9]{0,62}[a-z0-9]';
		$car_ext = '[a-z]{2,63}';
		$user = '[-\.a-z0-9_]{1,31}';
		$dom = $car_dom.'\.'.$car_ext;
		$motif = '^'.$user.'@('.$dom.')$';		

		//Test de l'écriture
		if(ereg($email,$motif))
		{	$test = checkdnsrr($motif,'MX');
		}
		return $test;
	}


Par cela :

// Fonction de vérification validité du mail

	function valid_email($email)

	{	
     if(   (preg_match('/(@.*@)|(\.\.)|(@\.)|(\.@)|(^\.)/', $email)) ||
      (preg_match('/^.+\@(\[?)[a-zA-Z0-9\-\.]+\.([a-zA-Z]{2,3}|[0-9]{1,3})(\]?)$/',$email)) ){
      
      	$host = explode('@', $email);
        
		if (checkdnsrr($host[1], 'MX'))
	// pour la suite de ton script, tu as besoin de test = 1 ou 0 donc
        $test='1';
        else
        $test='0';
	}
    }

Modifié par AddiKTiV (17 Feb 2008 - 11:15)