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
<?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égré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);
?>
<?
$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
<?
//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));
}
?>