Menu

Envoie de mail avec pièce jointe [Résolu]

Messages postés
925
Date d'inscription
mercredi 12 décembre 2007
Dernière intervention
16 novembre 2018
- - Dernière réponse : Sinistrus
Messages postés
925
Date d'inscription
mercredi 12 décembre 2007
Dernière intervention
16 novembre 2018
- 11 août 2018 à 00:41
Bonjour,

Je rencontre un soucis avec l'envoie de mon mail avec pièces jointes...
Je ne reçois aucun message d'erreur, au contraire le mail dit être parti mais non, je ne reçois rien.
Le soucis est survenue quand j'ai ajouté le script pour gérer les pièces jointes.
Pouvez-vous m'aider svp ?
<?php
$_F = '-----=' . md5(uniqid(mt_rand()));
$_N = "\n";

if (isset($_POST['Envoyer'])) {
    
    foreach ($_POST as $var => $val) {
        if (!is_array($val)) {
            $$var = strip_tags($val);
        } else {
            while (list($arvar, $arval) = each($val)) {
                $$var[$arvar] = strip_tags($arval);
            }
        }
    }
    
    $_D = "_fichiers/";
    @mkdir($_D0, 0777, true);
    $_E = array(
        '.doc',
        '.docx',
        '.pdf',
        '.txt'
    );
    $_M = 52428800;
    
    $Fr_File = !empty($_FILES['Fr_Importer']) ? $_FILES['Fr_Importer'] : NULL;
    
    if (!in_array(strrchr($Fr_File['name'], '.'), $_E)) {
        $ERREUR .= "Vous devez uploader un fichier de type doc, docx ou pdf...";
    }
    if ($Fr_File['size'] > $_M) {
        $ERREUR .= "La taille maximale du fichier ne doit pas dépasser 50Mo";
    }
    if (!move_uploaded_file($Fr_File['tmp_name'], $_D . $Fr_File['name'])) {
        $ERREUR .= "Erreur lors de l'upload du fichier.";
    } else {
        $Fr_File['name'] = $_D . $Fr_File['name'];
    }
    
    if (file_exists($Fr_File['name'])) {
        $file           = fopen($Fr_File['name'], "r");
        $contents       = fread($file, filesize($Fr_File['name']));
        $encoded_attach = chunk_split(base64_encode($contents));
        fclose($file);
    }
    
    if ($ERREUR == "") {
        
        $Sujet = "Mon objet";
        
        // Entête du message
        $Header = "From:monmail@mail.com" . $_N;
        $Header .= 'MIME-Version: 1.0' . $_N;
        $Header .= 'Content-Type: multipart/mixed; boundary=' . $_F . $_N;
        $Header .= '--' . $_F . $_N;
        
        // Première pièce jointe
        $Header .= "Content-type: {\"application/octet-stream\"}; name=" . $Fr_File['name'] . $_N;
        $Header .= "Content-Length:" . filesize($Fr_File['name']) . $_N;
        $Header .= "Content-transfer-Encoding: BASE64" . $_N;
        $Header .= "Content-disposition: attachment; filename=" . $Fr_File['name'] . $_N;
        $Header .= $encoded_attach . '--' . $_F . $_N;
        
        // Encodage pour le HTML
        $Header .= "Content-Type: text/html; charset=\"ISO-8859-1\"" . $_N;
        $Header .= "Content-Transfer-Encoding: 8bit" . $_N;
        
        $Body = nl2br($Fr_Message);
        
        if (mail($DESTINATION, stripslashes($Sujet), stripslashes($Body), $Header)) {
            $MAIL_OK = "true";
            
        } else {
            $ERREUR .= $CONTACT_MAIL_NO;
        }
    }
}
?>

<?php
if ($MAIL_OK == "true") {
    echo "Mail envoyé avec succès";
} else {
?>

<form id="Form" name="Form" action="<?php
    echo $_SERVER['PHP_SELF'];
?>" method="POST" enctype="multipart/form-data" >

<?php
    if ($ERREUR) {
        echo "Message d'erreur";
    }
?>

<input type="file" class="custom-file-input" id="Fr_Importer" name="Fr_Importer" multiple>
<br>
<textarea name="Fr_Message" required id="Fr_Message"><?php
    echo $Fr_Message;
?></textarea>
<br>
<button class="btn btn-primary btn-lg" name="Envoyer" type="submit">Envoyer</button>

</form>

<?php
}
?>


Afficher la suite 

Votre réponse

4 réponses

Messages postés
23628
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
16 décembre 2018
0
Merci
Bonjour,

Commence par faire un ECHO de tes différentes variables ($DESTINATION, stripslashes($Sujet), stripslashes($Body), $Header) pour voir si elles sont conformes à ce que tu penses....

Pense aussi à regarder dans ton dossier SPAM au cas où et/où à tester sur une autre boite mail.

Par contre, le code pour les PJ.. ça se met dans le body et pas le header non ? (je ne sais pas si ça fonctionne dans le header...)
// Première pièce jointe
        $Body  = "Content-Type: application/octet-stream; name=" . basename($Fr_File['name']) . $_N;
        $Body .= "Content-Length:" . filesize($Fr_File['name']) . $_N;
        $Body .= "Content-disposition: attachment; filename=" . basename($Fr_File['name']) . $_N;
        $Body .= "Content-transfer-Encoding: base64\n\n";
        $Body .= $encoded_attach . '--' . $_F . $_N;
      $Body  .= nl2br($Fr_Message);
Commenter la réponse de jordane45
Messages postés
925
Date d'inscription
mercredi 12 décembre 2007
Dernière intervention
16 novembre 2018
0
Merci
Bonjour jordan,

Dest :
mail@mail.com

Suje :
Lorem ipsum

Body :
Content-type: {"application/octet-stream"}; name=_fichiers/aaa.txt Content-Length:11 Content-transfer-Encoding: BASE64 Content-disposition: attachment; filename=_fichiers/aaa.txt VGVzdCBy6XVzc2k= -------=531aade08d58129d691f783645146ce3 Content-Type: text/html; charset="ISO-8859-1" Content-Transfer-Encoding: 8bit
Lorem ipsum

Header :
From:Lorem ipsum MIME-Version: 1.0 Content-Type: multipart/mixed; boundary=-----=531aade08d58129d691f783645146ce3 -------=531aade08d58129d691f783645146ce3 


Rien dans les spams, et j'ai tenté le coup aussi avec les
$body.=
, aucune erreur, message de validation, fichier uploadé sur le serveur mais aucun mail.
jordane45
Messages postés
23628
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
16 décembre 2018
-
Au cas où tu ne l'aurais pas vu... j'avais fait quelques modifications dans le code... tu n'as fait que reprendre le tient visiblement....
Essaye avec celui que je t'ai donné.
Commenter la réponse de Sinistrus
Messages postés
925
Date d'inscription
mercredi 12 décembre 2007
Dernière intervention
16 novembre 2018
0
Merci
Pareil, j'ai toujours le texte de validation et le fichier dans le serveur, mais rien par mail ni dans les spam :

Dest :
mail@mail.com

Suje :
Lorem ipsum

Body :
Content-Type: application/octet-stream; name=aaa.txt Content-Length:11 Content-disposition: attachment; filename=aaa.txt Content-transfer-Encoding: base64 VGVzdCBy6XVzc2k= -------=d3267b8abeaa6c4cc847c4a3bdd615f0
Lorem ipsum

Head :
From:Lorem ipsum MIME-Version: 1.0 Content-Type: multipart/mixed; boundary=-----=d3267b8abeaa6c4cc847c4a3bdd615f0 -------=d3267b8abeaa6c4cc847c4a3bdd615f0
Commenter la réponse de Sinistrus
Messages postés
925
Date d'inscription
mercredi 12 décembre 2007
Dernière intervention
16 novembre 2018
0
Merci
Après avoir cherché un peu partout je suis tombé sur un article d'openclassrooms
(https://openclassrooms.com/fr/courses/1156346-e-mail-envoyer-un-e-mail-en-php)
J'ai suivi les instructions (je crois) :

- Je reçois la pièce jointe conforme (maintenant)
- Je reçois un fichier supplémentaire "mime-attachment"( je ne sais pourquoi)
- Le corps du mail est quand à lui "vide"...

Voici le code en question et merci encore pour ton aide :
$_Folder	= "_fichiers/"; @mkdir ($_Folder,0777,true);
$_Extent  	= array('.doc','.docx','.pdf','.txt');
$_Maxims  	= 52428800;
$Fr_File	= !empty($_FILES['Fr_Importer']) ? $_FILES['Fr_Importer'] : NULL;

if(!in_array(strrchr($Fr_File['name'], '.'), $_Extent)) {
	$ERREUR.="Vous devez uploader un fichier de type doc, docx ou pdf...";
}

if ($Fr_File['size'] > $_Maxims) {
	$ERREUR.="La taille maximale du fichier ne doit pas dépasser 2Mo";
}

if (!move_uploaded_file($Fr_File['tmp_name'], $_Folder.$Fr_File['name'])) {
	$ERREUR.="Erreur lors de l'upload du fichier.";
} else {
	$Fr_File['name'] = $_Folder.$Fr_File['name'];
}

if(file_exists($Fr_File['name'])) {
$fichier     = fopen($Fr_File['name'], "r");
$attachement = fread($fichier, filesize($Fr_File['name']));
$attachement = chunk_split(base64_encode($attachement));
fclose($fichier);}

$boundary = "-----=".md5(rand());
$boundary_alt = "-----=".md5(rand());

$Sujet  = $Fr_Objet;

$Header = "From: \"".$Fr_Nom."\"<".$Fr_Email.">".$passage_ligne;
$Header.= "MIME-Version: 1.0".$passage_ligne;
$Header.= "X-Priority: 3".$passage_ligne;
$Header.= "Content-Type: multipart/mixed;".$passage_ligne." boundary=\"$boundary\"".$passage_ligne;

$Body = $passage_ligne."--".$boundary.$passage_ligne;
$Body.= "Content-Type: multipart/alternative;".$passage_ligne." boundary=\"$boundary_alt\"".$passage_ligne;
$Body.= $passage_ligne."--".$boundary_alt.$passage_ligne;

$Body.= "Content-Type: application/octet-stream; charset=\"ISO-8859-1\"".$passage_ligne;
$Body.= "Content-Transfer-Encoding: 8bit".$passage_ligne;
$Body.= $passage_ligne;
$Body.= nl2br($Fr_Message);
$Body.= $passage_ligne;

$Body.= $passage_ligne."--".$boundary_alt."--".$passage_ligne;
$Body.= $passage_ligne."--".$boundary.$passage_ligne;

$Body.= "Content-Type: application/octet-stream; name=".basename($Fr_File['name']).$passage_ligne;
$Body.= "Content-Length:".filesize($Fr_File['name']).$passage_ligne;
$Body.= "Content-Transfer-Encoding: base64".$passage_ligne;
$Body.= "Content-Disposition: attachment; filename=".basename($Fr_File['name']).$passage_ligne;
$Body.= $passage_ligne.$attachement.$passage_ligne.$passage_ligne;
$Body.= $passage_ligne."--".$boundary."--".$passage_ligne;

if(mail($DESTINATION, stripslashes(utf8_decode($Sujet)), stripslashes(utf8_decode($Body)), $Header)) {
Sinistrus
Messages postés
925
Date d'inscription
mercredi 12 décembre 2007
Dernière intervention
16 novembre 2018
-
Ligne 40 :
Remplacer :
$Body.= "Content-Type: application/octet-stream; charset=\"ISO-8859-1\"".$passage_ligne;

Par :
$Body.= "Content-Type: text/html; charset=\"ISO-8859-1\"".$passage_ligne;

Merci Jordan pour ton coup de pouce.
Commenter la réponse de Sinistrus