Pages :
Bonjour,
c'est la première fois que je poste sur un forum, j'espère avoir compris le principe...

Mon problème: avec ce code php que j'utilise mes envois de mails, je n'arrive pas à insérer dans le corps du message l'id du destinataire qui se trouve dans array_keys($_POST['destinataires']) pour pouvoir créer un lien de désabonnement.


<?php
function envoi_mail($nom_from, $mail_from, $to, $subject, $data = null,  $template_html = null, $template_txt = null, $pj = array()) {
	$boundary_message	=	md5('message'.uniqid(rand()));
	$boundary_pieces	=	md5('pieces'.uniqid(rand()));
	$tab_injections	=	array(
		'/(\n+)/i',
		'/(\r+)/i',
		'/(\t+)/i',
		'/(%0A+)/i',
		'/(%0D+)/i',
		'/(%08+)/i',
		'/(%09+)/i'
	);
	foreach(array('nom_from', 'mail_from', 'to', 'subject') as $value)
	$$value	=	preg_replace($tab_injections, '', $$value);
	$nom_from	=	'=?UTF-8?Q?'.str_replace(array('%20', '%'), array('_', '='), rawurlencode($nom_from)).'?=';
	$subject	=	'=?UTF-8?Q?'.str_replace(array('%20', '%'), array('_', '='), rawurlencode($subject)).'?=';
	$headers	=	"From: $nom_from <$mail_from>\r\n";
	$headers	.=	"MIME-Version: 1.0\r\n";
	$headers	.=	"Content-Type: multipart/mixed; boundary=$boundary_pieces\r\n";
	$body	=	"--$boundary_pieces\r\n";
	$body	.=	"Content-Type: multipart/alternative; boundary=$boundary_message\r\n";
	$texte	=	null;
	if(is_string($data) && strlen($data) == strlen(strip_tags($data)))
		$texte	=	$data;
	elseif(is_array($data) && is_file($template_txt)) {
		$texte	=	file_get_contents($template_txt);
		foreach($data as $key => $value)
			$texte	=	str_replace('#'.strtoupper($key).'#', $value, $texte);
	}
	if($texte) {
		$body	.=	"\r\n";
		$body	.=	"--$boundary_message\n";
		$body	.=	"Content-Type: text/plain; charset=UTF-8\r\n";
		$body	.=	"Content-Transfer-Encoding: 8bit\r\n";
		$body	.=	"\r\n";
		$body	.=	$texte;
		$body	.=	"\r\n";
	}
	$html	=	null;
	if(is_string($data) && strlen($data) != strlen(strip_tags($data)))
		$html	=	$data;
	elseif(is_array($data) && is_file($template_html)) {
		$html	=	file_get_contents($template_html);
		foreach($data as $key => $value)
			$html	=	str_replace('#'.strtoupper($key).'#', nl2br($value), $html);
	}
	if($html) {
		$body	.=	"\r\n";
		$body	.=	"--$boundary_message\n";
		$body	.=	"Content-Type: text/html; charset=UTF-8\r\n";
		$body	.=	"Content-Transfer-Encoding: 8bit\r\n";
		$body	.=	"\r\n";
		$body	.=	$html;
		$body	.=	"\r\n";
	}

	$body	.=	"--$boundary_message--\r\n";
	foreach($pj as $file) {
		if(is_file($file['path'])) {
			$body	.=	"--$boundary_pieces\r\n";
			$body	.=	"Content-Type: application; name=\"".$file['name']."\"\r\n";
			$body	.=	"Content-Disposition: attachment; filename=\"".$file['name']."\"\r\n";
			$body	.=	"Content-Transfer-Encoding: base64\r\n";
			$body	.=	"\r\n";
			$body	.=	chunk_split(base64_encode(file_get_contents($file['path'])));
		}
	}

	$body	.=	"--$boundary_pieces--\r\n";
	if(!is_array($to))
	$to	=	array($to);
	foreach($to as $dest)
	$success =	mail($dest, $subject, $body, $headers);
	if (!$success){
		header("Location:mapage.php?erreur=1");exit;
	}
	else{
		header("Location:mapage.php?message=1");exit;	
	}
}

if (isset($_POST['submit'])){
	$nom_from = 'test@test.com';
	$mail_from = 'test@test.com';
	$destinataires = $_POST['destinataires']; // emails destinataires
	$destinatairesId = array_keys($_POST['destinataires']);	//id des destinataires
	$to = $destinataires;
	$subject = $_POST['objet'];
	
	$data = ' LE CORPS DU MESSAGE '; // Dans le corps du message je souhaite afficher l'id de chaque destinataire pour créer un lien de désabonnement 
	$name = basename($_FILES['avatar']['name']);
	$path = $_FILES['avatar']['tmp_name'];
	$pj = 	array(
				array(
				name => ''.$name.'',
				path => ''.$path.''
				)
			);
	envoi_mail($nom_from, $mail_from, $to, $subject, $data, $template_html, $template_txt, $pj);
}

?>
Merci de la réponse rapide loicbcn mais non ça ne marche pas, $destinatairesId est un array. je viens de tester et ça m'affiche: Array
ThierryTC a écrit :
Merci de la réponse rapide loicbcn mais non ça ne marche pas, $destinatairesId est un array. je viens de tester et ça m'affiche: Array

... ce qui est tout à fait normal!!
quel est le contenu ce cet array?
il provient du formulaire, voir plus bas :
$key pour l'id et $destinataires pour les emails



foreach($_POST['destinataires'] as $key=>$destinataires){	
     echo '<input name="destinataires['.$key.']" value="'.$destinataires.'" />';
}		
Effectivement, j'avais simplement réagi au fait que concaténer un array à un texte produit naturellement la chaîne de caractères "Array".
En fait, je suppose que tu veux faire quelque chose quand on clique sur le lien de désinscription, sans doute appeler un programme spécifique en lui passant en paramètre l'adresse à "désinscrire".
Pour chaque destinataire, il faut donc créer une ligne spéciale, du genre

$unsubscribe = "<p>Si vous voulez vous désinscrire de cette liste, cliquez sur <a href=\"http://monsite/unsubscribe?address=$dest\">ce lien</a>.</p>";
...........
envoi_mail($nom_from, $mail_from, $to, $subject, $data . $unscribe, $template_html, $template_txt, $pj);

Modifié par PapyJP (18 Oct 2017 - 10:30)
effectivement c'est ce que veux faire, mais je n'y arrivais pas avec l'adresse email alors j'ai essayé sur l'id.
avec le code plus bas j'obtiens une seule et même adresse mail pour chaque destinataire , comme sur tout ce que j'avais déjà testé.


foreach($to as $dest)
	$unsubscribe = "<p>Si vous voulez vous désinscrire de cette liste, cliquez sur <a href=\"http://monsite/unsubscribe?address=".$dest."\">ce lien</a>.</p>";
du coup regarde bien les paramètres d'entrées que tu reçois dans ta fonction, car peut être cela vient d'avant..
c'est ce que je pense aussi mais j'ai trouvé ce code tout prêt et je suis totalement incapable de modifier cette fonction
ThierryTC a écrit :
j'obtiens ça:
array(2) { [9977]=> string(36) "mail1@xxx.com" [38067]=>string(21) "mail2@yyy.com" }

D'où ma question initiale: quel est le contenu ce cet array?

A la lecture du code, on constate plusieurs choses:
La fonction envoi_mail tourne sur toutes les adresses, puis, selon le résultat du dernier envoi appelle une page "mapage.php" avec le résultat de ce dernier envoi.
Cela sent la bidouillage à partir d'une fonction qui devait prendre comme paramètre $to l'adresse d'un seul destinataire.

La modification de cette fonction est plus complexe que ce qu'on pouvait penser au premier abord. Je ne pense pas que nous puissions sérieusement t'aider dans cette tâche, surtout que tu te déclares " totalement incapable de modifier cette fonction".
Pour ce faire, il faudrait en savoir plus sur le contexte dans lequel cette fonction est appelée.
"mapage.php" est la page depuis laquelle les adresses mail ont été sélectionnées (multiple checkbox),
de là on arrive sur un formulaire, les adresses mails sont pré-renseignées il n'y a plus qu'à renseigner l'objet et le message, envoyer le message et par le header retour à mapage.php.

dans le formulaire on a:

foreach($_POST['destinataires'] as $key=>$destinataires){	
     echo '<input type="hidden" name="destinataires['.$key.']" value="'.$destinataires.'" />';
}


la fonction marche sans problème depuis quelques années, et les mails sont bien envoyés, mais sans lien de désabonnement l'ip du serveur a été blacklistée un peu partout, d'ou mon post...
Si l'IP est blacklisté, il ne deviendra pas acceptable parce que tu auras mis un lien de désinscription.
Beaucoup de produits de messagerie considèrent comme suspect tout message qui ne vient pas d'un "acteur bien connu" sur le marché.
J'ai un système de messagerie de ce genre sur un de mes sites, il y a une liste d'une vingtaine de noms, il y a deux personnes qui ne reçoivent pas les messages parce que l'émetteur a une adresse qui ne leur convient pas.
Mais pour en revenir à l'ajout d'un lien de désinscription, je ne vois pas comment faire sans modifier assez sérieusement le code de la fonction.
en fait j'ai déjà fait le nécessaire pour être retiré de ces blacklist et je n'ai pas envie de recommencer l'opération alors j'ai provisoirement désactivé la fonction emailing.
je ne comprend pas, normalement je devrais résoudre le problème dans le submit sans toucher à la fonction

si je fais ça j'obtiens bien mes deux emails test1@xxx.com et test2@xxx.com

foreach($to as $dest)
echo $destina;
die();


mais si je fais ça je n'ai plus que test2@xxx.com

	foreach($to as $dest){
		foreach($dest as $destina){
			echo $destina;
			die();
		}
	}
ok,
mais je m'exprime mal, je tentais de voir si sans toucher à la fonction on pouvait bien traiter les infos depuis le submit. et ça semble être le cas le cas.
j'ai donc mis le code ci-dessous dans la partie if (isset($_POST['emailsubmit']))
mais je n'obtiens que la même 2eme adresse email dans les 2 mails envoyés?


	foreach($to as $dest){
		$unsuscribe = "<p>désinscription = ".$dest."</p>";
	}
ThierryTC a écrit :
ok,
mais je m'exprime mal, je tentais de voir si sans toucher à la fonction on pouvait bien traiter les infos depuis le submit. et ça semble être le cas le cas.
j'ai donc mis le code ci-dessous dans la partie if (isset($_POST['emailsubmit']))
mais je n'obtiens que la même 2eme adresse email dans les 2 mails envoyés?


	foreach($to as $dest){
		$unsuscribe = "<p>désinscription = ".$dest."</p>";
	}

Si tu fais cela, tu écrases la valeur de $unsuscribe à chaque passage de la boucle, donc la valeur de $unsuscribe à la sortie de la boucle est la dernière valeur, la deuxuème en l'occurrence puisque tu n'y es passé que 2 fois.
Si je peux me permettre un conseil, plutôt de de faire des essais et erreurs jusqu'à tomber sur le bon résultat, tu devrais commencer par analyser la façon dont est faite la fonction envoi_mail que tu as apparemment copiée depuis un programme extérieur. Dans le cas précis de cette fonction, ce n'est pas très difficile (ce qui n'est pas toujours le cas!)
Modifié par PapyJP (19 Oct 2017 - 10:42)
Pages :