Page 1 sur 1

Mail avec pièce jointe vide ou non selon FAI...

Posté : 23 juin 2011, 17:55
par Serial_surfeuse
Bonjour,

J'essaye depuis un certain temps d'envoyer des mails avec pièce jointe en PHP et à des destinataires multiples. Je croyais avoir réussi quand je me suis rendu compte que mon script ne fonctionnait que sur gmail ! Sur mes autres adresses de messagerie la pièce jointe est VIDE ! Quelle serait la différence entre gmail, hotmail, 9online et les autres ?! Je suis dépitée :|

Mon site est actuellement en ligne, hébergé par olympe-network, dans sa formule gratuite.

Vous voulez mon code ?
Voilà le formulaire :
<form method="POST" action="admin.php" enctype="multipart/form-data">
 
    <p>Destinataire(s): <input type="text" name="destinataire" size="70" value="<?php echo $mail; ?>" /></p>
    <p>Exp&eacute;diteur : <input type="text" name="expediteur" size="50" value='Machin MACHIN <[email protected]>' /></p>
    <p>Sujet : <input type="text" name="sujet" size="70" /></p>
    <p>Fichier joint:
    <input type="hidden" name="MAX_FILE_SIZE" value="8000000" /><input name="Nomfichier" type="file" size="16" /></p>
 
     <table>
        <tr>
            <td>
    Message :</td><td> <textarea rows="12" cols="60 "name="message"></textarea>
        </td>
        </tr>
    </table>
    <p><input type="submit" value="Envoyer" /></p>
</form>
...Et le PHP :
if(isset($_POST['destinataire']) AND (isset($_POST['expediteur'])) AND (isset($_POST['message']))){   //Si les champs du mail sont remplis
   

if (!preg_match("#^[a-z0-9._-]+@(hotmail|live|msn).[a-z]{2,4}$#", $_SESSION['mail']))     // Utilisation de \r\n ou de \n selon fai 
{
	$passage_ligne = "\r\n";
}
else
{
	$passage_ligne = "\n";
}


if (isset($_FILES['Nomfichier']['name']) AND $_FILES['Nomfichier']['error'] == 0)   //Si on a un fichier
{
    
     $filename=$_FILES['Nomfichier']['name'];

     

$extension=strrchr($filename,'.');   //je cherche l'extension du fichier à joindre



$extension=substr($extension,1) ;
    
$_FILES['Nomfichier']['name'] = 'piece_jointe.'.$extension;    //on renomme le fichier

                       
                      
                        move_uploaded_file($_FILES['Nomfichier']['tmp_name'], basename($_FILES['Nomfichier']['name'])); // Enregistrement du fichier
                        



}
else {
    echo 'L: 346'.$_FILES['Nomfichier']['error'];
}

$message=nl2br(htmlentities($_POST['message']));


// clé aléatoire de limite
$boundary = md5(uniqid(microtime(), TRUE));


// Headers
$headers  = "From: ".$_POST['expediteur'].$passage_ligne;
$headers .= "Reply-to: ".$_POST['expediteur'].$passage_ligne;
$headers .= 'MIME-Version: 1.0'.$passage_ligne;
$headers .= 'Content-Type: multipart/mixed;boundary='.$boundary.$passage_ligne;




// Texte
$msg .= '--'.$boundary.$passage_ligne;
$msg .= 'Content-type:text/plain;charset=ISO-8859-1'.$passage_ligne;
$msg .= $message . $passage_ligne;

// Pièce jointe
if($extension=="pdf" OR $extension=="PDF"){                    //On cherche le nom de la pièce jointe (jai bien essayé autrement mais je n'ai pas réussi...)
    $file_name = 'piece_jointe.pdf';
}
elseif($extension=="jpeg" OR $extension=="JPEG"){
    $file_name = 'piece_jointe.jpeg';
}
elseif($extension=="jpg" OR $extension=="JPG"){
    $file_name = 'piece_jointe.jpg';
}
elseif($extension =="zip" OR $extension=="ZIP"){
    $file_name = 'piece_jointe.zip';
}
elseif($extension =="png" OR $extension=="PNG"){
    $file_name = 'piece_jointe.png';
}
elseif($extension == "gif" OR $extenion=="GIF"){
    $file_name = 'piece_jointe.gif';
}
elseif($extension == "odt" OR $extension=="ODT"){
    $file_name = 'piece_jointe.odt';
}
elseif($extension == "xls" OR $extension=="XLS"){
    $file_name = 'piece_jointe.xls';
}
elseif($extension == "txt" OR $extension=="TXT"){
$file_name = 'piece_jointe.txt';
}
else {
    echo 'extension non reconnue';
}

if (file_exists($file_name))
{
	$file_type = filetype($file_name);
	$file_size = filesize($file_name);

$finfo = finfo_open(FILEINFO_MIME_TYPE); // Retourne le type mime à la extension mimetype

    echo 'type de fichier : '.finfo_file($finfo, $file_name);

finfo_close($finfo);



	$content = file_get_contents($file_name);
    
	$content = chunk_split(base64_encode($content));
	

	$msg .= '--'.$boundary.$passage_ligne;
	$msg .= 'Content-type:'.finfo_file($finfo, $file_name).';name='.basename($file_name).$passage_ligne;
	$msg .= 'Content-Transfer-Encoding:base64'.$passage_ligne;
    $msg .= 'Content-Disposition: attachment; filename='.$file_name.$passage_ligne;
	$msg .= $content.$passage_ligne;
}

// Fin
$msg .= '--'.$boundary.'--';

// Function mail()
mail($_SESSION['mail'], $_POST['sujet'], $msg, $headers);

}



...Et c'est le drame !

Ce code est le fruit d'une bonne galère, il doit en résulter des choses étranges, mais il est à deux doigts de fonctionner, je crois.


Ne me parlez pas de phpmailer, jy ai passé beaucoup de temps aussi, il a temporairement fonctionné, puis plus du tout... je comprends rien. J'ai vu sur des forums que le problème viendrait de olympe-network, mais pourtant ça a fonctionné et le code posté fonctionne plus ou moins aussi.


Aussi je crois que hier j'ai passé beaucoup de temps à me rendre compte que j'avais atteint une limite de mails envoyés
Tout ça pour dire que même un soutient moral serait le bienvenu, hehe

Je vous remercie énormément !
Et je suis à votre service pour des précisions, le site que je fais est le sujet d'un stage, je suis bloqué, j'attends vos réponses avec impatience !

Re: Mail avec pièce jointe vide ou non selon FAI...

Posté : 24 juin 2011, 03:41
par devlop78
Tourne-toi vers des librairies telles que PHPMailer. Cela peut sembler contourner le problème, c'est en partie en vrai, mais la réalité est que l'envoi de mail est assez complexe, la lecture encore plus, et que des librairies feront toujours mieux le boulot que toi même après avoir lu 50 forums et tutos, après avoir passé beaucoup de temps.

Et je le dis aussi par experience, j'avais fait un script qui envoyait des mails avec PJ, ça marchait "partout", mais de temps en temps des clients disaient qu'ils voyaient à la place de la pièce jointe un long paragraphe de caractères sans sens ... Chacun son boulot, j'ai utilisé la librairie, et je n'ai plus eu de mauvais retours. Ca devait pas être grand chose, mais à se niveau là, ce n'est pas utile de s'embêter.

Re: Mail avec pièce jointe vide ou non selon FAI...

Posté : 24 juin 2011, 16:27
par Serial_surfeuse
Je te remercie. Je t'ai écoutée : j'ai repris PHPmailer à tête reposée et c'est bon ! ;)

Par contre visiblement on ne peut pas "moduler" notre utilisation de PHPmailer, cad que je n'ai pas pu faire qqchose du genre :
-- début du code phpmailer --

if(isset($fichier_a_telecharger)){
$mail->AddAttachment($fichier_a_telecharger);
}

-- fin du code phpmailer --

Mais ce n'est qu'une parenthèse, tout a fini par marcher chez moi ! :)

Re: Mail avec pièce jointe vide ou non selon FAI...

Posté : 24 juin 2011, 16:51
par Yosh
if(isset($fichier_a_telecharger)){
$mail->AddAttachment($fichier_a_telecharger);
}
Oula,

Je te conseil de regarder plutôt la fonction is_file

Re: Mail avec pièce jointe vide ou non selon FAI...

Posté : 30 oct. 2011, 20:15
par acidenitr0s
Salut voici comment faire:

le fichier php qui sert a envoyer le mail avec pièce jointe:
<html>
<body>
<div align="center">
<?
$name_file = $_FILES['monfichier']['name']; 
$source=$_FILES['monfichier']['tmp_name'];

move_uploaded_file($source, "./".$name_file); 

$extension=get_extension($name_file);

$type="text/plain";
if($type=="doc")
{
   $type="text/vnd.ms-word";
}
else if($type=="xls")
{
   $type="text/vnd.ms-excel";
}

$type2="image/png";

if($extension=="gif")
{
   $type2="image/gif";
}
else if($extension=="bmp")
{
   $type2="image/bmp";
}

function get_extension($filename)
{
   $parts = explode('.',$filename);
   $last = count($parts) - 1;
   $ext = $parts[$last];
   return $ext;
}

//----------------------------------
// Construction de l'entête
//----------------------------------

if($_POST['to']!="")
{
$boundary = "-----=".md5(uniqid(rand()));
$header = "MIME-Version: 1.0\r\n";
$header .= "Content-Type: multipart/mixed; boundary=\"$boundary\"\r\n";
$header .= "\r\n";

$msg = "Je vous informe que ceci est un message au format MIME 1.0 multipart/mixed.\r\n";

$msg .= "--$boundary\r\n";

$msg .= "Content-Type: $type; charset=\"iso-8859-1\"\r\n";
$msg .= "Content-Transfer-Encoding:8bit\r\n";
$msg .= "\r\n";
$msg .= $_POST['message'];
$msg .= "\r\n";

if($name_file!="")
{
$file = $name_file;
$fp = fopen($file, "r");  
$attachment = fread($fp, filesize($file));
fclose($fp);

$attachment = chunk_split(base64_encode($attachment));


$msg .= "--$boundary\r\n";
$msg .= "Content-Type: $type2; name=\"$file\"\r\n";
$msg .= "Content-Transfer-Encoding: base64\r\n";
$msg .= "Content-Disposition: inline; filename=\"$file\"\r\n";
$msg .= "\r\n";
$msg .= $attachment . "\r\n";
$msg .= "\r\n\r\n";
$msg .= "--$boundary--\r\n";
}

$destinataire = $_POST['to'];
$expediteur   = $_POST['from'];
$reponse      = $expediteur;

mail($destinataire, $_POST['sujet'], $msg,
     "Reply-to: $reponse\r\nFrom: $expediteur\r\nNom: $nom/r/n".$header);

}

if($name_file!="")
{
unlink($name_file);
}
echo "Mail envoyer";
print("<br>\n");
echo "<a href=.... >Retour a L'Accueil</a>";
?>
</div>
</body>
</html>
ce script marche chez moi pour la pièce jointe mais ne marche pas pour les informations du formulaire par exemple dans mon cas le nom la clef le mail de la personne.

Re: Mail avec pièce jointe vide ou non selon FAI...

Posté : 31 mai 2012, 01:22
par Invité
merci pour votre code , vous me sauvez !

Re: Mail avec pièce jointe vide ou non selon FAI...

Posté : 31 mai 2012, 02:04
par AB
Pour info il y a cette ligne qui fait que certains fichiers images assez lourds pourront ne pas être téléchargés
$attachment = chunk_split(base64_encode($attachment));

En effet cela prends beaucoup de place en mémoire de coder une image en base64 (mais pas moyen de faire autrement pour envoyer une pièce jointe dans un mail). Ce qui fait que souvent la capacité à envoyer une image en pièce jointe est très inférieure à la possibilité de télécharger l'image sur le serveur (qui dépend de la configuration "upload_max_filesize").

Il peut par ailleurs y avoir des limitations différentes du serveur de mail suivant l'hébergeur...

Bref rien ne vaut des tests une fois le script en place.