Mail() et pièce jointe

agape
Invité n'ayant pas de compte PHPfrance

03 juil. 2013, 16:30

Bonjour,


J'ai voulu utiliser le script déjà discuter sur le sujet mail() et pièce jointe or la pièce joite reçu est codée :

Voici le code utilisé :
//************************************************


$boundary = md5(uniqid(microtime(), TRUE));
 $headers = 'Mime-Version: 1.0'."\r\n";
 $headers .= 'Content-Type: multipart/mixed;boundary='.$boundary."\r\n";
 $headers .= "\r\n";

 $msg = 'Texte affiché par des clients mail ne supportant pas le type MIME.'."\r\n";
 $msg .= '--'.$boundary."\r\n";
 $msg .= 'Content-type: text/html; charset=ISO-8859-1'."\r\n";
 $msg .= 'Mon formulaire en html'."\r\n";

$file_name = $_FILES['acte']['tmp_name'];

if (file_exists($file_name))
{
 $file_type = filetype($file_name);
 $file_size = filesize($file_name);
 $content = chunk_split(base64_encode(file_get_contents($file_name)));

 $msg .= '--'.$boundary."\r\n";
 $msg .= 'Content-type:'.$file_type.';name='.$file_name."\r\n";
 $msg .= 'Content-transfer-encoding:base64'."\r\n";
 $msg .= $content."\r\n";
 unlink($file_name);
}
$msg .= '--'.$boundary."\r\n";



        if(!mail('mon mail',$_POST['qualite'], $msg, $headers))
                        {echo "ERROR";}
                        else { echo "Mail bien envoyé";}


//**********************************
Voici ce que je reçois :

Content-type: text/html; charset=ISO-8859-1

Mon formulaire en html



--------------------------------------------------------------------------------


Content-type:file;name=/tmp/phpuUkimV

Content-transfer-encoding:base64

/9j/4AAQSkZJRgABAgEASABIAAD/4WueRXhpZgAASUkqAAgAAAALAA8BAgAKAAAAkgAAABABAgAI

AAAAnAAAABIBAwABAAAAAQAAABoBBQABAAAApAAAABsBBQABAAAArAAAACgBAwABAAAAAgAAADEB

AgAKAAAAtAAAADIBAgAUAAAAvgAAABMCAwABAAAAAgAAAGmHBAABAAAAogEAAKXEBwDQAAAA0gAA

ABobAABQYW5hc29uaWMARE1DLUZaNwBIAAAAAQAAAEgAAAABAAAAVmVyLjEuMCAgADIwMDc6MDI6

MjEgMTg6MDk6NTUAUHJpbnRJTQAwMjUwAAAOAAEAFgAWAAIAAAAAAAMAZAAAAAcAAAAAAAgAAAAA

AAkAAAAAAAoAAAAAAAsArAAAAAwAAAAAAA0AAAAAAA4AxAAAAAABBQAAAAEBAQAAABABgAAAAAkR

...............


//**************************************


Comment je peux reconstruire la pièce jointe ?


Merci à vous,

ViPHP
ViPHP | 2577 Messages

04 juil. 2013, 08:51

Bonjour,

Je pense qu'il manque des lignes vides (juste avant la première ligne affichée à tord ?)

Le plus simple est de comparer avec un client mail le source d'un mail normal contenant une pièce jointe et de ton mail pour voir les écarts.

agape
Invité n'ayant pas de compte PHPfrance

04 juil. 2013, 15:30

Merci pour ta réponse mais je ne comprends, quelles lignes sont manquantes selon toi ? et quelles lignes sont en trop ?

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

04 juil. 2013, 22:37

salut,


il y a un exemple dans la doc de la fonction mail http://www.php.net/manual/fr/function.mail.php#83491

en comparant le code je vois qu'il te manque : Content-Disposition: attachment; filename="le nom du fichier"


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

agape
Invité n'ayant pas de compte PHPfrance

06 juil. 2013, 20:30

Merci pour les indications, j'ai donc fait des tests avec cette ligne :

Voici le retour :

*************

Content-type: text/html; charset=ISO-8859-1

Mon formulaire 1 en html



--------------------------------------------------------------------------------


Content-type:file;name=/tmp/phpURII2p

Content-transfer-encoding:base64

Content-Disposition: attachment; filename=/tmp/phpURII2p

/9j/4AAQSkZJRgA
...

**********************


J'ai vu le code donné en référence, j'ai une question, sur cette ligne :

Content-Disposition: attachment; filename=/tmp/phpURII2p

Ce filename = ...-> $_FILES['mavariable'][tmp_name] ou...[name]

J'ai quand même fait les deux tests, même résultats.


**********************
$boundary =rand(0,9)."-" .rand(10000000000,9999999999) . "-" . rand(10000000000,9999999999)."=:" . rand(10000,99999);
$headers = 'Mime-Version: 1.0'."\r\n";
$headers .= 'Content-Type: multipart/mixed;boundary='.$boundary."\r\n";
$headers .= "\r\n";

$msg = 'Texte affiché par des clients mail ne supportant pas le type MIME.'."\r\n";
$msg .= '--'.$boundary."\r\n";
$msg .= 'Content-type: text/html; charset=ISO-8859-1'."\r\n";
$msg .= 'Mon formulaire 1 en html'."\r\n";

$file_name = $_FILES['acte']['tmp_name'];

if (file_exists($file_name))
{
$file_type = filetype($file_name);
$file_size = filesize($file_name);
$content = chunk_split(base64_encode(file_get_contents($file_name)));

$msg .= '--'.$boundary."\r\n";
$msg .= 'Content-type:'.$file_type.';name='.$file_name."\r\n";
$msg .= 'Content-transfer-encoding:base64'."\r\n";
$msg .= 'Content-Disposition: attachment; filename='.$_FILES['acte']['tmp_name']."\r\n";
//ou
// $msg .= 'Content-Disposition: attachment; filename='.$_FILES['acte']['name']."\r\n";

$msg .= $content."\r\n";
unlink($file_name);
}
$msg .= '--'.$boundary."\r\n";



if(!mail('mon_mail',$_POST['qualite'], $msg, $headers))
{echo "ERROR";}
else { echo "Mail bien envoyé !";}


***************************************************************************

Je ne vois pas l'erreur !! j'ai aussi tester l'exemple complet e référence (ton lien sur phpfrance). Pas BODY Pas de message Pas de fichier joint.

Je n'arrive pas à retrouvé une pièce jointe correcte...

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

07 juil. 2013, 16:52

le filename contient le nom du fichier pas le chemin complet qui n'existe pas sur la machine qui lira le mail.

donc dans ton cas $_FILES['mavariable']['name']

si tu ne veux pas t'emmerder je te conseil d'utiliser la classe phpmailer qui le fera pour toi ;)

dans l'exemple que je t'indique il y a deux "boundary" différent, la fin étant marqué par des --$boundary-- et nom --$bondary, cela doit aussi poser soucis.


Après je ne connais pas trop la RFC mail tu peux voir ce qu'elle indique à ce sujet.

sinon tester le code indiqué dans la doc voir ce que cela donne



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

Agape
Invité n'ayant pas de compte PHPfrance

07 juil. 2013, 18:00

Merci , j'ai refais des tests sans succes, du coup j'suis parti sur un script qui m'affiche le nom de la pièce jointe dans "la partie pièce jointe du mail" reçu.

Avec le bon poids... donc c'est mieux....mais j'ai juste un souci, la pièce jointe est corrompu, donc inexploitable :

Voici mon code :

************************

$acte = $_FILES["acte"]["name"];


$boundary =rand(0,9)."-" .rand(10000000000,9999999999) . "-" . rand(10000000000,9999999999)."=:" . rand(10000,99999);

$attached_file = file_get_contents($acte); //file name ie: ./image.jpg
$attached_file = chunk_split(base64_encode($attached_file));

$attached = "\n\n". "--" .$boundary . "\nContent-Type: application; name=\"".$_FILES["acte"]["name"]."\"\r\nContent-Transfer-Encoding: base64\r\nContent-Disposition: attachment; filename=\"".$_FILES["acte"]["name"]."\"\r\n\n".$attached_file . "--" . $boundary . "--";

$headers ="From:[email protected]\r\n";
$headers .= "MIME-Version: 1.0\r\nContent-Type: multipart/mixed; boundary=\"".$boundary."\"\r\n";
$sujetMail = "Sujet";

//Les variables

$subject = "Formulaire TEST";

$message .="<html><body>Nom / Prenom : ".$_POST["nom"]." ".$_POST["prenom"]."<br />";
$message .="Telephone : ".$_POST["telephone"]."</span><br />";
$message .="Email : ".$_POST["email"]."</span><br />";
$message .="Sujet : ".$_POST["sujet"]."</span><br />";
$message .="Langue :".$_POST["LgTemp"]."</span><br />";
$message .="Message :<br />".nl2br($_POST["comment"])."<br />";
$message .="</body></html>";
$message2 = utf8_decode($message);

$body = "--". $boundary ."\nContent-Type: text/html; charset=ISO-8859-1\r\n\n".$message2 . $attached;

if (mail ("monmail","TEST BODY", $body, $headers ))
{
$msg = "Votre demande va être traitée...<br>Vous serez contacté prochainement par nos services\n...";
}

*****************************************
*****************************************


Connais tu le moyen de rendre NON CORROMPU cette pièce jointe ?

Agape
Invité n'ayant pas de compte PHPfrance

07 juil. 2013, 20:47

Effectivement en essayant la lib PHPMAILER, beaucoup de problème n'en sont plus... donc je recommande cette LIB, et remerci chaleureusement l'aide de MOOGLI.


Bye,


Et encore merci de votre aide,


Bonne fin de week end,