Envoie de mail avec pièce jointe

Résolu/Fermé
Sinistrus Messages postés 1017 Date d'inscription mercredi 12 décembre 2007 Statut Membre Dernière intervention 6 juin 2023 - 9 août 2018 à 14:02
Sinistrus Messages postés 1017 Date d'inscription mercredi 12 décembre 2007 Statut Membre Dernière intervention 6 juin 2023 - 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
}
?>


4 réponses

jordane45 Messages postés 38136 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 16 avril 2024 4 649
9 août 2018 à 15:17
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);
0
Sinistrus Messages postés 1017 Date d'inscription mercredi 12 décembre 2007 Statut Membre Dernière intervention 6 juin 2023 17
9 août 2018 à 16:57
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.
0
jordane45 Messages postés 38136 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 16 avril 2024 4 649
9 août 2018 à 17:16
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é.
0
Sinistrus Messages postés 1017 Date d'inscription mercredi 12 décembre 2007 Statut Membre Dernière intervention 6 juin 2023 17
9 août 2018 à 18:04
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
0
Sinistrus Messages postés 1017 Date d'inscription mercredi 12 décembre 2007 Statut Membre Dernière intervention 6 juin 2023 17
10 août 2018 à 16:27
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)) {
0
Sinistrus Messages postés 1017 Date d'inscription mercredi 12 décembre 2007 Statut Membre Dernière intervention 6 juin 2023 17
11 août 2018 à 00:41
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.
0