8768 sujets

Développement web côté serveur, CMS

Bonjour,

sur une page web, j'ai un formulaire, je récupéré les données que j'écris dans une feuille "excel" (pour que tout le monde comprenne.), en fait c'est du coma separated value Smiley cligne
Je veux recevoir ce formulaire CSV par email en tant que piece jointe.


la feuille se nomme : 20150215-test.csv
Apres la page php m'envoie cette feuille csv par email.
PROBLEME : le fichier n'est pas en piece jointe, mais les caractères sont en vrac dans le mail.... Smiley biggol

Voici ce que je vois dans l'email reçu:
--PHP-mixed-239191cd5886d9ac2498b082ce279c9f
Content-Type: application/vnd.ms-excel; name=20150215-test.csv
Content-Transfer-Encoding: base64
Content-Disposition: attachment

MjAxNTAyMTRfMTBfMThfNDIuY3N2O3RpdHJlO2N1c19jaXY7Y3VzX25vbTtjdXNfZnVuYztjdXNf
dGVsO2N1c19lbWFpbDtwcmpfY291bnRyeTtwcmpfZW5kdXNlcjtwcmpfc3RhdHVzO3Byal9sZWFk
dGltZTtwcmpfYW1sLWF2bDtwcmpfZGVhZGxpbmU7YXBwX21hcmtldDthcHBfcHJlc3N1cmU7YXBw
X3RlbXA7YXBwX3NlcnZpY2U7dmFsX2NvbS1jb2RlO3ZhbC10YWc7dmFsLXF0eTt2YWwtcGlwaW5n
LWNsYXM7dmFsLW5hY2U7VmFsLVR5cGU7cHZhbC1ib25uZXQ7dmFsLUROO3ZhbC1ib3JlO3ZhbC1y....... (il y en a deux pages ! Smiley eek )




Le souci doit se situer SOIT à la génération du mail, soit à l'entête du mail....

Voici mon code :

<?php
//$strPath = "";
$filName = $myFile;
//define the receiver of the email
$to = 'xxxx@xxxxx.xx';
//define the subject of the email
$subject = $myFile;
//create a boundary string. It must be unique
//so we use the MD5 algorithm to generate a random hash
$random_hash = md5(date('r', time()));
//define the headers we want passed. Note that they are separated with \r\n
$headers = "From: xxxxemeteur@xxxx.be\r\nReply-To: xxxx@xxxxx.xx";
//add boundary string and mime type specification
$headers .= "\r\nContent-Type: multipart/mixed; boundary=\"PHP-mixed-".$random_hash."\"";
//read the atachment file contents into a string,
//encode it with MIME base64,
//and split it into smaller chunks
$attachment = chunk_split(base64_encode(file_get_contents($filName)));
//define the body of the message.
ob_start(); //Turn on output buffering
?>


Question subsidiaire : Smiley rolleyes
sur iphone, pas de piece jointe : du charabia dans le texte...
sur gmail, pas de piece jointe : du charabia dans le texte
sur outlook 2010 : le mail est parfait et la piece jointe .csv est bien attaché...


Toutes les pistes d'aides sont les bienvenues.... Smiley biggrin
Salut

Les questions sur les envois de pièces jointes en mail reviennent souvent Smiley smile

Pour ma part une première réponse sera : pourquoi ne pas utiliser la classe : PhpMailer Smiley smile
Elle est très simple d'utilisation et fait tout ce que l'on veut.

Ensuite ma deuxième réponse est de proposer MA fonction que j'utilise pour le mail simple de la version php et donc la voici Smiley smile


/**
 * @return Retourne true,false
 * @param string $to(destinataire)
 * @param string $sujet
 * @param string $message
 * @param string $domaine
 * @param string $sender(mail qui envoi doit etre valide sur le site)
 * @param string(plain/html(default)) $type
 * @param string(utf-8/iso-8859-1(default)) $iso
 * @param string $fichier(chemin relatif jusqu'au fichier à joindre) pour un seul fichier mettre direct le fichier, pour plusieurs faire un array
 * @param string(optionnel) $head
 * @desc fonction incluant les entetes pour un envoi via la fonction mail de php sur amen
*/	
function envoimail($to, $sujet, $message, $domaine, $sender, $type="html", $iso="iso-8859-1", $head="", $fichier="")
{
	if(!empty($fichier)){
		if(is_array($fichier)){
			$boundary = "_".md5 (uniqid (rand())); 
			$attached = "\n\n";
			foreach($fichier as $key => $fic){
				$partOfFile = explode("/",$fic);
				$nomPJ = $partOfFile[count($partOfFile)-1];
				$typemime=mime_content_type($fic);
			  
			  $attached_file = file_get_contents($fic); 
			  $attached_file = chunk_split(base64_encode($attached_file)); 
			  $attached .= "--" .$boundary."\nContent-Type: $typemime; name=\"$nomPJ\"\r\nContent-Transfer-Encoding: base64\r\nContent-Disposition: attachment; filename=\"$nomPJ\"\r\n\n".$attached_file;
			}
			$attached .= "--" . $boundary . "--"; 
		}else{
			$partOfFile = explode("/",$fichier);
			$nomPJ = $partOfFile[count($partOfFile)-1];
			$typemime=mime_content_type($fichier);
			
		  $boundary = "_".md5 (uniqid (rand())); 
		  $attached_file = file_get_contents($fichier); 
		  $attached_file = chunk_split(base64_encode($attached_file)); 
		  $attached = "\n\n". "--" .$boundary . "\nContent-Type: $typemime; name=\"$nomPJ\"\r\nContent-Transfer-Encoding: base64\r\nContent-Disposition: attachment; filename=\"$nomPJ\"\r\n\n".$attached_file . "--" . $boundary . "--"; 
		}
	}

  $mail_mime = "Organization: $domaine\r\n";
	$mail_mime .= "From: $domaine <$sender>\r\n";
	$mail_mime .= "Reply-To: $sender\r\n";
	$mail_mime .= "Return-Path: <$sender>\r\n"; // En cas d' erreurs
	$mail_mime .= "X-Sender: <$sender>\r\n";
	
	if(!empty($fichier)){
  	$mail_mime .= "MIME-Version: 1.0\r\nContent-Type: multipart/mixed; boundary=\"$boundary\"\r\n";
  	$body = "--". $boundary ."\nContent-Type: text/$type; charset=$iso\r\n\n".$message . $attached; 
  }else{
  	$mail_mime .= "Content-Type: text/$type; charset=\"$iso\"\n ";
		$mail_mime .= "Content-Transfer-Encoding: 8bit\n";
		$body = $message;
	}
	$mail_mime .= $head;
  
	$res=mail($to,$sujet,$body,$mail_mime);
	return $res;
}



LA contrainte principale étant de stocker le fichier joint sur le serveur Smiley smile même si ce n'est que temporaire Smiley smile
bonjour pchjl,

merci pour ta réponse rapide, Je viens d'essayer phpmailer...ca a l'air de faire papa-maman....mais ca ne marche pas !

je prefere un solution simple (et simpliste en dur-natif hardwritten) et donc ta solution me plait.

ok pour ton code, mais je suis plus à l'aise en html qu'en php.... ou dois- je entrer l'expediteur et destinataire et nom de fichier ? est ce ici ? ou dans le code ?
* @param string $to , j'ai regardé phpdoc mais c'est pas clair..

merci pour ton aide
Si tu n'est pas a l'aise avec du code je comprend que PHP mailer te rebutes un peu Smiley cligne

Ma fonction est simple.
Il s'agit dune fonction donc soi . La copie colle dans ta page PHP soit tu l'ajoute dans une page qui contient déjà d'autres fonctions et que tu utilises en incluse.

Pour l'utiliser : voici un exemple concret avec des valeurs fictives

envoimail("destinataire@mail.com", "sujet du mail", "le message", "monsiteweb.fr", "contact à moniste web.fr", "html", "utf-8", "", "reprtoire/fichier.pdf");

Tu vois ainsi toutes les variables avec de vrais valeurs
Bien sur tu peux utiliser et c'est préférable des variables

N'hésite pas si tu NY arrive pas, même a poser ton code Smiley cligne