Credits

Gaming images in backgrounds are trademarks of their respective holders.
Museo Sans font by Jos Buivenga (exljbris) : http://www.exljbris.nl

Forum PAO LaLogotheque.com: Envoi formulaire depuis chez Free - Forum PAO LaLogotheque.com

Aller au contenu

Hide message Show message

Bienvenue sur le Forum d'entraide à l'infographie de Lalogotheque.com !!!





Page 1 sur 1
  • Vous ne pouvez pas commencer un sujet
  • Vous ne pouvez pas répondre à ce sujet

Envoi formulaire depuis chez Free Le gros bazar !

#1 L'utilisateur est hors-ligne   Haldan 

  • Logoteur de Platine
  • Voir la galerie
  • Groupe : Membre
  • Messages : 1 247
  • Inscrit(e) : 11-mars 05

  Posté 17 mai 2013 - 14:19

Bonjour à tous
Me revoilà avec un soucis.
Sur mon site, ya un formulaire en HTML et CSS... normal!
J'utilise d'ordinaire le très bon script PHP d'aspirine.org : contact.php.
Souple et simple, toutes options, il a toujours fonctionné ailleurs que chez free.
Mais pas chez eux !!!
J'ai essayé Formmail.pl ou Form2mail, mais l'hebergement perso de free ne gère apparament pas les scripts perl.
Ce qui se passe avec contact.php, c'est que je ne recois, durant mes tests, qu'un mail sur 10... et c'est très génant.
En général, le premier de la journée fonctionne. A partir du 2eme, le script s'execute en une fraction de seconde et n'arrive pas.
Vous pouvez le testerICI
Si quelqu'un peut me dépatouiller... :mojito:

Ci joint les codes.
l'HTML

<form class="textes_vignette" action="contact.php" method="post" enctype="multipart/form-data">
				<label for="name">Votre nom</label>
				<input type="text" name="NOM" value="" id="name" />
                <label for="email">Votre téléphone</label>
				<input type="text" name="PHONE" value="" id="telephone" />
				<label for="email">Votre e-mail</label>
				<input type="text" name="MAIL" value="" id="email" />
                <label for="email">Votre message : </label>
				<textarea  name="MESSAGE" value="Your Message" id="message" ></textarea>
				<input type="submit" name ="submit" value="Envoyer votre message" />
</form>

le PHP : contact-config.php
<?php /*************************************************************************
	* contact.config.php
	* Fichier de configuration de config.php
	* Copyright (c) François Pirsch 2007
	* http://aspirine.org/contact/
	* Distribué sous licence BSD.
	*
	* Envoi par mail des données d'un formulaire de contact.
	* Le formulaire lui-même doit être dans une page html séparée,
	* il doit être envoyé vers ce script php avec la méthode POST.
	* 
	* Il doit contenir un champ nommés "email" ou "mail"
	* et un champ nommé "sujet" ou "subject".
	*************************************************************************/

/**************************************************************************
		configuration de base
 **************************************************************************/

/* Date de dernière modification de la configuration
 */
$date_modified = "Fri, 29 Mar 2013 14:26:13 +0100";

/* Version chiffrée du mot de passe pour l'accès à l'installation et la configuration.
 * Ceci n'est pas le mot de passe à entrer.
 * En cas d'oubli du mot de passe, supprimer cette ligne, un nouveau sera généré.
 */
$password = '';

/* Adresse email du destinataire du formulaire. On peut donner plusieurs
 * adresses séparées par des virgules.
 * Exemples : 
 *		$to = '';			<-- vide, si vous utilisez l'option "destinataires au choix"
 *		$to = 'nom.prenom@fournisseur.fr';
 *		$to = 'dest1@fournisseur.fr, dest2@fournisseur.fr';
 */
$to = "freelance.saintpaul@free.fr";

/* Liste des champs obligatoires.
 * Mettre entre guillemets les noms des éléments de formulaires, séparés par des virgules.
 * Respecter les majuscules/minuscules !
 * Exemples :
 *		$champs_obligatoires = array("email", "sujet", "nom", "prenom", "adresse");
 *		$champs_obligatoires = array();			<-- aucun champ obligatoire
 */
$champs_obligatoires = array("NOM", "MAIL", "PHONE");


/**************************************************************************
		configuration avancée - options
 **************************************************************************/
/* Mettre 1 pour recevoir le mail sous forme html au lieu de texte simple.
 */
$mail_en_html = 0;

// Si vous voulez recevoir une notification quand une nouvelle version est
// disponible, mettez cette variable à 1, sinon à 0.
// La vérification se fait à chaque fois qu'un de vos visiteurs utilise votre
// formulaire. La notification est éventuellement jointe au mail qui vous est
// envoyé.
$verifier_mises_a_jour = 1;

// Si vous voulez récupérer plus facilement les données dans un tableur
// par copier-coller, mettez à 1 cette variable :
$formater_pour_tableur = 0;

// Par défaut les champs non obligatoires vides ne sont pas envoyés dans le mail.
// Mettez 1 si vous tenez à les recevoir quand-même (sous forme "nom=" suivi de rien).
$envoyer_aussi_les_champs_vides = 0;

// Vers quelle page html ou php sera redirigé le visiteur après l'envoi du formulaire ?
$page_ok = "merci.html";

// Quelle page html ou php afficher en cas d'erreur ?
$page_erreur = "contacterreur.html";

// Mettre éventuellement ici un sujet de mail s'il n'est pas précisé dans
// le formulaire.
$sujet = "Demande de contact";


// Option : mettre ici les noms des variables HTTP à envoyer avec le mail,
// entre guillemets et séparés par des virgules.
// Noms possibles : voir les variables de serveur sur
// http://www.php.net/manual/fr/reserved.variables.php
// Exemple : $variables_http = array('REMOTE_ADDR', 'HTTP_USER_AGENT');
$variables_http = array();

// Option : enregistrement dans une base de données.
// Indiquer le login et le mot de passe de la base de données.
// Indiquer aussi le nom des champs et des variables HTTP à enregistrer
// dans la table (Ne pas utiliser le nom de champ "n").
$db_server = "localhost";
$db_login = "";
$db_password = "";
$db_database_name = "";
$db_champs_a_enregistrer = array("email", "sujet");
$db_nom_de_la_table = "contact_php";

// Option : si l'utilisateur peut sélectionner un destinataire particulier
// dans une liste déroulante, mettre ici la correspondance entre le nom affiché
// dans le formulaire et l'adresse email de chaque destinataire.
// Exemples :
//	$destinataires_au_choix = array("direction" => "chef@nomdedomaine.fr",
//									"webmaster" => "web@nomdedomaine.fr",
//									"service après-vente" => "sav@nomdedomaine.fr");
//	$destinataires_au_choix = array();			<-- option désactivée
// Les noms doivent correspondre exactement à ceux qui sont affichés dans la liste
// déroulante (les balises <option> de l'élément <select>).
// La liste déroulante doit s'appeler "to".
// Si vous utilisez cette option, il vaut mieux laisser la variable $to vide (voir
// au tout début de ce fichier).
$destinataires_au_choix = array();

// Option anti-spam : utiliser reCaptcha ( http://recaptcha.net/ )
// Inscrivez votre site sur recaptcha.net, intégrez le code donné avec la clé publique
// dans votre formulaire, et indiquez la clé privée ici pour que contact.php
// puisse faire la vérification.
$recaptcha_privatekey = "";

// Option : Chiffrement (cryptage) du mail
// Pour que le mail vous parvienne crypté, il suffit de donner une clé de
// chiffrement sous forme d'un petit texte d'exactement 16 caractères.
//
// On peut la donner directement :
//		$cle_chiffrement = "Ceci est ma clé!";
// Ou on peut la stocker séparément dans un fichier texte et donner le chemin :
//		$cle_chiffrement = '/home/moncompte/cle.txt';	// (débute par un slash)
//		$cle_chiffrement = './cle.txt';					// (débute par un point)
// Elle doit être constituée d'exactement 16 caractères du jeu Latin-1.
$cle_chiffrement = "";

?>


La suite: contact.php
<?php /*************************************************************************
	* contact.php
	* Copyright (c) François Pirsch 2007
	* http://aspirine.org/contact/
	* Distribué sous licence BSD.
	*
	* Envoi par mail des données d'un formulaire de contact.
	* Le formulaire lui-même doit être dans une page html séparée,
	* il doit être envoyé vers ce script php avec la méthode POST.
	* 
	* Il doit contenir un champ nommé "email"
	* et un champ nommé "sujet" ou "subject".
	* Tout champ nommé "email2" (utilisé pour confirmation) sera ignoré.
	*
	* 12 avril 2009
	*	- la page de confirmation de mail peut être complètement personnalisée.
	*	- correction de bugs quand le champ sujet est laissé vide par l'utilisateur.
	*	- le sujet peut être multiple, par exemple si on en choisit plusieurs avec des cases à cocher.
	*
	* 18 janvier 2009
	*   - MAX_FILE_SIZE n'est plus affiché dans le compte-rendu.
	*
	* 3 janvier 2009
	*   - correction d'un bug mineur
	*
	* 19 déc 2008
	*	- modif pour l'affichage du sujet dans le compte-rendu.
	*   - gère les fichiers attachés. (php 4.1.0 minimum)
	*
	* 31 octobre 2008
	*   - correction d'un bug dans l'utilisation de champs multiples avec une base de donnée.
	*
	* 19 septembre 2008
	*	- Les destinataires peuvent être choisis avec des cases à cocher ou des
	*	  boutons radio, et pas seulement dans une liste déroulante.
	*	- Quelques corrections de bugs -  merci à Ben-J
	*
	* 2 septembre 2008
	*   - Utilisation uniquement de balises <?php pour un maximum de compatibilité
	*	- Les caractères spéciaux sont mieux pris en compte (<, >, antislashes...)
	*
	* 16 août 2008:
	*   - Les erreurs mysql sont détaillées.
	*	- possibilité de donner le nom de la base de données.
	*
	* 14 août 2008 :
	*   - correction de bug occasionnel
	*   - erreur explicite en cas de mauvaise config des destinataires au choix.
	*   - Pas d'erreur si le champ "email" est vide et pas obligatoire.
	*   - Le champ "from" par défaut est maintenant automatique, avec le
	*     nom de domaine correct.
	*
	* 29 décembre 2007 :
	*	- notification automatique en cas de nouvelle version.
	*	- intégration du système anti-spam recaptcha.net
	*	- possibilité pour le visiteur de choisir le destinataire.
	*	- possibilité de chiffrer le mail.
	*	- possibilité d'utiliser une BDD sur un autre serveur que localhost.
	*	- bug du formulaire vide corrigé.
	*************************************************************************/
/*
Pour le chiffrement des mails, voir mcrypt, qui a priori devrait couramment être installée. Mais faudra vérifier.
http://fr.php.net/manual/fr/ref.mcrypt.php
*/

include 'contact.config.php';		// Provoque une erreur si le fichier est absent, et c'est bien.
@include 'recaptchalib.php';		// C'est en option, donc il ne doit pas y avoir d'erreur si le fichier est absent.

$VERSION_DATE = '2009-04-12';
$VERSION_INFO_PATH = 'http://aspirine.org/contact/version.xml';

/* Expéditeur par défaut.
 * Si le visiteur ne laisse pas son adresse quand elle est facultative, le mail doit quand-même avoir un expéditeur
 * et le nom de domaine doit correspondre à celui du site web, sinon le mail risque d'être refusé.
 */
$from = "Formulaire_ideefixe@".$_SERVER["HTTP_HOST"];		// donne "contact.php@domaine_de_mon_site.com" par exemple.

$EMPTY_FIELD = '(vide)';

/*     ________________________________
 * ___/ Quelques fonctions utilitaires \____________________________________________
 */

// Vérifie l'existence du domaine indiqué.
function HostExists($domaine) {
//  if($domaine == 'ath.forthnet.gr') return true;
  if (preg_match("/^([0-9]{1,3}\\.){3}[0-9]{1,3}$/", GetHostByName($domaine))) return true;
  // Si la vérification a échoué, on réessaie éventuellement en ajoutant "www."
  // C'est un peu foireux dans le cas des domaines avec uniquement un MX et pas de serveur web,
  // Mais ça fonctionne dans la plupart des cas.
  // Voir les fonctions checkdnsrr() ou getmxrr(), qui ne sont pour l'instant pas dispo
  // sous windows.
  if(substr($domaine, 0, 4) == "www.") return false;
  return (preg_match("/^([0-9]{1,3}\\.){3}[0-9]{1,3}$/", GetHostByName("www.$domaine"))) ? true : false;
}

// Vérifie la validité de l'adresse.
function AdresseValide($adresse) {
	if(strlen($adresse) > 100) return false;
	$atom = "[!#-'*+\\-\\/-9=?A-Z^-~]+";
	$regex_adresse = "/^$atom(\\.$atom)*@$atom(\\.$atom)*\\.[a-zA-Z]{2,4}$/";
	if(!preg_match($regex_adresse, $adresse)) return false;
	// On sait qu'on a un @ et qu'il est bien placé.
	return HostExists(substr($adresse, strpos($adresse, '@')+1));
}

// Quoted Printable. Conforme au RFC 2045 - http://rfc.net/rfc2045.html ?
function QPencode($str, $iso_tag)
{
    global $is_quoted;
    $is_quoted = false;
	if(!defined('CRLF'))
	    define('CRLF', "\r\n");
    
    $lines = preg_split("/\r?\n/", $str);
    $out     = '';
    
    foreach ($lines as $line)
    {
        $newpara = '';
        
        for ($j = 0; $j <= strlen($line) - 1; $j++)
        {
            $char = substr ( $line, $j, 1 );
            $ascii = ord ( $char ); 
            
            if ( $ascii < 32 || $ascii == 61 || $ascii > 126 ) 
            {
                 $char = '=' . strtoupper ( dechex( $ascii ) );
                 $is_quoted = true;
            }
            
            if ( ( strlen ( $newpara ) + strlen ( $char ) ) >= 76 ) 
            {
                $out .= $newpara . '=' . CRLF;   $newpara = '';
                $is_quoted = true;
            }
            $newpara .= $char;
        }
        $out .= $newpara;
    }
    $out = trim ( $out );   
    // Ici on perd la conformité RFC 2045
    if($is_quoted && $iso_tag) $out = "=?ISO-8859-1?Q?".ereg_replace("\\?", "=3F", $out)."?=";
    return $out;
}

/*
** Fonction: makeAttachment
** Sortie: STRING
** Description: Renvoie les en-têtes et les données pour un fichier joint.
** Les fichiers joints sont toujours codés en base64 même si ce n'est pas
** nécessaire.
*/
function attachFile($type, $nom, $contenu)
{
	// Envoi du type du contenu
	$body = "Content-Type: $type";
	if($nom != "") $body .= '; name="'.$nom.'"';
	$body .= "\n";
	$body .= "Content-Transfer-Encoding: base64\n\n";
	$body .= chunk_split(base64_encode($contenu), 74, "\n");
	$body .= "\n";
	return $body;
}

// Filtre une chaîne entrée par l'utilisateur.
// On interdit tous les caractères non ISO-8859 (heu ,en gros)
function filtre_securite($s) {
	return preg_replace('/[^\\x20-\\x7f\\xa0-\\xff]/', '', $s);
}

function apostrophes($s) {
	return preg_replace('/\\\\(["\'])/', '$1', $s);
}



/*     _________________________________________
 * ___/ Enregistrement dans une base de données \____________________________
 */
function enregistre_bdd() {
	global $db_server;
	global $db_login;
	global $db_password;
	global $db_database_name;
	global $db_nom_de_la_table;
	global $db_champs_a_enregistrer;
	global $db_enregistrement;
	global $message;
	global $separateur;

	if(!($dbLink = @mySql_connect($db_server, $db_login, $db_password)))
		return "Impossible de se connecter au serveur MySQL.<br/>\nLe serveur MySQL dit : ".mySql_error($dbLink)."\n";
	$ce_qui_va = "Connection au serveur MySQL OK.<br />\n";
	if(!isset($db_database_name) || !$db_database_name)
		$db_database_name = $db_login;
	if(!mySql_select_db($db_database_name, $dbLink))
		return "Impossible de sélectionner la base de données $db_database_name.<br/>\nLe serveur MySQL dit : ".mySql_error($dbLink)."\n";
	$ce_qui_va = "Sélection de la base de données OK.<br />\n";

	// On crée la table et ses colonnes selon les besoins.
	if(!mySql_query("CREATE TABLE IF NOT EXISTS `$db_nom_de_la_table` (`n` INT UNSIGNED AUTO_INCREMENT, KEY `n` (`n`));", $dbLink))
		return $ce_qui_va."Erreur à la création de la table.<br/>\nLe serveur MySQL dit : ".mySql_error($dbLink)."\n";
	$ce_qui_va .= "Table OK.<br />\n";

	$db_result = mySql_query("SHOW COLUMNS FROM `$db_nom_de_la_table`;", $dbLink);
	$db_champs = array();
	while ($row = mysql_fetch_array($db_result, MYSQL_NUM))
		$db_champs[$row[0]] = 1;
	$champs_a_ajouter = array();
	if(is_array($db_champs_a_enregistrer))
		foreach($db_champs_a_enregistrer as $champ) {
			if(!$db_champs[$champ])
				array_push($champs_a_ajouter, "ADD `$champ` TEXT");
		}
	if(count($champs_a_ajouter) &&
		!mySql_query("ALTER TABLE `$db_nom_de_la_table` ".implode(', ', $champs_a_ajouter).";"))
		return $ce_qui_va."Erreur en ajoutant les champs à la table.<br/>\nLe serveur MySQL dit : ".mySql_error($dbLink)."\n";

	// Préparation des données à enregistrer.
	$noms = '(';
	$valeurs = 'VALUES (';
	if(is_array($db_enregistrement))
		foreach($db_enregistrement as $nom => $valeur) {
			$noms .= "`$nom`, ";
			if(is_array($valeur))
				$valeur = implode(", ", $valeur);
			$valeurs .= "'".mysql_real_escape_string($valeur, $dbLink)."', ";
		}
	$noms = substr($noms, 0, -2) . ')';
	$valeurs = substr($valeurs, 0, -2) . ')';

	// Insertion dans la base de données.
	if(!mySql_query("INSERT INTO `$db_nom_de_la_table` $noms $valeurs;", $dbLink))
		return $ce_qui_va."Erreur à l'enregistrement dans la table.\n$noms\n$valeurs<br/>\nLe serveur MySQL dit : ".mySql_error($dbLink)."";
	$message = "Courrier numéro$separateur".mySql_insert_id($dbLink)."\n" . $message;
	return "";
}


/*     _____________________
 * ___/ filtre html         \____________________________________________
 */
function html($s) {
	return apostrophes(htmlentities(str_replace("\\\\", "\\", $s)));
}

/*     _____________________
 * ___/ Programme principal \____________________________________________
 */


/*
 * Initialisations.
 */
$erreur = '';				// Si cette variable contient un message, le mail n'est pas envoyé et le message est affiché.
$message = '';				// le message texte brut à envoyer, avec toutes les infos supplémentaires, en clair.
if(!isset($sujet))			// Au cas où aucun sujet par défaut ne serait défini (normalement il l'est dans contact.config.php)
	$sujet = 'Demande de contact';	// le sujet après filtrage de sécurité, prêt à afficher dans le compte rendu.

// DEPRECATED :
$message_html = '';			// le message envoyé, sans infos supplémentaires, en clair et présenté en html (version pour le visiteur)

$mail_text = '';			// le message envoyé, avec toutes les infos supplémentaires, éventuellement chiffré.
$separateur = ' = ';
if($formater_pour_tableur)
	$separateur = "\t";
$HORIZONTAL_RULE = ($mail_en_html) ? "<hr>" : str_repeat('-', 64);
$db_enregistrement = array();
$champ = array();			// hash du type nom->valeur_html utilisé pour personnaliser le rapport HTML.

// Disponible seulement à partir de php 5.2
//$champs_a_enregistrer = array_fill_keys($db_champs_a_enregistrer, 1);
$hash_champs_a_enregistrer = array();
if(is_array($db_champs_a_enregistrer))
	foreach($db_champs_a_enregistrer as $key)
		$hash_champs_a_enregistrer[$key] = 1;


/*     _______________________________________________________
 * ___/ Vérification anti-spam avec recaptcha.net (en option) \__________
 */
if($recaptcha_privatekey) {
	if(function_exists('recaptcha_check_answer')) {
		$recaptcha_resp = recaptcha_check_answer ($recaptcha_privatekey,
										$_SERVER["REMOTE_ADDR"],
										$_POST["recaptcha_challenge_field"],
										$_POST["recaptcha_response_field"]);

		if (!$recaptcha_resp->is_valid) {
		  // Le simple fait d'alimenter la variable $erreur bloque l'envoi du mail
		  // et provoque l'affichage de la page d'erreur.
		  $erreur .= "La réponse au test reCAPTCHA n'est pas correcte. " .
			   "(message reCAPTCHA : " . $recaptcha_resp->error . ")\n";
		}
	}
	else
		$erreur .= "Il faut copier dans le même répertoire le fichier recaptchalib.php ".
			"(<a href=\"http://code.google.com/p/recaptcha/downloads/list?q=label:phplib-Latest\">télécharger</a>).\n";
}


/*
 * Vérification de la présence des champs obligatoires.
 * On tient compte de la présence d'étoiles au début
 * des noms de champs, pour la vérification en JS.
 * La variable "champ" est réservée au tableau associatif pour la customisation du rapport.
 */
if(is_array($champs_obligatoires))
	foreach($champs_obligatoires as $nom_champ) {
		$valeur = $_POST[$nom_champ];
		if(is_array($valeur)) $valeur = implode(", ", $valeur);	// Regroupe différents sujets s'il y en a plusieurs
		if(empty($valeur))
			$erreur .= "Le champ $nom_champ est obligatoire.\n";
	}
if($erreur) $erreur .= "\n";


/*
 * Récupération et préparation des données du formulaire.
 */
foreach($_POST as $key=>$value) {
	$lkey = strtolower($key);

	// Valeurs particulières à exclure
	if($key === 'MAX_FILE_SIZE')
		continue;

	if(isset($hash_champs_a_enregistrer[$key]))
		$db_enregistrement[$key] = apostrophes($value);

	$ligne_a_envoyer = '';
	if($lkey === 'email') {
		// Adresse de l'expéditeur.
		if(AdresseValide(trim($value))) {
			$from = trim($value);
			$ligne_a_envoyer = $key.$separateur.$from . "\n";
			$champ[$key] = $from;
		} else if (!in_array('email', $champs_obligatoires) && !$value) {
			// Si l'adresse est vide et facultative, ça passe.
			$champ[$key] = $EMPTY_FIELD;
		} else
			$erreur .= "Votre adresse email est invalide.\n";
	}
	elseif($lkey === 'to') {
		// Ajout d'éventuels destinataires sélectionnés par l'utilisateur.
		// Les checkboxes envoient une liste de valeurs, les radiobuttons et les select
		// envoient une valeur unique ; on crée une liste dans tous les cas.
		$list = is_array($value) ? $value : array(0 => $value);
		foreach($list as $nom) {
			$dest = $destinataires_au_choix[$nom];
			if($dest) {
				if($to) $to .= ', ';
				$to .= $dest;
				// Évidemment le destinataire n'est pas communiqué dans le rapport.
			} else
				$erreur .= "Il n'y a aucun destinataire correspondant à ".htmlentities($nom).".\n";
		}
	}
	elseif(($lkey === 'sujet') || ($lkey === 'subject')) {
		// Problème (petit) : si le sujet est un champ multiple et qu'il est vide, on ne passe pas par ici donc $ligne_a_envoyer n'est pas défini.
		if(is_array($value)) $value = implode(", ", $value);	// Regroupe différents sujets s'il y en a plusieurs
		if(!empty($value)) {
			// Le sujet est limitée à 100 caractères pour éviter les buffer oveflows.
			$sujet = filtre_securite(substr($value, 0, 100));
			$ligne_a_envoyer = $key.$separateur.apostrophes(preg_replace("/\\r?\\n/", "\n\t", $value)) . "\n";
			$champ[$key] = $sujet = html($sujet);
		} else {
			// Le sujet est vide
			$ligne_a_envoyer = $key.$separateur.$EMPTY_FIELD."\n";
			$champ[$key] = $EMPTY_FIELD;
		}
	}
	elseif($lkey === 'email2') {
		if($value !== $_POST['email'])		// Si l'email est vide, $from contient une adresse par défaut.
			$erreur .= "Il y a une faute de frappe entre les deux adresses email.\n";
	}
	elseif(($lkey === 'recaptcha_challenge_field') || ($lkey === 'recaptcha_response_field')) {
		// On ignore ces deux champs qui sont réservés à l'utilistation du service recaptcha.net
		if(!isset($recaptcha_privatekey) || !$recaptcha_privatekey)
			$erreur .= "Il faut entrer la clé privée de recaptcha dans le fichier contact.config.php " .
				"pour que la vérification puisse se faire.\n";
	}
	else {
		// N'importe quel autre élément du formulaire :
		if(is_array($value)) $value = implode("\n", $value);
		if(empty($value)) {
			$ligne_a_envoyer = $key.$separateur.$EMPTY_FIELD."\n";		// Thunderbird ne va pas à la ligne quand une ligne se termine par = (puis espace). Voir aussi le sujet
			$champ[$key] = $EMPTY_FIELD;
		} else {
			$ligne_a_envoyer = $key.$separateur.apostrophes(preg_replace("/\\r?\\n/", "\n\t", $value)) . "\n";
			$champ[$key] = html($value);
		}
	}

	if(!empty($value) || $envoyer_aussi_les_champs_vides)
		$message .= $ligne_a_envoyer;
}

/*     _________________________________
 * ___/ Préparation des variables HTTP  \_____________________________________
 */
$message_variables_http = '';
if(is_array($variables_http) && !empty($variables_http)) {
	$message_variables_http = "$HORIZONTAL_RULE\n";
	foreach($variables_http as $nom) {
		$message_variables_http .= "$nom$separateur$_SERVER[$nom]\n";
		if(isset($hash_champs_a_enregistrer[$nom]))
			$db_enregistrement[$nom] = $_SERVER[$nom];
	}
}


/*     _________________________________
 * ___/ Création du message             \_____________________________________
 */
// On teste s'il y a un message à envoyer.
if(!empty($message)) {
	$message = str_replace("\\\\", "\\", $message);
	$message_html = htmlentities($message);
	$message_html = str_replace("\n", "<br />\n", $message_html);
	if($mail_en_html) {
		// On reconstruit le message d'après la présentation de contactmerci.php
		// Simule et capture la sortie de contactmerci.php
		ob_start();
		include($page_ok);
		$output = ob_get_contents();
		ob_end_clean();

		// Isole les déclarations de style. Les fichiers css externes sont ignorés.
		$style = '';
		if(preg_match("/<style.*?<\\/style>/si", $output, $matches));
			$style = $matches[0];

		// Cherche une div avec class="mail". Pas très rigoureux : si class="mail"
		// est une partie de la valeur d'un attribut ça passera quand-même.
		$message = preg_replace("/.*?<div.+?class=\"mail\".*?>/si", '', $output);

		// Supprime les lignes vides au début
		$message = preg_replace("/^\\s*[\\r\\n]+/", '', $message);

		// Cherche la fin de la <div class="mail"> : on cherche le premier </div>
		// qui ne ferme pas une autre <div>
		$message = preg_replace("/^((.*?<div.*?<\\/div>)*.*?)<\\/div>.*/si", "$1", $message);

		// Supprime les lignes vides à la fin
		$message = preg_replace("/\\s*[\\r\\n]+$/", '', $message);

		// Enrobage
		$message = "<html><head>\n$style\n</head>\n<body>\n$message</body>\n</html>\n";
	}

	// Compléter avec les données http
	// Elles ne sont pas ajoutées à la version visiteur.
	$message .= $message_variables_http;
}
else
	$erreur .= "Pas de données à envoyer\n";


/*     _________________________________
 * ___/ Chiffrement éventuel du message \_____________________________________
 */
$mail_text = $message;		// version chiffrée du message : ce qu'on envoie
$cle_aes = '';
if($cle_chiffrement) {
	if (function_exists('mcrypt_module_open') && defined("MCRYPT_RIJNDAEL_128")) {
		if(($cle_chiffrement[0] == '.') || ($cle_chiffrement[0] == '/'))
			$cle_aes = @file_get_contents($cle_chiffrement);
		else
			$cle_aes = $cle_chiffrement;
		if(($cle_aes !== false) && (strlen($cle_aes) == 16)) {
			// Chiffrement en Rijndael 128 bits, en mode CBC
			$td = mcrypt_module_open('rijndael-128', '', 'cbc', '');

			// On génère un Vecteur d'Initialisation.
			$size = mcrypt_get_iv_size(MCRYPT_RIJNDAEL_128, MCRYPT_MODE_CBC);
			srand();
			$iv   = mcrypt_create_iv($size, MCRYPT_RAND);	// seule la méthode rand est compatible unix ET windows.

			// Chiffrement du message
			mcrypt_generic_init($td, $cle_aes, $iv);
			$mail_text = bin2hex(mcrypt_generic($td, $message));

			// Libère le gestionnaire de chiffrement
			mcrypt_generic_deinit($td);

			// Chiffrement de l'IV en Rijndael 128 bits, en mode ECB. Il fait 128 bits, soit 16 octets, donc 32 caractères hexa.
			// Message = IV chiffré en ECB + texte chiffré en CBC avec cet IV.
			$td = mcrypt_module_open('rijndael-128', '', 'ecb', '');
			mcrypt_generic_init($td, $cle_aes, '0123456789012345');		// iv inutilisé
			$mail_text = bin2hex(mcrypt_generic($td, $iv)) . $mail_text;
			mcrypt_generic_deinit($td);

			// Découpe le message en
			$mail_text = "---------- texte chiffré ----------\n" .
				preg_replace("/.{64}/", "$0\n", $mail_text) .
				"\n------- fin du texte chiffré ------\n\n" .
				"Pour décoder ce message, il suffit d'utiliser (hors-ligne) la page http://aspirine.org/aesdecode.html\n";
		}
		else
			$mail_text = "Impossible de chiffrer le mail, la clé de chiffrement " .
				(($cle_aes === false) ? "est introuvable" : "fait ".strlen($cle_aes)." caractères au lieu de 16") . "\n$mail_text";

	}
	else
		$mail_text = "Impossible de chiffrer le mail, la librairie mcrypt (2.4 minimum) n'est pas disponible.\n" . $mail_text;
}


/*     _____________________________
 * ___/ Vérification de mise à jour \_________________________________________________
 */
if($verifier_mises_a_jour) {
	$version_info = @file_get_contents($VERSION_INFO_PATH);
	if($version_info && preg_match('/<date>([^>]+)<\\/date>/', $version_info, $matches)) {
		$new_date = $matches[1];
		if($new_date > $VERSION_DATE) {
			$warning = "\nVotre version de contact.php date du $VERSION_DATE.\n" .
				"Une nouvelle version ($new_date) est disponible.\n" .
				"Vous pouvez effectuer la mise à jour à partir de vote interface web " .
				"http://$_SERVER[SERVER_NAME]".str_replace('contact.php', 'contact_install.php', $SERVER['REQUEST_URI'])."\n" .
				"ou sur http://aspirine.org/contact/\n";
			if($mail_en_html) {
				$warning = str_replace("\n", "<br />\n", $warning);
				$mail_text = str_replace("</body>", "$warning</body>", $mail_text);
			} else
				$mail_text .= $warning;
		}
	}
}


/*     _____________________
 * ___/ Envoi des résultats \_________________________________________________
 */
if($to)
{
	// Option : enregistrement dans la base de données
	if (!$erreur && $db_login && $db_password && $db_nom_de_la_table && count($db_champs_a_enregistrer))
		$erreur .= enregistre_bdd();

	// On ajoute un en-tête du type "Envoyé le lundi 10 février 2007 à 15h03 par joe@saloon.fr"
	setlocale (LC_TIME, 'fr_FR');
	$entete = "Envoyé le ".strftime("%A %d %B %Y à %Hh%M")." par $from\n$HORIZONTAL_RULE\n";
	$message      = $entete . $message;
	$mail_text    = $entete . $mail_text;
	$message_html = str_replace("\n", "<br />\n", $entete) . $message_html;
	$message_html = preg_replace("/\t+/", "<span style=\"white-space:pre\">$0</span>", $message_html);
	$headers = "From: $from\r\nReturn-Path: $from\r\n";

	// On cherche les fichiers attachés
	// Voir http://fr3.php.net/features.file-upload et ini_get() / ini_set()
	$attachments = array();
	if(!$erreur) {
		foreach($_FILES as $form_name => $desc) {				// pointeur sur les données relatives à l'élément de form.
			$tmp_name = $desc['tmp_name'];						// nom du fichier temporaire sur le serveur
			if($tmp_name == "none")								// ça c'est une erreur de transmission du fichier.
				$erreur = "Erreur de transmission du fichier.\n";
			elseif($tmp_name && is_uploaded_file($tmp_name)) {	// y a-t-il un fichier uploadé ?
				array_push($attachments, attachFile($desc['type'], $desc['name'], file_get_contents($tmp_name)));
				$file_info = "$form_name = $desc[name]";
				$mail_text .= $file_info . "\n";
				$message_html .= htmlentities($file_info) . "<br />\n";
			}
		}
	}

	// choix texte brut ou html
	if($mail_en_html)
		$contentType = "Content-type: text/html; charset=ISO-8859-1; format=flowed\n" .
					"Content-Transfer-Encoding: 8bit\n";
	else
		$contentType = "Content-type: text/plain; charset=ISO-8859-1; format=flowed\n" .
					"Content-Transfer-Encoding: 8bit\n";

	// Préparation du corps du message avec les éventuels attachements.
	if(!$erreur && (count($attachments) > 0)) {
		$boundary = uniqid("");
		$headers .= "Content-type: Multipart/Mixed;\n\tboundary=$boundary\n";
		$mail_text = "--$boundary\n" .
					$contentType .
					"\n$mail_text\n" .
					"\n--$boundary\n" . implode("\n--$boundary\n", $attachments) . "--$boundary--\n";
	} else
		$headers .= $contentType;


	// Si on a une adresse de destinataire, on envoie un mail.
	$sujet_Quoted_Printable = QPencode(apostrophes($sujet), true);
	if(!$erreur &&
		!mail($to, $sujet_Quoted_Printable, $mail_text, $headers))
		$erreur = 'Problème technique lors de l\'envoi du mail. Pourtant il n\'y avait pas de souci dans le formulaire.';

	// On utilise include() plutôt que readfile() sinon on ne peut pas
	// mettre un fichier php.
	if($erreur) {
		$erreur = str_replace("\n", "<br />\n", $erreur);
		if((substr($page_erreur, -5) == '.html') || (substr($page_erreur, -4) == '.htm'))
			print ereg_replace("##+\\s*ERREUR\\s*##+", $erreur, file_get_contents($page_erreur));
		else
			include($page_erreur);
	}
	else include($page_ok);
}
else
{
	// Pas d'adresse où envoyer le mail, on passe en mode DEBUG
	// et on renvoie au navigateur pour affichage direct.
	print "<h1>contact.php</h1>\n";
	print "<h2>Mode DEBUG</h2>\n";
	print "Aucune adresse de destinataire n'est précisée dans le fichier de configuration contact.config.php.\n";
	print "<pre>Redirection en cas de succès : <a href=\"$page_ok\">$page_ok</a>\n";
	print "Redirection en cas d'erreur : <a href=\"$page_erreur\">$page_erreur</a>\n\n";
	if($erreur)
		print "<span style=\"color:red; font-weight:bold\">ERREUR : $erreur</span>\n\n";
	print "</pre>\nVoici le mail qui pourrait être envoyé (s'il n'y a pas d'erreur) :\n<pre>";
	print "De : $from\nSujet : $sujet.\n\n".htmlentities($message)."</pre>";
}
?>


Le tout avec un Chmod en 755.
Désolé si c'est long... :whistling:

Ce message a été modifié par Haldan - 17 mai 2013 - 14:23 .

Infographicus néanderthalis, massue connectée toujours à la main
Grapheo
0

#2 L'utilisateur est hors-ligne   Haldan 

  • Logoteur de Platine
  • Voir la galerie
  • Groupe : Membre
  • Messages : 1 247
  • Inscrit(e) : 11-mars 05

Posté 17 mai 2013 - 15:48

Opus, je suis un âne...
J'aurais dû mieux vérifier mon code avant de poster
C'est la déclaration enctype qui était pas bonne.
Plus c'est simple et plus on cherche !
On peux fermer....
Merci

Ce message a été modifié par Haldan - 17 mai 2013 - 15:50 .

Infographicus néanderthalis, massue connectée toujours à la main
Grapheo
0

Partager ce sujet :


Page 1 sur 1
  • Vous ne pouvez pas commencer un sujet
  • Vous ne pouvez pas répondre à ce sujet

1 utilisateur(s) en train de lire ce sujet
0 membre(s), 1 invité(s), 0 utilisateur(s) anonyme(s)



Enter your sign in name and password


Sign in options
  Or sign in with these services