Contenu | Rechercher | Menus

Annonce

Si vous rencontrez des soucis à rester connecté sur le forum (ou si vous avez perdu votre mot de passe) déconnectez-vous et reconnectez-vous depuis cette page, en cochant la case "Me connecter automatiquement lors de mes prochaines visites".
Test de l'ISO d'Ubuntu francophone : nous avons besoin de testeurs pour la version francophone d'Ubuntu 14.04. Liens et informations ici.

Attention, une faille de sécurité dans bash a récemment été rapportée, il est recommandé de mettre à jour son système (plus de détails) *** mise à jour 12/10/2014 ***

#1 Le 07/03/2013, à 23:46

Kimilie

Interprétation du fichier mail.log

Bonjour,

J'essaie d'envoyer des mails en php. Apparamment le code dit que le mail est envoyé mais il n'est pas reçu sur la boite mail.

En lisant le fichier mail.log, on s'apperçoit que dans la première ligne on a un from =<www-data> alors que mon code php renvoie bien une adresse mail indiquée dans des champs (formulaire). j'ai testé en faisant afficher à l'écran le from issus du php.

--> Donc, le from du fichier mail.log n'est pas celui envoyé par le php !!! Mais d'où peut-il bien venir ?


De plus, dans la ligne 4 ou 5 du fichier mail.log, je vois unknown user : "début de mon email"
Je ne sais pas trop à quoi cela correspond !

Mar  7 21:02:43 localhost postfix/pickup[1537]: B3CB04A1F25: uid=33 from=<www-data>
Mar  7 21:02:43 localhost postfix/cleanup[1900]: B3CB04A1F25: message-id=<20130307200243.B3CB04A1F25@localhost>
Mar  7 21:02:43 localhost postfix/qmgr[1538]: B3CB04A1F25: from=<www-data@gmail.com>, size=535, nrcpt=1 (queue active)
Mar  7 21:02:44 localhost postfix/local[1903]: B3CB04A1F25: to=<email@gmail.com>, relay=local, delay=0.44, delays=0.31/0.02/0/0.1, dsn=5.1.1, status=bounced (unknown user: "email")
Mar  7 21:02:44 localhost postfix/cleanup[1900]: 121014A1F5E: message-id=<20130307200244.121014A1F5E@localhost>
Mar  7 21:02:44 localhost postfix/qmgr[1538]: 121014A1F5E: from=<>, size=2240, nrcpt=1 (queue active)
Mar  7 21:02:44 localhost postfix/bounce[1904]: B3CB04A1F25: sender non-delivery notification: 121014A1F5E
Mar  7 21:02:44 localhost postfix/qmgr[1538]: B3CB04A1F25: removed
Mar  7 21:02:44 localhost postfix/local[1903]: 121014A1F5E: to=<www-data@gmail.com>, relay=local, delay=0.16, delays=0.09/0/0/0.07, dsn=2.0.0, status=sent (delivered to mailbox)
Mar  7 21:02:44 localhost postfix/qmgr[1538]: 121014A1F5E: removed

Merci pour vos aides !

Hors ligne

#2 Le 09/03/2013, à 13:54

JoelS

Re : Interprétation du fichier mail.log

Le module de base PHP de gestion de mail est plutôt mauvais et ne gère pas correctement l'ensemble du protocole SMTP. Du moins c'est ce que j'ai constaté.

en SMTP, il y a 2 champs FROM: le champ FROM de l'enveloppe, et celui de l'entête. Ce que tu dois afficher, c'est le FROM de l'entête. Mais c'est celui de l'enveloppe qui est utilisé pour le routage. C'est le même principe que les lettres à la poste. Il y a aussi 2 champs TO, un pour l'enveloppe et un pour l'entête.

Il faut que tu vérifies si le champ FROM de l'enveloppe est bien renseigné à l'envoi. Par défaut, s'il n'est pas défini, il prend le nom de l'utilisateur UNIX qui effectue l'envoi: ici ton appli Web est exécutée par l'ID www-data.

ensuite d'après le log, c'est bien le destinataire qui est mal renseigné: le routage est refusé car le destinataire email@gmail.com n'est pas connu (ce qui me paraît normal). Même chose: vérifier si le destinataire de l'enveloppe est bien renseigné.

Hors ligne

#3 Le 10/03/2013, à 00:26

Kimilie

Re : Interprétation du fichier mail.log

Bonjour,

Je vous remercie pour ces infos précieuses !

Concernant le destinataire "email@gmail.com", c'est moi qui ai changé pour ne pas marquer ma vrai adresse mail. Donc en fait, il est bon.
Ensuite, lorsque l'on regarde (unknown user: "email"), j'ai là aussi inscrit email car il y avait mon nom d'utilisateur (qui se trouve être la partie gauche de l'email auquel je souhaite faire des envois). Ce sont des infos que j'ai pas trop envie de voir trainer sur internet ...

joelS a écrit :

Le module de base PHP de gestion de mail est plutôt mauvais et ne gère pas correctement l'ensemble du protocole SMTP. Du moins c'est ce que j'ai constaté.

--> est-ce dû à Ubuntu ou est-ce le même problème sur windows ?

2 champs From : C'est bien ce que j'ai remarqué ! mon code php renvoie le bon email pour From mais dans le mail.log il y a www-data. --> merci pour l'info. Mais comment puis-je faire en sorte que le fichier mail.log aille chercher ou reçoive le bon From ? Il va me falloir chercher qu'est-ce qui, dans le code php, renvoie un www-data au fichier mail.log.
Ce que je ne comprends pas, c'est que dans le code php, mon "From" est la donnée $Expediteur. Comment puis-je savoir si c'est l'enveloppe ou l'en-tête ?

2 champs To : Ce sera le même problème que pour le From ...

Dans tous les cas, voici le code php :

<?php
/* Si le formulaire est envoyé alors on fait les traitements */
if (isset($_POST['envoye']))
{
	/* Récupération des valeurs des champs du formulaire */
	if (get_magic_quotes_gpc())
	{
		$civilite 		= stripslashes(trim($_POST['civilite']));
		$nom		= stripslashes(trim($_POST['nom']));
		$expediteur 	= stripslashes(trim($_POST['email']));
		$sujet 		= stripslashes(trim($_POST['sujet']));
		$message 	= stripslashes(trim($_POST['message']));
	}
	else
	{
		$civilite 		= trim($_POST['civilite']);
		$nom		= trim($_POST['nom']);
		$expediteur 	= trim($_POST['email']);
		$sujet		= trim($_POST['sujet']);
		$message 	= trim($_POST['message']);
	}
	
	/* Expression régulière permettant de vérifier si le
	* format d'une adresse e-mail est correct */
	$regex_mail = '/^[-+.\w]{1,64}@[-.\w]{1,64}\.[-.\w]{2,6}$/i';

	/* Expression régulière permettant de vérifier qu'aucun
	* en-tête n'est inséré dans nos champs */
	$regex_head = '/[\n\r]/';
	
	/* Si le formulaire n'est pas posté de notre site on renvoie
	* vers la page d'accueil */
	if($_SERVER['HTTP_REFERER'] != 'http://localhost/public/Formulaire.php')
	{
		header('Location: http://localhost/public/');
	}
	/* On vérifie que tous les champs sont remplis */
	elseif (empty($civilite)
		|| empty($nom)
		|| empty($expediteur)
		|| empty($sujet)
		|| empty($message))
	{
		$alert = 'Tous les champs doivent être renseignés';
	}
	/* On vérifie que le format de l'e-mail est correct */
	elseif (!preg_match($regex_mail, $expediteur))
	{
		$alert = 'L\'adresse '.$expediteur.' n\'est pas valide';
	}
	/* On vérifie qu'il n'y a aucun header dans les champs */
	elseif (preg_match($regex_head, $expediteur)
		|| preg_match($regex_head, $nom)
		|| preg_match($regex_head, $sujet))
	{
		$alert = 'En-têtes interdites dans les champs du formulaire';
	}
	/* Si aucun problème et aucun cookie créé, on construit le message et on envoie l'e-mail */
	elseif (!isset($_COOKIE['sent']))
	{
		/* Destinataire (adresse e-mail) */
		$to = tartenpion@gmail.com';

		/* Construction du message */
		$msg = 'Bonjour,'."\r\n\r\n";
		$msg .= 'Ce mail a été envoyé depuis monsite.com par '.$civilite.' '.$nom."\r\n\r\n";
		$msg .= 'Voici le message qui vous est adressé :'."\r\n";
		$msg .= '***************************'."\r\n";
		$msg .= $message."\r\n";
		$msg .= '***************************'."\r\n";

		/* En-têtes de l'e-mail */
		$headers = 'From: '.$nom.' <'.$expediteur.'>'."\r\n\r\n";

		/* Envoi de l'e-mail */

		if (mail($to, $sujet, $msg, $headers))
		{
			$alert = 'E-mail envoyé avec succès';
                        /* pour voir la variable */
			echo 'from : '.$expediteur;

			
			/* On créé un cookie de courte durée (ici 120 secondes) pour éviter de
			* renvoyer un mail en rafraichissant la page */
			setcookie("sent", "1", time() + 120);
			
			/* On détruit la variable $_POST */
			unset($_POST);
		}
		else
		{
			$alert = 'Erreur d\'envoi de l\'e-mail';

		}
	}
	/* Cas où le cookie est créé et que la page est rafraichie, on détruit la variable $_POST */
	else
	{
		unset($_POST);
	}
}
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
	"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html lang="fr">
<head>
	<title>Contactez moi</title>
	<meta http-equiv="content-type" content="text/html;charset=utf-8" />
</head>
<body>

<?php
if (!empty($alert))
{
	echo '<p style="color:red">'.$alert.'</p>';
}
?>

<form action="Formulaire.php" method="post">
	<p>
		<label for="civilite">Civilité :</label>
		<select id="civilite" name="civilite">
			<option
				value="mr"
				<?php
					if (!isset($_POST['civilite']) || $_POST['civilite'] == 'mr')
					{
						echo ' selected="selected"';
					}
				?>
			>
				Monsieur
			</option>
			<option
				value="mme"
				<?php
					if (isset($_POST['civilite']) && $_POST['civilite'] == 'mme')
					{
						echo ' selected="selected"';
					}
				?>
			>
				Madame
			</option>
			<option
				value="mlle"
				<?php
					if (isset($_POST['civilite']) && $_POST['civilite'] == 'mlle')
					{
						echo ' selected="selected"';
					}
				?>
			>
				Mademoiselle
			</option>
		</select>
	</p>
	<p>
		<label for="nom">Nom/Prénom :</label>
		<input type="text" id="nom" name="nom"
		value="<?php echo (isset($_POST['nom'])) ? $nom : '' ?>"
		/>
	</p>
	<p>
		<label for="email">E-mail :</label>
		<input type="text" id="email" name="email"
		value="<?php echo (isset($_POST['email'])) ? $expediteur : '' ?>"
		/>
	</p>
	<p>
		<label for="sujet">Sujet :</label>
		<input type="text" id="sujet" name="sujet"
		value="<?php echo (isset($_POST['sujet'])) ? $sujet : '' ?>"
		/>
	</p>
	<p>
		<label for="message">Message :</label>
		<textarea id="message" name="message" cols="40" rows="4">
	<?php echo (isset($_POST['message'])) ? $message : '' ?>
		</textarea>
	</p>
	<p>
		<input type="submit" name="envoye" value="Envoyer" />
	</p>
</form>
</body>
</html>

Dernière modification par Kimilie (Le 10/03/2013, à 00:27)

Hors ligne

#4 Le 10/03/2013, à 15:40

Titouan

Re : Interprétation du fichier mail.log

une histoire de headers ...

tu penses bien que postfix ne va pas te mettre tous les headers dans les logs pour chaque mail. hmm
Et en plus, les serveurs smtp ont la possibilité de modifier, reécrire par dessus un header, à chaque fois qu'un mail transite par leurs services.
Bref, Postfix rapporte dans les logs le Sender qui exécute, déclencle le id unique du mail.
Sender qui exécute = header Return Path le plus souvent
et pas du tout obligatoire, du moins correspondant aux headers From & ReplyTo

Tu as découvert l'origine du Spam ! tongue
L'exécution est sans rapport avec ce qui est affiché dans un mail !

Hors ligne

#5 Le 10/03/2013, à 22:33

Kimilie

Re : Interprétation du fichier mail.log

Bonsoir !

Merci Titouan pour ce cours smile

Je ne suis pas un âne pourtant, mais là depuis que j'ai abordé le php (un mois), je suis la tête sous l'eau yikes
Heureusement qu'avec mes bulles j'arrive à vous faire parvenir quelques questions en surface !!!
Le html c'est le bain chauffé des bébés à côté du php !

J'ai l'impression que plus je comprends, plus mon problème est difficile.

SI je comprends bien, toutes les variables que j'ai déterminé dans le code PHP ne sont pas reçue par le log comme j'aimerai qu'elles soient reçuent !?!

Je vois qu'il y a un lien entre mon code PHP et le log mais tout est dissimulé pour ne pas se faire spammer. Donc comment puis-je savoir quelle est la variable, la commande ou je ne sais quoi d'autre qui me fait des problèmes ?

Je viens de trouver ceci sur internet :
postfix

Cela à l'air intéressant mais il a me falloir plusieurs jours pour tout lire .... sniff  sad


J'ai remarqué une chose bizzare :
Apparamment, le chemin de mon fichier log doit être inscrit dans "/etc/syslog.conf", or je n'ai pas ce fichier syslog.conf dans le dossier var


Merci à tous !!!

Dernière modification par Kimilie (Le 10/03/2013, à 22:51)

Hors ligne

#6 Le 11/03/2013, à 11:19

JoelS

Re : Interprétation du fichier mail.log

Tu mélanges un peu plusieurs choses.

d'abord PHP, c'est de la m.... smile voila, ça c'est fait. cool

ensuite, PHP c'est un langage de scripting conçu pour le Web.

Postfix, c'est un MTA (Mail Transfert Agent) conçu pour transférer des messages SMTP d'un point à un autre de manière fiable et sécurisée. ca n'a rien à voir avec le Web, et les logs de Postfix sont des logs de messagerie SMTP. Si tu veux voir apparaître des choses spécifiques dans les logs Postfix, alors tu doit te conformer à ce qu'attend Postfix, voir le paramétrer dans la mesure du possible.

Ton script PHP génère un message SMTP. Avec ce que tu as codé, tu t'attends à un certain contenu du message, alors le module mail de PHP ne fait pas tout à fait ce que tu attends, et Postfix se conforme aux nornes. D'ou le résultat qui t'étonnes.

N'étant pas un spécialiste de PHP, dieu soit loué, je ne peux que te conseiller une chose: cherche un autre module de gestion de message SMTP en PHP qui lui te permet de complètement manipuler les messages suivants les normes liées à SMTP (et il y en a plusieurs).

Pour le log, c'est une autre chanson: une application bien faite (comme Postfix) va écrire les logs la ou on lui dit de les écrire. En général, les logs sont écrits:

  • soit directement pas l'application dans un fichier de log, souvent dans /var/log, et donc c'est dans le fichier de conf de l'application,

  • soit indirectement via un loggeur comme syslog et/ou rsyslog, et donc le fait d'utiliser le loggeur est dans l'application, et l'endroit ou le loggeur mettra les logs est dans la configuration du loggeur,

  • soit un mix de tout ça,

Hors ligne

#7 Le 11/03/2013, à 12:14

Kimilie

Re : Interprétation du fichier mail.log

Bonjour,

Ah ! Je pensais que le PHP était bien ! ou utile ! je le découvre !
Me conseilleriez-vous un autre langage pour créer un formulaire qui envoie un mail ?


Quand vous dites "cherche un autre module de gestion de messages smtp en PHP", vous parlez de Postfix si je comprends bien (veuillez excuser mon ignorance ...:/) ?

Est-ce que Maildrop pourrait faire l'affaire ?
Je viens de trouver ceci mais je ne comprends pas tout (agent de livraison local (8) / alias locaux ... ???) :

Postfix peut être configuré pour livrer le courrier directement à maildrop sans utiliser l'agent de livraison local(8) comme intermediaire. Ceci signifie que vous n'aurez pas les substitutions des alias locaux ou le traitement des fichiers $HOME/.forward. Vous pourrez typiquement utiliser pour les domaines hébergés avec des destinataires qui n'ont pas de répertoires individuels UNIX ($HOME).


Merci !!

Dernière modification par Kimilie (Le 11/03/2013, à 12:20)

Hors ligne

#8 Le 12/03/2013, à 14:48

Titouan

Re : Interprétation du fichier mail.log

umm, tu vas chercher midi à quatorze heures.
tu as juste à renseigner les headers  et c'est tout !

Hors ligne

#9 Le 13/03/2013, à 00:27

Kimilie

Re : Interprétation du fichier mail.log

Bonsoir,

Oui, je vais surement chercher midi à ... 15heures même smile mais je ne le fait pas exprès ! En plus jaimerais bien que lorsque je fait un code, ca marche au moins du 10 ème coup ... parcequ'après 10 essais on commence à être démotivé ... et là j'en suis au 50 ème essai ! j'ai essayé pleins de trucs ! bon mais ca foncionne mieux qu'au début quand même ... mais pas à 100%

Pour renseigner les headers, c'est dans le code php ? je suppose ....

Moi j'ai cette ligne dans mon code :

$headers = 'From: '.$nom.' <'.$expediteur.'>'."\r\n\r\n";

Merci hmm

Hors ligne

#10 Le 13/03/2013, à 19:12

Titouan

Re : Interprétation du fichier mail.log

oui, par exemple,
Je reprends l'exemple et le modifie

nano test-mail.php

// The message
$message = "bonjour\n
Envoi php via \n
A bientot";

// In case any of our lines are larger than 70 characters, we should use wordwrap()
$message = wordwrap($message, 70);

// Send

     $to      = 'destinataire@exemple.com';
     $subject = 'le sujet';
     $message = 'Bonjour !';
     $headers = 'From: hello@sfr.fr' . "\r\n" .
        'Reply-To: webmaster@domain.tld, admin@sfr.fr';
// Return-Path normal = www-data = true sender trigger postfix
     $true_sender_postfix = '-f toto@domain.tld'; 

mail($to, $subject, $message, $headers, $true_sender_postfix);

?>

_ domain.tld est ton ton domaine de messagerie.
_ toto@domain.tld est un récipient valide, habilité à relayer du courrier, grace
à relay_domains = domain.tld
ou par relay_recipient_maps
(sudo postmap -q toto@domain.tld mysql:/etc/postfix/all_recipients.cf renvoie toto@domain.tld, donc OK)
Cela veut dire aussi que toto@domain.tld peut consulter ses mails (BAL)

Finalement le plus important dans l'histoire, c'est le Return-Path (=true_sender_postfix). Ce header correspond au vrai trigger, le Sender qu'on trouve dans postfix. Dans l'exemple, c'est toto@domain.tld

Même constat en utilisant,
1/

echo "Qui est-ce ?" | mail -s 'Return-Path' destinataire@exemple.com

Return-Path hérite par défaut de ton user_unix@domain.tld

2/ en CLI php terminal, même chose, par défaut, si on ne précise rien.

     $to      = 'destinataire@exemple.com';
     $subject = 'le sujet';
     $message = 'Bonjour !';
     $headers = 'From: user@domain.tld' 

Return-Path hérite par défaut de ton user_unix@domain.tld

3/ et avec apache, c'est www-data le return-path, par défaut

Hors ligne

Haut de page ↑