Page 1 sur 1
Permission
Posté : 22 nov. 2011, 23:28
par mars77
Bonjour à tous,
J' essaie d'envoyer un mail HTMl avec une pièce jointe. Malheureusement j' ai le message d'erreur suivant :
Warning: mail() [function.mail]: Permission denied: headers injection (empty line) in /home/www/f4e28b24b8dad49a90a589664765c79c/web/club/Test/mail.php on line 35
Mon code:
<?php
$to = '[email protected]' ;
// Sujet
$subject = " Inscription d'un nouveau membre du club";
$boundary='didondinaditondelosdudosdodudundodudindon';
//En-têtes du mail
$headers="From: [email protected]\r\n
MIME-Version: 1.0\r\n
Content-Type: multipart/mixed; boundary=\"$boundary\"\r\n\n";
$body="--". $boundary ."\n
Content-Type: text/plain; charset=ISO-8859-1\r\n\n
Message principal du mail.\n\n";
$fichier=file_get_contents('./test.doc');
$fichier=chunk_split( base64_encode($fichier) );
//Écriture de la pièce jointe
$body = $body . "--" .$boundary. "\n
Content-Type: application/msword; name=\"nom_fichier\"\r\n
Content-Transfer-Encoding: base64\r\n
Content-Disposition: attachment; filename=\"nom_fichier\"\r\n\n
$fichier";
//Fermeture de la frontière
$body = $body . "--" . $boundary ."--";
//Envoi du mail
mail($to, $subject, $body, $headers);
?>
Est ce que c'est une erreur de permission ou de problème avec mon code ?
Merci a celui qui pourra m'aider
Re: Permission
Posté : 23 nov. 2011, 06:22
par moogli
Salut,
Le message d'erreur indique que tu a une ligne vide dans l'entete.
En clair vire les \n en double dans header un saut c'est au Max \r\n correspond à un retour chariot et un saut de ligne.
D'ailleurs les \r ne doivent pas être nécessaire il me semble.
@+
Re: Permission
Posté : 23 nov. 2011, 09:42
par Mazarini
Bonjour,
Pour compléter, code plutôt comme ça :
$headers = "From: [email protected]\r\n";
$headers .= "MIME-Version: 1.0\r\n";
$headers .= "Content-Type: multipart/mixed; boundary=\"$boundary\"\r\n";
Le fait d'ajouter des sauts de lignes dans la variable me semble source de confusion
Re: Permission
Posté : 23 nov. 2011, 10:42
par mars77
Hello,
Merci pour l'aide je n'ai plus de message d'erreur. je reçois les mails mais pas les pièces jointes.
Est ce que mon raisonnement et faux pour attacher une pièce jointe ou une simple erreur de code.
Merci pour votre aide
Re: Permission
Posté : 23 nov. 2011, 11:29
par moogli
regarde bien dans les commentaires de la doc de la fonction mail tu a oublié un truc (enfin 2)
tu n'indique pas la taille du fichier et tu n'indique pas ou se trouve le fichier
"Content-Disposition: attachment;\n" . " filename=\"".basename($files[$i])."\"; size=".filesize($files[$i]).";\n" .
"Content-Transfer-Encoding: base64\n\n" . $data . "\n\n";
=>
//Écriture de la pièce jointe
$body = $body . "--" .$boundary. "\n
Content-Type: application/msword; name=\"nom_fichier\"\r\n
Content-Transfer-Encoding: base64\r\n
Content-Disposition: attachment; filename=\"nom_fichier\";size=".filesize('./test.doc').";\n".
"Content-Transfer-Encoding: base64\n\n" . $fichier . "\n\n";
@+
Re: Permission
Posté : 23 nov. 2011, 16:19
par mars77
Hello,
Merci pour tes infos. J'ai fait les corrections et je ne reçois toujours pas les pièces jointes. Dans le mail j'ai du code qui vient. Je cherche l'erreur mais là je sèche.
Le mail:
salut
--didondinaditondelosdudosdodudundodudindon
Content-Type: application/msword; name="nom_fichier"
Content-Transfer-Encoding: base64
Content-Disposition: attachment; filename="nom_fichier";size=22016;
Content-Transfer-Encoding: base64
0M8R4KGxGuEAAAAAAAAAAAAAAAAAAAAAPgADAP7/CQAGAAAAAAAAAAAAAAABAAAAJgAAAAAAAAAA
EAAAKAAAAAEAAAD+////AAAAACUAAAD/////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////s
pcEAh8AMBAAA8BK/AAAAAAABEQABAAEACAAABggAAA4AYmpiah1QHVAAAAAAAAAAAAAAAAAAAAAA
AAAMBBYAMA4AAH86AQB/OgEABgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD//w8AAAAA
AAAAAAD//w8AAAAAAAAAAAD//w8AAAAAAAAAAAAAAAAAAAAAALcAAAAAALAFAAAAAAAAsAUAAHgT
AAAAAAAAeBMAAAAAAAB4EwAAAAAAAHgTAAAAAAAAeBMAABQAAAAAAAAAAAAAAP////8AAAAAjBMA
AAAAAACMEwAAAAAAAIwTAAAAAAAAjBMAAAwAAACYEwAADAAAAIwTAAAAAAAAWhUAAGQBAACkEwAA
AAAAAKQTAAAAAAAApBMAAAAAAACkEwAAAAAAAKQTAAAAAAAAfxQAAAAAAAB/FAAAAAAAAH8UAAAA
AAAA0RQAAAIAAADTFAAAAAAAANMUAAAAAAAA0xQAAAAAAADTFAAAAAAAANMUAAAAAAAA0xQAACwA
AAC+FgAAsgIAAHAZAABqAAAA/xQAABUAAAAAAAAAAAAAAAAAAAAAAAAAeBMAAAAAAAB/FAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAB/FAAAAAAAAH8UAAAAAAAAfxQAAAAAAAB/FAAAAAAAAP8UAAAAAAAA
mRQAAAAAAAB4EwAAAAAAAHgTAAAAAAAApBMAAAAAAAAAAAAAAAAAAKQTAADbAAAAFBUAABYAAACZ
FAAAAAAAAJkUAAAAAAAAmRQAAAAAAAB/FAAAEAAAAHgTAAAAAAAApBMAAAAAAAB4EwAAAAAAAKQT
AAAAAAAA0RQAAAAAAAAAAAAAAAAAAJkUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAfxQAAAAAAADRFAAAAAAAAAAAAAAAAAAAmRQAAAAAAAAAAAAA
AAAAAJkUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAmRQAAAAAAAAAAAAAAAAAAP////8AAAAAUN5KMVup
zAEAAAAAAAAAAP////8AAAAAjxQAAAoAAACZFAAAAAAAAAAAAAAAAAAAvRQAABQAAAAqFQAAMAAA
Mon code corrigé:
$to = '[email protected]' ; // notez la virgule
// Sujet
$subject = " Inscription d'un nouveau membre du club";
$boundary='didondinaditondelosdudosdodudundodudindon';
//En-têtes du mail
$headers = "From: [email protected]\r\n";
$headers .= "MIME-Version: 1.0\r\n";
$headers .= "Content-Type: multipart/mixed; boundary=\"$boundary\"\r\n";
//Corps du mail en commençant par le message principal
$body="--". $boundary ."\n";
$body .= 'Content-type: text/plain; charset=UTF-8'."\r\n\r\n";
$body .= ' salut';
$fichier=file_get_contents('./test.doc');
/* On utilise aussi chunk_split() qui organisera comme il faut l'encodage fait en base 64 pour se conformer aux standards */
$fichier=chunk_split( base64_encode($fichier) );
//Écriture de la pièce jointe
$body = $body . "--" .$boundary. "\n
Content-Type: application/msword; name=\"nom_fichier\"\r\n
Content-Transfer-Encoding: base64\r\n
Content-Disposition: attachment; filename=\"nom_fichier\";size=".filesize('./test.doc').";\n".
"Content-Transfer-Encoding: base64\n\n" . $fichier . "\n\n";
//Fermeture de la frontière
$body = $body . "--" . $boundary ."--";
//Envoi du mail
mail($to, $subject, $body, $headers);
est ce qu'il y a une erreur dans mon code ? une ' ou des ' Pas juste ????
Merci pour votre aide
Re: Permission
Posté : 23 nov. 2011, 17:33
par mars77
Hello,
Cette fois c'est a devenir fou.
J'ai refait un code complet avec l'envoi du fichier par un formulaire.
<?php
header( 'content-type: text/html; charset=utf-8' );
// To
$to = '[email protected]';
// Subject
$subject = 'Test mail pièce jointe';
// clé aléatoire de limite
$boundary = md5(uniqid(microtime(), TRUE));
// Headers
$headers = 'From: [email protected]'."\r\n";
$headers .= 'Mime-Version: 1.0'."\r\n";
$headers .= 'Content-Type: multipart/mixed;boundary='.$boundary."\r\n";
$headers .= "\r\n";
// Message
$msg = 'Texte affiché par des clients mail ne supportant pas le type MIME.'."\r\n\r\n";
// Message HTML
$msg .= '--'.$boundary."\r\n";
$msg .= 'Content-type: text/html; charset=utf-8'."\r\n\r\n";
$msg .= '
<div style="padding:5px; width:600px; background-color:#E0EBF5; border:#000000 thin solid">
<div>
Texte Html
</div>
</div>'."\r\n";
// Pièce jointe 1
$file_name = ''.$NomFichier_name.'';
echo $file_name;
if (file_exists($file_name))
{
$file_type = filetype($file_name);
$file_size = filesize($file_name);
echo $file_type;
echo $file_size;
$handle = fopen($file_name, 'r') or die('File '.$file_name.'can t be open');
$content = fread($handle, $file_size);
$content = chunk_split(base64_encode($content));
$f = fclose($handle);
$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; file_name='.$file_name.';size='.$file_size.";\n";
$msg .= 'Content-transfer-encoding:base64'."\r\n";
$msg .= $content."\r\n";
}
// Fin
$msg .= '--'.$boundary."\r\n";
// Function mail()
mail($to, $subject, $msg, $headers);
?>
Le mail arrive tip top maps toujours pas de pièce joint.
<table bordercolor="000000" bgcolor="#00000" border="0" cellspacing="0" cellpadding="0" width="550" align="center" >
<tr><td align="center"><br><table width="480" border="1" cellspacing="2" cellpadding="0" bordercolor="#ccccCC">
<tr><td align="center" valign="middle" class="mm4" bgcolor="#000099">Formulaire pour envoyer un e-mail au comité du club</td></tr>
<tr bgcolor="#6699cc"><td align="center" width="500" class="mm4" ><br>
<form vname="FormName" action="mail.php" method="post" enctype="multipart/form-data" name="form">
<input type="hidden" name="email" value="[email protected]">
<table border="0" cellpadding="5" cellspacing="0" width="137">
<tr>
<td class="mm4">Sujet</td>
<td><input type="text" name="subject" size="35"></td>
</tr>
<tr>
<td class="mm4">Message</td>
<td><textarea rows="12" name="msg" cols="35"></textarea></td>
</tr>
<tr>
<td class="mm4">Fichier joint:</td>
<td><input type="hidden" name="MAX_FILE_SIZE" value="100000000000000"><input name="NomFichier" type="file" size="16"></td>
</tr>
<tr>
<td class="mm4">Priorité:</td>
<td>
<div align="left">
<select name="priority" size="1">
<option value="1">Urgent
<option value="2">Haute
<option value="3">Moyenne
<option value="4">Basse
<option value="5">Très basse
</select> <input type="submit" value="Envoyer"></div>
</td>
</tr>
</table>
</form>
</td></tr>
</table>
<br>
</table><br>
</td >
</tr>
</table>
Re: Permission
Posté : 23 nov. 2011, 18:42
par moogli
Dans ton avant dernier message y a tout même le contenu du fichier

Je pense pour un header foireux ou séparateur (boundary) foireux.
Sinon je te conseil l'emploi d'une classe qui fera tous pour toi comme phpmailer.
Je test demain ton code si j'ai le temps.
@+
Re: Permission
Posté : 23 nov. 2011, 21:39
par mars77
Je viens de faire un test pour voir si le fichier existait une fois envoyé par le formulaire.
J'ai ajouté que code suivant:
// Pièce jointe 1
$file_name = $_FILES["NomFichier"]["name"];
echo $file_name;
if (file_exists($file_name)) {
echo "Le fichier $filen_ame existe.";
} else {
echo "Le fichier $file_name n'existe pas.";
}
Cela m'affiche le nom du fichier et cela me met que le fichier n'existe pas . Problème de rechercher du fichier ???
Re: Permission
Posté : 24 nov. 2011, 00:02
par moogli
Revois le fonctionnement de l'upload
name c'est juste le nom du fichier. Le fichier qui est envoyer atterris dans dossier temporaire avec un nom qui l'est autant.
Fait un var_dump($_FILES); pour bien voir la chose
@+
Re: Permission
Posté : 24 nov. 2011, 10:20
par mars77
Hello,
J'ai fait ce que tu m'a dis et cela m'a donné le résultat suivant:
array(1) { ["NomFichier"]=> array(5) { ["name"]=> string(8) "logo.jpg" ["type"]=> string(10) "image/jpeg" ["tmp_name"]=> string(14) "/tmp/phpqqVQng" ["error"]=> int(0) ["size"]=> int(254297) } }
Si je comprends bien mon fichier et bien dans le dossier temporraire ? Si c'est le cas pourquoi il ne passe pas ?
Re: Permission
Posté : 25 nov. 2011, 09:49
par moogli
oui oui dans un fichier temporaire
tu fait file_exists($_FILES['NomFichier']['name']) or name contient le nom du fichier sur la machine cliente. c'est à dire le fichier son ton PC a toi (logo.jpg dans ton extrait) et pas sur le serveur.
Quand l'upload c'est bien réalisé tu n'a qu'un fichier temporaire avec un nom pifométrique => $_FILES['NomFichier']['tmp_name'] (/tmp/phpqqVQng dans ton extrait).
tu test donc l'existence d'un fichier qui ne peux pas exister dans le répertoire courant de ton script
donc à la limite file_exist($_FILES['NomFichier']['tmp_name'])) mais ceci est inutile, car si l'upload c'est bien passé $_FILES['NomFichier']['error'] est égale à zéro. Donc dans ce cas le fichier indiqué par tmp_name existe
Perso je remplacerais ton if (file_exist()) par un if ($_FILES['NomFichier']['error'] === 0)

et ensuite tu utilise $_FILES['NomFichier']['tmp_name'] pour la gestion de la pièce jointe.
@+