Problème d'envoi de mail en PHP

Petit nouveau ! | 2 Messages

04 avr. 2014, 17:06

Bonjour à tous,

Je suis nouveau sur ce forum et vous remercie pour son existence.

J'ai récupéré et adapté le code ci-dessous pour envoyer systématiquement un mail dès que je reçois un paiement validé par paypal. Le soucis est que ça ne marche pas systématiquement. Parfois je reçois bien le mail et parfois rien du tout, même si l'instruction "mail" me retourne un statut "true". Ce qui est méga grave, c'est que si la réservation est payée (donc validée), le destinataire n'est pas prévenu ... Donc l'utilisateur aura payé, mais n'aura pas le service !!!!

Je ne sais si ça vient de mon code PHP ou si ça vient de free, car mon site est hébergé chez free :cry:

Sur ce coup là, je commence à m'arracher un peu les cheveux et à perdre vraiment confiance dans cette solution 8-|

:priere:
                       /////////////////////////////////////////////////////////////////////////////
			// Envoi un mail au client pour le prévenir de l'annulation de réservation //
			/////////////////////////////////////////////////////////////////////////////
			if (!preg_match("#^[a-z0-9._-]+@(hotmail|live|msn).[a-z]{2,4}$#", $mail)) // On filtre les serveurs qui rencontrent des bogues.
			{
				$passage_ligne = "\r\n";
			}
			else
			{
				$passage_ligne = "\n";
			}
			//=====Déclaration des messages au format texte et au format HTML.
			$message_txt = "Bonjour ".$prenom." ".$nom.", nous vous confirmons votre réservation numéro ".$idresa." pour la période du ".$date_deb." au ".$date_fin.".";
			$message_html = "<html><head></head><body>Bonjour ".$prenom." ".$nom.",<br>Nous vous confirmons votre r&eacute;servation num&eacute;ro ".$idresa." pour la p&eacute;riode du ".$date_deb." au ".$date_fin.".</body></html>";
			//==========
 
			//=====Création de la boundary
			$boundary = "-----=".md5(rand());
			//==========
	
			//=====Définition du sujet.
			$sujet = "Confirmation de votre reservation ".$idresa." !";
			//=========
		
			//=====Création du header de l'e-mail.
			$header = "From: \"Cyril\"<[email protected]>".$passage_ligne;
			$header.= "Reply-to: \"Cyril\" <[email protected]>".$passage_ligne;
			$header.= "Cc: [email protected]"."\n";
			$header.= "MIME-Version: 1.0".$passage_ligne;
			$header.= "Content-Type: multipart/alternative;".$passage_ligne." boundary=\"$boundary\"".$passage_ligne;
			//==========
 
			//=====Création du message.
			$message = $passage_ligne."--".$boundary.$passage_ligne;
			//=====Ajout du message au format texte.
			$message.= "Content-Type: text/plain; charset=\"ISO-8859-1\"".$passage_ligne;
			$message.= "Content-Transfer-Encoding: 8bit".$passage_ligne;
			$message.= $passage_ligne.$message_txt.$passage_ligne;
			//==========
			$message.= $passage_ligne."--".$boundary.$passage_ligne;
			//=====Ajout du message au format HTML
			$message.= "Content-Type: text/html; charset=\"ISO-8859-1\"".$passage_ligne;
			$message.= "Content-Transfer-Encoding: 8bit".$passage_ligne;
			$message.= $passage_ligne.$message_html.$passage_ligne;
			//==========
			$message.= $passage_ligne."--".$boundary."--".$passage_ligne;
			$message.= $passage_ligne."--".$boundary."--".$passage_ligne;
			//==========
 
			//=====Envoi de l'e-mail.
			if(mail($mail,$sujet,$message,$header))
			{
				echo 'Votre message a bien &eacute;t&eacute; envoy&eacute; au client';
			}
			else // Non envoyé
			{
				echo "Votre message n'a pas pu etre envoy&eacute; au client";
			};
Modifié en dernier par moogli le 08 avr. 2014, 18:34, modifié 1 fois.
Raison : bbcode php

Mammouth du PHP | 2278 Messages

04 avr. 2014, 17:56

La doc (http://us2.php.net/manual/fr/function.mail.php) dir bien que true signifie message envoyé, pas forcément message reçu.
Je suppose que ça vient de la façon dont ils gèrent les mails: par exemple avec sfr, c'est la croix et la bannière car a priori il ne transmettent que les messages qui passent par leur interface, mais si on trifouille la configuration de la box, ça devrait aller mieux.... mais non, alors....etc.
Je n'ai réussi à rien.
Alors bon courage.
Vanitas vanitatum et omnia vanitas
Mes derniers livres :
Sauvez les Mots chez BoD,
Tous les chemins mènent à ROM chez BoD

Petit nouveau ! | 2 Messages

07 avr. 2014, 19:16

Il n'y a pas d'autre avis sur le sujet ?

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 8758 Messages

08 avr. 2014, 18:42

la réponse de sirakawa explique pourquoi tu as, en retour de la fonction mail(), true.

Php n'envoie pas l'email il fournit la chose à un demon système (souvent sendmail cela peux être autre) qui lui "envoie" l'email.
ce "true" indique simplement que php a bien fait son taf.

Pour ce qui est de la non réception il est fréquent que les messages arrive dans les filtre à spam, c'est a vérifier sur ta boite email.

ensuite free n'est pas véritablement un hébergeur il propose un service mais c'est tous ;)

tu peux essayer la librairie phpmailer pour l'envoi d'email (il a l'avantage d'ajouter les principaux entête afin d'éviter de finir trop facilement dans les spams) il te faudra juste des information de connexion à un serveur stmp (comme celui de gmail si tu as un compte).

dernières choses :
- l'envoie d'email en nombre peux parfois être considéré comme spam (regarde la politique de free sur ce point).
- l'envoie d'e-mail n'est pas une chose certaine. Tu ne pourras pas être sur que le destinataire reçois bien la chose (c'est inhérent au protocole), il est impératif de prévoir l'affiche sur l'espace client de la transaction ainsi que dans un back end pour que tu sache que la comme est là et payée.

@+
Il en faut peu pour être heureux ......