Bonjour. je suis en train de faire un site internet pour une entreprise, dans lequel je propose de déposer son CV et sa lettre de motivation après avoir rempli un formulaire. J'ai malheureusement, des soucis pour envoyer les pièces jointes.
Mon code utilise 3 fichiers. Le premier, candidature.php, comporte tout le code html, et l'appelle aux fonctions principales. Le code est effectué dans une classe CCandidature. Les fonctions mail sont dans une 'librairie' car elles seront réutilisées par la suite.
Pour plus de clarté, j'ai écris deux fonctions, une pour envoyer des mails, sans pièces jointes, et l'autre avec.

Voila le code des fonctions et leur appelle :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
 
/* Envoi de mails sans pieces jointes */
  function envoi_mail_sans_pj($P_expediteur, $P_destinataire, $P_reponse, $P_smtp, $P_objet, $P_texte)
    {
 
        $rapport=true;   // sert a verifier si tout c'est bien passé
 
        $objet=$P_objet;
        $mail=$P_texte;
        $expediteur=$P_expediteur;
        $destinataire=$P_destinataire;
        $reponse=$P_reponse;
        $smtp=$P_smtp;
 
        if(ini_set("sendmail_from",$expediteur)==false)
        {
            $rapport=false;
        }
        else
        {
            if (ini_set("SMTP",$smtp)==false)
            {
                $rapport=false;
            }
            else
            {
                $entete = "De: ".$expediteur."\r\n Repondre à : ".$reponse."\r\n X-Mailer: PHP/" . phpversion();
                if ($destinataire !="")
                {
                    if (@mail($destinataire, $objet, $mail, $entete)==false)
                    {
                        $rapport=false;
                    }
                }
                else
                {
                     $rapport=false;
                }
            }
        }
        return $rapport;
 
    }
Cette fonction fonctionne très bien.
Elle est appelée :


Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
 
    $objet="Candidature spontanée";
    $mail="corps du mail";
    $expediteur="x.xxxxx@xxxxx.xxx";
    $destinataire="xxxxx@xxxxx.xxxx";
    $reponse="reponse@xxxxxxxx.xxx";
    $smtp="smtp.orange.fr";
 
    envoi_mail_avec_pj($expediteur, $destinataire, $reponse, $smtp, $objet, $mail);
Voici maintenant la focntion qui envoi aussi des pièces jointes :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
function envoi_mail_avec_pj($P_expediteur, $P_destinataire, $P_reponse, $P_smtp, $P_objet, $P_texte, $P_pj)
    {
        $rapport=true;
 
        $boundary = md5(uniqid(microtime(), TRUE));
 
        $objet=$P_objet;
        $expediteur=$P_expediteur;
        $destinataire=$P_destinataire;
        $reponse=$P_reponse;
        $smtp=$P_smtp;
        $pj=$P_pj;
 
 
        if(ini_set("sendmail_from",$expediteur)==false)
        {
            $rapport=false;
        }
        else
        {
            if (ini_set("SMTP",$smtp)==false)
            {
                $rapport=false;
            }
            else
            {
                $entete = "De: ".$expediteur."\r\n Repondre à : ".$reponse."\r\n X-Mailer: PHP/" . phpversion();
                $entete .= 'Mime-Version: 1.0'."\r\n";
                $entete .= 'Content-Type: multipart/mixed;boundary='.$boundary."\r\n";
                $entete .= "\r\n";
                if ($destinataire !="")
                {
 
                    /* code pour envoyer une piece jointe */
 
                    echo $pj;
                    if (file_exists($pj))
                    {
                        $pj_type = filetype($pj);
                        $pj_size = filesize($pj);
                        echo $pj_size.$pj_type;
 
                        $handle = fopen($pj, 'r') or die('File '.$pj.'can t be open');
                        $content = fread($handle, $pj_size);
                        $content = chunk_split(base64_encode($content));
                        $f = fclose($handle);
 
                        $mail .= '--'.$boundary."\r\n";
                        $mail .= 'Content-type:'.$pj_type.';name='.$pj."\r\n";
                        $mail .= 'Content-transfer-encoding:base64'."\r\n";
                        $mail .= $content."\r\n";
                    }
 
                    $mail .= '--'.$boundary."\r\n";
                    /* fin du code de la piece jointe */
 
                    if (@mail($destinataire, $objet, $mail, $entete)==false)
                    {
                        $rapport=false;
                    }
                }
                else
                {
                     $rapport=false;
                }
            }
        }
        return $rapport;
    }
Je l'appele ainsi :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
 
    $objet="Candidature spontanée";
    $mail="corps du mail";
    $expediteur="xxxxxx@xxxxxx.xxxx";
    $destinataire="xxxxxxxxx@xxxxxxxx.xxxx";
    $reponse="reponse@xxxxxxxxx.xxx";
    $smtp="smtp.orange.fr";
 
    envoi_mail_avec_pj($expediteur, $destinataire, $reponse, $smtp, $objet, $mail, "_Documents/".$this->cv['name']);
je recoit bel et bien mon mail, cependant, il me donne deux pièces jointes au lieu d'une. la première est bien celle voulue, la seconde est "partie 1.2".

De plus, lorsque j'essai d'ouvrir la premiere, adobe affiche un message
"Adobe reader n'a pas pu ouvrir xxxxx.pdf car le type de fichier n'est pas pris en charge ou le fichier est endommagé (il a été envoyé en tant que pièsce jointe et n'a pas été décodé correctement, par exemple).
Je précise que : "_Documents/".$this->cv['name'] correspond au chemin ou aller chercher le fichier sur le serveur. Dans mes tests $this->cv['name']="test.pdf".

je ne comprends pas d'où ça viens.