Envoie mail avec plusieurs fichiers attachés

php_debut_user
Invité n'ayant pas de compte PHPfrance

12 avr. 2005, 15:19

SVP est ce que qq1 peut me dire comment je peut envoyer un Email avec plusieurs fichiers attachées
J'en ais besoin le plus to possible
Merci bcpsssssss

Eléphanteau du PHP | 46 Messages

13 avr. 2005, 12:41

Alors pas de solutoipns ??
J'ai essayé bcps de codes
ça marchait avec un seul fichier mais avec plusieurs non :? !!! il me met tous ds un seul fichier avec un taille de 0Ko
je pense que c'est la structure qui n'est pas bonne voici le code:
[code]<?
$headers = "From: Votre Nom <[email protected]>\n";

$headers .= "Content-type: multipart/mixed; ";
$headers .= "boundary=\"Message-Boundary\"\n";
$headers .= "Content-transfer-encoding: 7BIT\n";

//$maill = $body_top.stripslashes($msg);

for($i=0;$i<=4;$i++)
{
if ($a=is_uploaded_file($attach[$i])) {
$body_top = "--Message-Boundary\n";
$body_top .= "Content-type: text/plain; charset=US-ASCII\n";
$body_top .= "Content-transfer-encoding: 64BIT\n";
$body_top .= "Content-description: Mail message body\n\n";

$msg_cpl[$i].= "\n\n--Message-Boundary\n";
$msg_cpl[$i].= "Content-type: $attach_type[$i]; name=\"$attach_name[$i]\"\n";
$msg_cpl[$i].= "Content-Transfer-Encoding: BASE64\n";
$msg_cpl[$i].= "Content-disposition: attachment; filename=\"$attach_name[$i]\"\n\n";
$msg_cpl[$i].= "$encoded_attach[$i]\n";
$msg_cpl[$i].= "--Message-Boundary--\n";

}
$maill.=$body_top.$msg_cpl[$i];
}
$maill.= stripslashes($msg);
if (mail ("$adresse","".stripslashes($subject)."","$maill",$headers)) {
echo ("<center><font color=green>Mail envoyé</font></center>");
}
?>[/code]
merci
L'informatique c'est ma vie

ant
Eléphant du PHP | 161 Messages

13 avr. 2005, 13:54

En effet ton code n'est pas bon.

Voici plusieurs exemples de code (non exhaustifs) à adapter selon tes besoins biensur.

Analyse les avant de les utiliser, le code est bien commenté.. (et n'oublie pas de changer les parametres passés aux variables $fichier, $to, $from, $reply...)

et la prochaine fois met ton code entre les balises code ou php pour une meilleure lisibilité
<?php

/* Dans les 2 exemples ci-dessous, on ne recevra soit que du texte(ou html) 
   ou soit que des images en fichier rattachés (on incorporés dans le corps
   de l'email)mais non les 2 à la fois.
 mail avec html inclus
 on indique simplement le type MIME comme text/html
*/

mail("tonEmail","test email","test message", 
    "<html><body> <h1> test mail </h1> <strong> essai </strong>.
    <p font color=\"red\"> voici un paragraphe </p> </body> </html>",
	"From: expediteur\r\n"
	."Content-Type: text/html; charset=\"iso-8859-1\"");
	
$fichier = "CHEMIN VERS TON IMAGE";
$fp = fopen($fichier, "rb");
$fichierAttache = fread($fp, filesize($fichier));
fclose($fp);
$fichierAttache = chunk_split(base64_encode($fichierAttache));
*/

/* --------------------------------------------------------------------------------
				mail avec fichier attaché
  ---------------------------------------------------------------------------------

 Content-Disposition = on indique que le fichier est attaché ou dans le corps du mail (inline)
 Content-Transfer-Encoding = on indique le type d'encodage du fichier
 Content-type = on indique le type MIME
*/
 
mail("Ton email","test email",$fichierAttache, 
	 "From: Expéditeur\r\n"
	 ."Content-Disposition: attachment; filename=tonFichier\r\n"
	 ."Content-Transfer-Encoding: base64\r\n"
	 ."Content-Type: image/jpg\r\n");




/* ---------------------------------------------------------------------------------
				 envoi d'un email multipart
 1 : On précise dans l'en tête principal qu'il s'agit d'un mail multipart
 2 : On identifie chaque partie en la séparant des autres par un délimiteur
 3 : On identifie chaque partie par le type de contenu
   |-> Content-Type charset et Content-Transfer-Encoding + ligne vide
*/

 // délimiteur généré aléatoirement
 $delimiteur = "-----=".md5(uniqid(rand(), true));
 
					 // Construction de l'en-tête principal
 //Version du format MIME utilisé
 $entete = "MIME-Version: 1.0\r\n";
 
 //type de contenu: multipart
 //délimiteur = $delimiteur
 $entete .= "Content-Type: multipart/mixed; boundary=\"$delimiteur\"\r\n";
 $entete .= "\r\n";
 
 // message d'information au cas ou le log destinataire ne peut pas lire le format
 // 						MIME de cette version 
 $msg ="Nous vous informons que ceci est un message au format MIME 1.0" . 
 	   "multipart/mixed.\r\n";
 	   
 // PARTIE 1 DU MESSAGE : 				TEXTE
 
 $msg .= "--$delimiteur\r\n";
 $msg .= "Content-Type: text/plain; charset=\"iso-8859-1\"\r\n";
 // type d'encodage
 $msg .= "Content-Transfer-Encoding:8bit\r\n";
 // ligne vide indispensable entre l'en-tête et le texte
 $msg .="\r\n";
 
 // texte du message 
 $msg .="Ceci est un mail avec un fichier joint\r\n";
 $msg .="\r\n";
 
 // PARTIE 2 DU MESSAGE : 				FICHIER JOINT 

 // sélection du fichier, ouverture du fichier, encodage du fichier
$fichier = "chemin de l'image";
$fp = fopen($fichier, "rb");
$fichierAttache = fread($fp, filesize($fichier));
fclose($fp);
$fichierAttache = chunk_split(base64_encode($fichierAttache));


$msg .= "--$delimiteur\r\n";
$msg .="Content-Type: image/jpg; name=\"$fichier\"\r\n";
$msg .= "Content-Transfer-Encoding: base64\r\n";

// inline : si possible le fichier est affiché dans le corps du mail
$msg .= "Content-Disposition: inline; filename=\"$fichier\"\r\n";
// ligne vide indispensable entre l'en-tête et le texte
$msg .="\r\n";
$msg .= $fichierAttache."\r\n";
$msg .="\r\n\r\n";

// on indique la fin par une nouvelle frontière
$msg .= "--$delimiteur--\r\n";

// envoi du mail
$to = "tonEMail";
$reply = "";
$from = "expéditeur";
mail($to, "test email multipart", $msg,"From: $from\r\n".$entete);


/* ----------------------------ENVOIE D'EMAIL HTML AVEC                  IMAGES-----------------------
 2 cas possibles :

 		|->  Solution la moins satisfaisante.
 			 Considérer que les images sont disponibles sont un serveur web
 		     On reprend alors le premier exemple et on précise les adresses
 		     complètes pour les images <img src ="..."  />
 		     
 		|->  Ou envoyer les images avec le corps du mail html
 		     On créé alors un mail multipart et on fait référence à
 		     ces images attachées depuis les balises HTML.
 		     Pour cela : Il est possible de donner un identifiant à une partie
 		     quelconque du mail (ici les images) grace à un en-tête:
 		     Content-ID: suivi d'une chaîne de caractères choisie comme ID placée
 		     entre < et >. 
 		     Pour faire ensuite appel à ces éléments, on précise l'ID de la partie
 		     précédé de "cid:"
*/

$delimiteur = "-----=".md5(uniqid(rand(), true));
 
					 // Construction de l'en-tête principal
					 
 //Version du format MIME utilisé
 $entete = "MIME-Version: 1.0\r\n";
 
 //type de contenu: multipart
 // en-tête principal
 $entete .= "Content-Type: multipart/mixed; boundary=\"$delimiteur\"\r\n";
 $entete .= "\r\n";
 
 // message d'information au cas ou le log destinataire ne peut pas lire le format
 // 						MIME de cette version 
 $msg = "Nous vous informons que ceci est un message au format MIME 1.0" . 
 	    "multipart/mixed.\r\n";
 	   
 // en-tête de la première partie. On precise ici text/html 
 $msg .= "--$delimiteur\r\n";
 $msg .= "Content-Type: text/html; charset=\"iso-8859-1\"\r\n";
 // type d'encodage
 $msg .= "Content-Transfer-Encoding:8bit\r\n";
 // ligne vide indispensable entre l'en-tête et le texte
 $msg .="\r\n";
 
 // construction du message HTML , insertion des 2 images avec cid

 $msg .= "<html> <body> <h1> Email avec 2 images int&eacute;gr&eacute;es</h1>";
 $msg .= "<table border=\"1\">";
 $msg .= "<tr> <th> Image 1 </th> </tr> <td> <img src=\"cid:image1\"></td></tr>";
 $msg .= "<tr> <th> Image 1 </th> </tr> <td> <img src=\"cid:image2\"></td></tr>";
 $msg .= "</table>";
 $msg .= "</body></html>\r\n";
 $msg .= "\r\n";
 
// ---------------------------- PREMIERE IMAGE A INCORPORER
// sélection du fichier, ouverture du fichier, encodage du fichier
$fichier = "TONFICHIER.jpg";
$fp = fopen($fichier, "rb");
$fichierAttache = fread($fp, filesize($fichier));
fclose($fp);
$fichierAttache = chunk_split(base64_encode($fichierAttache));


// Content-Type diffère par son type MIME ici application/octet-stream
$msg .= "--$delimiteur\r\n";
$msg .= "Content-Type: application/octet-stream; name=\"$fichier\"\r\n";
$msg .= "Content-Transfer-Encoding: base64\r\n";
//on n'oublie pas de référencer l'ID
$msg .= "Content-ID: <image1>\r\n";
$msg .= "\r\n";

$msg .= $fichierAttache."\r\n";
$msg .="\r\n\r\n";

//-------------------------------DEUXIEME IMAGE A INCORPORER
$fichier = "TONFICHIER.jpg";
$fp = fopen($fichier, "rb");
$fichierAttache = fread($fp, filesize($fichier));
fclose($fp);
$fichierAttache = chunk_split(base64_encode($fichierAttache));


// Content-Type diffère par son type MIMIE ici application/octet-stream
$msg .= "--$delimiteur\r\n";
$msg .= "Content-Type: application/octet-stream; name=\"$fichier\"\r\n";
$msg .= "Content-Transfer-Encoding: base64\r\n";
//on n'oublie pas de référencer l'ID
$msg .= "Content-ID: <image2>\r\n";
$msg .= "\r\n";

$msg .= $fichierAttache."\r\n";
$msg .="\r\n\r\n";

// fin de l'email
$msg .= "--$delimiteur--\r\n";

// envoi du mail
$to = "tonEmail";
$reply = "";
$from = "expéditeur";
mail($to, "test email multipart HTML", $msg,"From: $from\r\n".$entete);
?>

Modérateur PHPfrance
Modérateur PHPfrance | 2575 Messages

13 avr. 2005, 14:42

Le code de contient des erreurs logiques.
Correction commentée :
<? 
$headers = "From: Votre Nom <[email protected]>\n"; 
$headers .= "Content-type: multipart/mixed; "; 
$headers .= "boundary=\"Message-Boundary\"\n"; 
$headers .= "Content-transfer-encoding: 7BIT\n"; 

//Cette partie doit se répéter une fois dans le message
$body_top = "--Message-Boundary\n"; 
$body_top .= "Content-type: text/plain; charset=US-ASCII\n"; 
$body_top .= "Content-transfer-encoding: 64BIT\n"; 
$body_top .= "Content-description: Mail message body\n\n"; 
//sans oublier le message
$body_top .= stripslashes($msg); 

//Tes attachements
for($i=0;$i<=4;$i++) 
{ 
if ($a=is_uploaded_file($attach[$i])) { 
//ok, cette partie se répéte et se cumule dans une variable $msg_attach 
//tanqu'il y a des attachements dans le tableau $attach
$msg_attach .= "\n--Message-Boundary\r\n"; 
$msg_attach .= "Content-type: $attach_type[$i]; name=\"$attach_name[$i]\"\r\n"; 
$msg_attach  .= "Content-Transfer-Encoding: BASE64\r\n"; 
$msg_attach  .= "Content-disposition: attachment\n\n"; 
$msg_attach  .= "$encoded_attach[$i]\n\n"; 

} 
}
//Attendre la fin de la boucle pour assembler les attachement et le message
$maill = $body_top.$msg_attach ;
if (mail ("$adresse","".stripslashes($subject)."","$maill",$headers)) { 
echo ("<center><font color=green>Mail envoyé</font></center>"); 
} 
?>
Attention l'origine des variables $msg et les tableau $attach... n'est pas mentionné dans le programme
--------//////----//---//----//////
-------//---//----//---//----//---//
------//////----//////-----//////
-----||--------||--||---||
Prendre le recul n'est pas une perte de temps.


ps: Affrontez moi dans l'arène

Modérateur PHPfrance
Modérateur PHPfrance | 2575 Messages

13 avr. 2005, 15:21

Voici un programme de test qui marche bien :
<?
//attachements (nom et type MIME)
$attach[0]=array ('nom'=>"doc1.txt", 'type'=>"text");
$attach[1]=array ('nom'=>"doc1.doc", 'type'=>"msword");
$attach[2]=array ('nom'=>"doc1.zip", 'type'=>"octetstream");

//Le message
$msg= "<b>Salut, je vous envoi une raffale de fichiers pour tester<br>Pas de panique! ";
//destinataire
$adresse = "[email protected]";
//L'objet
$objet = "Test de plusieurs attachements";
//Les entêtes
$headers = "From: Votre Nom <[email protected]>\n"; 
$headers .= "Content-type: multipart/mixed; "; 
$headers .= "boundary=\"Message-Boundary\"\n"; 
$headers .= "Content-transfer-encoding: 7BIT\n"; 

//Cette partie doit se répéter une fois dans le message 
$body_top = "--Message-Boundary\n"; 
$body_top .= "Content-type: text/html; charset=US-ASCII\n"; 
$body_top .= "Content-transfer-encoding: 64BIT\n"; 
$body_top .= "Content-description: Mail message body\n\n"; 
//sans oublier le message 
$body_top .= stripslashes($msg); 

$msg_attach = "";
//Tes attachements 
for($i=0;$i<3;$i++) 
{ 
if ($attach[$i]!= null) { 
//ok, cette partie se répéte et se cumule dans une variable $msg_attach 
//tanqu'il y a des attachements dans le tableau $attach 
$nom = $attach[$i]["nom"];
$type = $attach[$i]["type"];
$msg_attach .= "\n--Message-Boundary\r\n"; 
//Référence au fichier à attacher et son type MIME
$msg_attach .= "Content-type: application/$type; name=\"$nom\"\r\n"; 
$msg_attach  .= "Content-Transfer-Encoding: BASE64\r\n"; 
$msg_attach  .= "Content-disposition: attachment\n\n"; 
//Importation du contenu binaire du fichier à attacher (voir fonction)
$msg_attach  .= getContent($nom)."\n\n"; 
 
} 
} 
//Attendre la fin de la boucle pour assembler les attachement et le message 
$mail = $body_top.$msg_attach ; 

if (mail ($adresse,stripslashes($objet),$mail,$headers)) 
	echo "<center><font color=green>Mail envoyé</font></center>";
else
	echo "<center><font color=red>Mail non envoyé</font></center>"; 
	
//Fonction d'importation du contenu du fichier à attacher
function getContent($file) {
//Lecture du fichier en mode binaire
    $f = fopen( $file, "rb" ); 
    $contenu = fread( $f, filesize( $file ) ); 
    fclose( $f );
//retourner le contenu lues en codage 64 bits
    return chunk_split(base64_encode($contenu)); 
}
?> 
--------//////----//---//----//////
-------//---//----//---//----//---//
------//////----//////-----//////
-----||--------||--||---||
Prendre le recul n'est pas une perte de temps.


ps: Affrontez moi dans l'arène

William90
Invité n'ayant pas de compte PHPfrance

01 mars 2014, 17:01

Merci ! Ce code vient de me sauvé! =D>