scipt converti en fonction ne marche plus

radinor
Invité n'ayant pas de compte PHPfrance

30 juil. 2013, 11:23

Bonjour,
j'ai le script ci-après qui fonctionne à merveille. Il envoie un mail avec 5 pièces jointes.
quand je le transforme en fonction mailingmailo le mail est bien envoyé mais il n'y a pas de pièces jointes.
je cherche depuis plusieurs jours.
merci

script envoi de mail avec 5 pièces jointes:
<?php
/*-----------------------------------------------------------------------*/
require("ENI_mail_fonctions.inc.php");							// fonctions mail
/*-----------------------------------------------------------
PARTIE COMMUNE DU MESSAGE                 ENTETES
-----------------------------------------------------------*/
$emet="[email protected]";										// emetteur
$destinataires = "[email protected]";						// destinataires
$objet = "Bonjour !"; 											// objet

//en-têtes supplémentaires (ça veut dire quoi ?)

$entêtes  = "";													
$entêtes .= "From: \"Radinor\" <$emet>\r\n"; 					// origine du message
/*
// 		- message au format Multipart MIME
          --------------------------------*/
		  
$entêtes .= "MIME-Version: 1.0\r\n";
$entêtes .= "Content-Type: multipart/mixed; ";
$entêtes .= "boundary=\"=O=L=I=V=I=E=R=\"\r\n";
/*
//$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ message $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$
*/
$message  = "";
/*
//		- première partie du message (texte proprement dit)
          -------------------------------------------------
*/		  
/*
//				- en-tête de la partie
                --------------------
*/
$message .= "--=O=L=I=V=I=E=R=\r\n";
$message .= "Content-Type: text/plain; ";
//$message .= "Content-Type: text/html; ";
$message .= "charset=iso-8859-1\r\n ";
//$message .= "charset=utf-8\r\n ";
$message .= "Content-Transfer-Encoding: 8bit\r\n";
$message .= "\r\n";	// ligne vide
/*
//				- données de la partie
*/
//
$message .= "Voir la pièce jointe.\r\n";
$message .= "\r\n";	// ligne vide
/*
//$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ pièces jointes $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$
*/
/* externalisé hors de la fonction */
$pieces_jointes[0]="pieces_jointes/ch10-03_jro_003_20130327_1_fichier_saisie_sur_retraites.html";
$pieces_jointes[1]="pieces_jointes/ch10-03_jro_004_20130327_TF_et_TH_2012_saisie_sur_retraites.pdf";		// pièce jointe
$pieces_jointes[2]="pieces_jointes/ch10-03_jro_001.doc";
$pieces_jointes[3]="pieces_jointes/ch10_envoyer_un_courrier_electronique.xls";
$pieces_jointes[4]="pieces_jointes/20121225_04_300x225.JPG";
/**/

foreach ($pieces_jointes as $value)
	{	
	$Ctype1="Content-Type: application/octet-stream; ";
	piece_jointe($value,$Ctype1);
	}
/*
//$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ délimiteur de fin du message $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$
*/
// délimiteur de fin du message
$message .= "--=O=L=I=V=I=E=R=--\r\n";
/*
//$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ envoi du message $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$
*/
// envoi du message
$ok = mail($destinataires,$objet,$message,$entêtes);
if ($ok) :
	echo "message bien envoyé à $destinataires<br>";
else:
	echo "erreur dans l'envoi";
endif;
?>
appel de la fonction mailingmailo
je ne passe pas de paramètres pour raison de tests
<?php
require("ENI_mail_fonctions.inc.php");							// fonctions mail
mailingmailo();
?>
fonction mailingmailo et piece_jointe dans fichier ENI_mail_fonctions.inc.php:
<?php
function mailingmailo(){
/*---------------------------------------------------------------

/*-----------------------------------------------------------------------*/
//require("ENI_mail_fonctions.inc.php");							// fonctions mail
/*-----------------------------------------------------------
PARTIE COMMUNE DU MESSAGE                 ENTETES
-----------------------------------------------------------*/
$emet="[email protected]";										// emetteur
$destinataires = "[email protected]";						// destinataires
$objet = "Bonjour !"; 											// objet

//en-têtes supplémentaires (ça veut dire quoi ?)

$entêtes  = "";													
$entêtes .= "From: \"Radinor\" <$emet>\r\n"; 					// origine du message
/*
// 		- message au format Multipart MIME
          --------------------------------*/
		  
$entêtes .= "MIME-Version: 1.0\r\n";
$entêtes .= "Content-Type: multipart/mixed; ";
$entêtes .= "boundary=\"=O=L=I=V=I=E=R=\"\r\n";
/*
//$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ message $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$
*/
$message  = "";
/*
//		- première partie du message (texte proprement dit)
          -------------------------------------------------
*/		  
/*
//				- en-tête de la partie
                --------------------
*/
$message .= "--=O=L=I=V=I=E=R=\r\n";
$message .= "Content-Type: text/plain; ";
//$message .= "Content-Type: text/html; ";
$message .= "charset=iso-8859-1\r\n ";
//$message .= "charset=utf-8\r\n ";
$message .= "Content-Transfer-Encoding: 8bit\r\n";
$message .= "\r\n";	// ligne vide
/*
//				- données de la partie
*/
//
$message .= "Voir la pièce jointe.\r\n";
$message .= "\r\n";	// ligne vide
/*
//$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ pièces jointes $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$
*/
/* externalisé hors de la fonction */
$pieces_jointes[0]="pieces_jointes/ch10-03_jro_003_20130327_1_fichier_saisie_sur_retraites.html";
$pieces_jointes[1]="pieces_jointes/ch10-03_jro_004_20130327_TF_et_TH_2012_saisie_sur_retraites.pdf";		// pièce jointe
$pieces_jointes[2]="pieces_jointes/ch10-03_jro_001.doc";
$pieces_jointes[3]="pieces_jointes/ch10_envoyer_un_courrier_electronique.xls";
$pieces_jointes[4]="pieces_jointes/20121225_04_300x225.JPG";
/**/

foreach ($pieces_jointes as $value)
	{	
	$Ctype1="Content-Type: application/octet-stream; ";
	piece_jointe($value,$Ctype1);
	}
/*
//$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ délimiteur de fin du message $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$
*/
// délimiteur de fin du message
$message .= "--=O=L=I=V=I=E=R=--\r\n";
/*
//$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ envoi du message $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$
*/
// envoi du message
$ok = mail($destinataires,$objet,$message,$entêtes);
if ($ok) :
	echo "message bien envoyé à $destinataires<br>";
else:
	echo "erreur dans l'envoi";
endif;
}
function piece_jointe($pj,$Ctype)
/*-------------------------------
joindre un fichier
-------------------------------*/ 
{
//		- nième partie du message (pièce-jointe)
//        -----------------------------------------
//
//				- en-tête de la partie
//                --------------------
//
global $message;
$message .= "--=O=L=I=V=I=E=R=\r\n";
//$message .= "Content-Type: application/octet-stream; ";
$message .= $Ctype;
$message .= "name=$pj\r\n";
$message .= "Content-Transfer-Encoding: base64\r\n";
$message .= "Content-Disposition: attachment; ";
$message .= "filename=$pj\r\n";
$message .= "\r\n";	// ligne vide
/*
//				- lecture du fichier correspond à la pièce jointe
//                -----------------------------------------------
*/
echo "$pj<br>";
$fichier = fopen($pj,"rb");
$données = fread($fichier,filesize($pj));
fclose($fichier);
/*
//				- encodage et découpage des données
//                ---------------------------------
*/
$données = chunk_split(base64_encode($données));
/*
//				- données de la partie (intégration dans le message)
//                --------------------------------------------------
*/
$message .= "$données\r\n";

$message .= "\r\n";	// ligne vide
}
?>

Eléphant du PHP | 96 Messages

30 juil. 2013, 12:37

Essayer d'initialiser la variable $message au depart avant les fonctions et ajouter l'appel global message dans votre fonction malingmailo (comme dans la fonction piece jointe)
Le mkframework, un framework simple et sécurisé: http://mkdevs.com

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

30 juil. 2013, 13:08

Ou faire proprement et ne pas utiliser global (qui est une ineptie).
Passe $message en paramètre et retourne message a la fin de la fonction.

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

radinor
Invité n'ayant pas de compte PHPfrance

30 juil. 2013, 22:01

Merci à moogli et imikado

il manquait bien global $message dans la fonction "mailingmailo"
ça fonctionne impeccablement et je vais continuer de perfectionner en branchant un formulaire

et pour faire plaisir à moogli je supprimerai global $message quand ce sera bien intégré.
Mais je ne pense pas que global $variable soit une ineptie. En cas de récursivité c'est bien pratique de ne pas trop charger la pile.

salutations

ou mets_on résolu ? je n'ai pas trouvé

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

30 juil. 2013, 22:16

Tu ne peux marquer un sujet résolus Ue si tu est membre ;)
S'est une bonne raison pour t'inscrire pour la prochaine fois ;)

Sinon le globals est une erreur car au final tu va ajouter des variables en masse et ne plus savoir d'où elles viennent.
Il faut aussi penser a ceux qui vont passer après toi (ou toi dans plusieurs mois / années) et qui devront lutter pur comprendre le script.

Pour utiliser ce genre de script tous les jours je peux t'assurer c'est une plaît.

Quand a la pile, en cas de récursivité tu passe une référence et non la valeur (passage par référence par défaut depuis php 5) du coup c'est pas vraiment un problème.

C'est une vaste question, similaire aux register globals (supprimé depuis php 5.4) qui comme pas mal de fonctionnalité deviennent une plaît si l'on en abuse :mrgreen:

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

Mammouth du PHP | 2278 Messages

31 juil. 2013, 14:18

Je ne peux qu'appuyer moogli.
La portée des variables est un sujet commun à tous les langages et la solution choisie par PHP est des plus classiques, puisqu'on peut passer les variables en paramètres par valeur ou par adresse.
Il est bien évident que dans ton cas,
il existe deux solutions usuelles:
Si $message ne contient rien avant l'appel de la fonction, il suffit d'écrire dans ce genre:
function f($ce_qui est_utile)
{
$message = "";
$message .= $ce_qui_est_utile;
return $message
}
$message = f($ce_qui est_utile);
on pourrait aussi passer ainsi, en particulier si $message contient qqch avant l'appel:
function f(&$message, $ce_qui est_utile)
{
$message = "";
$message .= $ce_qui_est_utile;
return true;
}
$message = "dieu sait quoi";
f($message, $ce_qui est_utile);
J'ai été contraint de recourir à global dans un seul cas:
définition dans une fonction de variables utilisées par d'autres fonctions : j'aurais gagné à les définir en constantes.

FAUT passer $message en paramètre puisqu'il s'agit de la variable à modifier
Vanitas vanitatum et omnia vanitas
Mes derniers livres :
Sauvez les Mots chez BoD,
Tous les chemins mènent à ROM chez BoD