Précédent   Forum des professionnels en informatique > PHP > Langage > Débuter
Débuter Forum d'entraide pour débuter en PHP. Avant de poster -> Cours PHP, FAQ PHP, Outils PHP, etc.
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 01/04/2011, 19h11   #1
Débutant
 
Homme Laurent
Webmaster
Inscription : octobre 2006
Messages : 2 873
Détails du profil
Informations personnelles :
Nom : Homme Laurent
Âge : 48
Localisation : France, Isère (Rhône Alpes)

Informations professionnelles :
Activité : Webmaster
Secteur : Industrie

Informations forums :
Inscription : octobre 2006
Messages : 2 873
Points : 1 320
Points : 1 320
Par défaut plusieurs fichiers attachés dans un mail

Bonsoir,

j'ai un code qui me permet de mettre un fichier attaché dans un mail, mais je voudrais en mettre 3, donc comment faire ? Je mets le code PHP (c'est l'action du formulaire HTML dans lequel on sélectionne notamment les fichiers à attacher) :
Code :
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
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
<?php  
 
if ($_FILES['file']['name'] != "") $fichier=1; else $fichier=0;
//init des var retournées par le form html
$nomprenom=$_POST['nomprenom'];
...
 
$msg="test";
 
if ($fichier=="1") {
	$chemin_destination = './';	
	$nom=$_FILES['file']['name'];
	$res_upload=move_uploaded_file($_FILES['file']['tmp_name'], $nom);
	$adr_file=$chemin_destination.$nom;
	}
 
 
//-----------------------------------------------
	//DECLARE LES VARIABLES
	//-----------------------------------------------
	exp="...";
 
	$email_expediteur=$exp;
	$email_reply=$exp;
	$destinataire=$exp;
 
	$frontiere = '-----=' . md5(uniqid(mt_rand()));
 
	//-----------------------------------------------
	//HEADERS DU MAIL
	//-----------------------------------------------
 
	$headers = 'From: "Nom" <'.$email_expediteur.'>'."\n";
	$headers.= 'Return-Path: <'.$email_reply.'>'."\n";
	$headers.= 'MIME-Version: 1.0'."\n";
	if ($fichier=="0") {
	$headers.='Content-Type: text/html; charset="ISO-8859-1"'."\n";
	}
 
	if ($fichier=="1") {	
	$headers.= 'Content-Type: multipart/mixed; boundary="'.$frontiere."\"\n\n";
 
	//-----------------------------------------------
	//MESSAGE
	//-----------------------------------------------
 
	$message ='This is a multi-part/mixed message in MIME format.'."\n";
	$message.='--'.$frontiere."\n";
	$message.='Content-Type: text/html; charset="ISO-8859-1"'."\n";
	$message.='Content-Transfer-Encoding: base64'."\n\n";
 
	$message.=chunk_split(base64_encode(nl2br($msg)))."\n";
 
	//-----------------------------------------------
	//PIECE JOINTE
	//-----------------------------------------------
 
$nom=$_FILES['file']['name'];
$base=basename($nom);
$pathinfo= pathinfo($nom);
$ext=$pathinfo['extension'];
 
 
$ext=strtolower($ext); // on ne passe l'extension en minuscules que pour le test, mais ds le mail on laisse l'extension
 
switch ($ext) {
case "toto": $mime="pouet/pouet"; break;
...
default: echo "extension non pr&eacute;vue<br>";
}
 
	$message.='--'.$frontiere."\n";
	$message.= 'Content-Type: '.$mime.'; name='.$base."\n";
	$message.= 'Content-Transfer-Encoding: base64'."\n";
	$message.= 'Content-Disposition:attachement; filename='.$base."\n\n";
	$message.= chunk_split(base64_encode(file_get_contents($adr_file)))."\n";
	$message.='--'.$frontiere.'--'."\n";}
	else $message=$msg;
 
	$sujet="formulaire";
 
    @mail($destinataire,$sujet,$message,$headers);
 
	if ($fichier=="1") unlink($chemin_destination.$nom);
 
?>
laurentSc est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/04/2011, 19h52   #2
Membre Expert
 
Inscription : septembre 2010
Messages : 1 242
Détails du profil
Informations forums :
Inscription : septembre 2010
Messages : 1 242
Points : 1 564
Points : 1 564
Pour l'upload de fichiers multiples, utilises la syntaxe avec tableaux comme dans l'exemple du manuel

Ensuite tu liste ton tableau pour récupérer les fichiers joints et pour chacun d'entre eux, dans ta boucle tu génère une frontière et le reste.
Code :
1
2
3
4
5
	$message.='--'.$frontiere."\n";
	$message.= 'Content-Type: '.$mime.'; name='.$base."\n";
	$message.= 'Content-Transfer-Encoding: base64'."\n";
	$message.= 'Content-Disposition:attachement; filename='.$base."\n\n";
	$message.= chunk_split(base64_encode(file_get_contents($adr_file)))."\n";
__________________
- Réalisations
- Interface graphique : génération en javascript d'objets défilants, texte et/ou images, mode horizontal ou vertical.
ABCIWEB est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/04/2011, 21h41   #3
Débutant
 
Homme Laurent
Webmaster
Inscription : octobre 2006
Messages : 2 873
Détails du profil
Informations personnelles :
Nom : Homme Laurent
Âge : 48
Localisation : France, Isère (Rhône Alpes)

Informations professionnelles :
Activité : Webmaster
Secteur : Industrie

Informations forums :
Inscription : octobre 2006
Messages : 2 873
Points : 1 320
Points : 1 320
Une question : je crois qu'il faut mettre entre chaque fichier joint la frontière suivante :
Code :
$message.='--'.$frontiere."\n";
et seulement tout à la fin la frontière de fin :
Code :
$message.='--'.$frontiere.'--'."\n";
Est-ce bien ça ?
laurentSc est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/04/2011, 22h44   #4
Membre Expert
 
Inscription : septembre 2010
Messages : 1 242
Détails du profil
Informations forums :
Inscription : septembre 2010
Messages : 1 242
Points : 1 564
Points : 1 564
Citation:
Envoyé par laurentSc Voir le message
Une question : je crois qu'il faut mettre entre chaque fichier joint la frontière suivante :
Code :
$message.='--'.$frontiere."\n";
et seulement tout à la fin la frontière de fin :
Code :
$message.='--'.$frontiere.'--'."\n";
Est-ce bien ça ?
Oui il en faut une entre chaque fichier, par contre je ne me souviens pas que la frontière de fin soit utile. Mais tu pourras toujours la rajouter si ça ne fonctionne pas comme prévu.
__________________
- Réalisations
- Interface graphique : génération en javascript d'objets défilants, texte et/ou images, mode horizontal ou vertical.
ABCIWEB est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/04/2011, 23h50   #5
Débutant
 
Homme Laurent
Webmaster
Inscription : octobre 2006
Messages : 2 873
Détails du profil
Informations personnelles :
Nom : Homme Laurent
Âge : 48
Localisation : France, Isère (Rhône Alpes)

Informations professionnelles :
Activité : Webmaster
Secteur : Industrie

Informations forums :
Inscription : octobre 2006
Messages : 2 873
Points : 1 320
Points : 1 320
J'ai essayé de le faire, mais il n'y a aucun fichier joint ; où est mon erreur ?

Code :
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
	$chemin_destination = './';	
 
	for ($i=0;$i<3;$i++)
	 {
	switch($i) {
	case 0 :
	if (isset($_FILES['file[0]']['tmp_name'])) {
	move_uploaded_file($_FILES['file[0]']['tmp_name'], $chemin_destination.$_FILES['file[0]']['name']);
	$adr_file0=$chemin_destination.$_FILES['file[0]']['name'];};break;
	case 1:
..idem..
	case 2:
..idem..	}
	}
...
 
	if (isset($_FILES['file[0]']['tmp_name'])) {
	$base0=basename($adr_file0);
 
	$message.='--'.$frontiere."\n";
	$message.= 'Content-Type: image/jpeg; name='.$base0."\n";
	$message.= 'Content-Transfer-Encoding: base64'."\n";
	$message.= 'Content-Disposition:attachement; filename='.$base0."\n\n";
	$message.= chunk_split(base64_encode(file_get_contents($adr_file0)))."\n";
}
idem pour les 2 autres
et à la fin :
if ((isset($_FILES['file[0]']['tmp_name']))||(isset($_FILES['file[1]']['tmp_name']))||(isset($_FILES['file[2]']['tmp_name'])))
	$message.='--'.$frontiere."--\n";
 
 
	mail($destinataire,$sujet,$message,$headers);
(j'ai aussi essayé sans la frontière de fin)
laurentSc est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/04/2011, 00h07   #6
Membre Expert
 
Avatar de Eric2a
 
Homme Eric Garidacci
Inscription : septembre 2005
Messages : 1 057
Détails du profil
Informations personnelles :
Nom : Homme Eric Garidacci
Âge : 41

Informations forums :
Inscription : septembre 2005
Messages : 1 057
Points : 1 564
Points : 1 564
Salut,

Jette un oeil sur ce post.
__________________

N'oubliez pas le vote des messages utiles ainsi que le Tag [Résolu].

Mon Site Web : Corse - Actualité, Météo, Vidéos, Logiciels, ...
Eric2a est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/04/2011, 00h44   #7
Débutant
 
Homme Laurent
Webmaster
Inscription : octobre 2006
Messages : 2 873
Détails du profil
Informations personnelles :
Nom : Homme Laurent
Âge : 48
Localisation : France, Isère (Rhône Alpes)

Informations professionnelles :
Activité : Webmaster
Secteur : Industrie

Informations forums :
Inscription : octobre 2006
Messages : 2 873
Points : 1 320
Points : 1 320
Super, 5' et j'ai envoyé 2 fichiers joints (le répertoire "uploads", je l'avais oublié, mais il existait déjà, comme j'avais déjà fait le code pour envoyer un seul fichier). Par contre, je n'ai pour l'instant rien fait d'autre (fichiers .htaccess...) ; on verra demain ; il fera jour
laurentSc est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/04/2011, 06h44   #8
Membre Expert
 
Inscription : septembre 2010
Messages : 1 242
Détails du profil
Informations forums :
Inscription : septembre 2010
Messages : 1 242
Points : 1 564
Points : 1 564
En admettant que tu récupère les attachements, types de fichiers et nom de fichiers dans des tableaux, ta boucle pourrait ressembler à ceci :
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
			for($i=0; $i < count($_FILES['userfile']['name']); $i++)
				{
				$error = $_FILES['userfile']['error'][$i];
 
				if ($error == 0 && isset($_FILES['userfile']['tmp_name'][$i]) && is_uploaded_file($_FILES['userfile']['tmp_name'][$i]))
					{
 
					$attachment[] = chunk_split(base64_encode(file_get_contents($_FILES['userfile']['tmp_name'][$i])));
 
					$ftype[] = $_FILES['userfile']['type'][$i];
					$fname[] = $_FILES['userfile']['name'][$i];
					unset($_FILES['userfile']['tmp_name'][$i]);
					}
				}
pas besoin de "move_uploaded_file", ni de répertoire d'upload ou encore de .htaccess. Le fichier est simplement uploadé dans les fichiers temporaires du serveur puis lu (avec file_get_contents) et joint au mail.
__________________
- Réalisations
- Interface graphique : génération en javascript d'objets défilants, texte et/ou images, mode horizontal ou vertical.
ABCIWEB est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/04/2011, 12h09   #9
Débutant
 
Homme Laurent
Webmaster
Inscription : octobre 2006
Messages : 2 873
Détails du profil
Informations personnelles :
Nom : Homme Laurent
Âge : 48
Localisation : France, Isère (Rhône Alpes)

Informations professionnelles :
Activité : Webmaster
Secteur : Industrie

Informations forums :
Inscription : octobre 2006
Messages : 2 873
Points : 1 320
Points : 1 320
Pour une raison un peu compliquée à expliquer, je souhaite effectivement ne pas avoir à créer un répertoire "uploads". Par contre, ABCIWEB, comme je n'arrive pas à utiliser ton code, j'ai tenté de modifier celui de ERIC2A : j'ai d'abord enlevé "UPLOADS", donc on uploade dans le même répertoire que le code. Par contre, pour ne pas polluer, après l'envoi du mail, je voudrais effacer les fichiers : c'est là que je coince ; ma boucle est la suivante :
Code :
1
2
3
4
5
6
7
8
9
10
11
12
	if(Envoi_mail($Email,$to,$Objet,$mixfiles)) {
		$message='Votre demande a été envoyée';
		$count=count($_FILES['userfile']['tmp_name']);
		for($i=0;$i<$count;$i++){
		echo "error=".$_FILES['userfile']['error'][$i]."<br>";
		if($_FILES['userfile']['error'][$i]==UPLOAD_ERR_OK){
		    $file=basename($_FILES['userfile']['name'][$i]);
 
			unlink($file);
			}
		}
		}
sachant que un peu plus haut, il y a
Code :
$file=basename($_FILES['userfile']['name'][$i]);
et que le fichier est dans le répertoire courant. Cela dit, le fichier n'est pas effacé. Pourquoi ?
laurentSc est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/04/2011, 13h54   #10
Débutant
 
Homme Laurent
Webmaster
Inscription : octobre 2006
Messages : 2 873
Détails du profil
Informations personnelles :
Nom : Homme Laurent
Âge : 48
Localisation : France, Isère (Rhône Alpes)

Informations professionnelles :
Activité : Webmaster
Secteur : Industrie

Informations forums :
Inscription : octobre 2006
Messages : 2 873
Points : 1 320
Points : 1 320
J'ai trouvé le problème, et bien que ne comprenant pourquoi on a ça, l'ai résolu : avec le script de Eric2A, les underscores des noms de fichier sont supprimés quand on l'uploade et pas dans la variable $_FILES['userfile']['name'][$i]. Comme je me sers de cette variable pour faire le unlink, il faut d'abord retirer dedans les underscores...
laurentSc est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/04/2011, 14h13   #11
Membre Expert
 
Avatar de Eric2a
 
Homme Eric Garidacci
Inscription : septembre 2005
Messages : 1 057
Détails du profil
Informations personnelles :
Nom : Homme Eric Garidacci
Âge : 41

Informations forums :
Inscription : septembre 2005
Messages : 1 057
Points : 1 564
Points : 1 564
Oui, en simplifiant la boucle qui récupère les infos des fichiers téléversés comme ceci par exemple :
Code :
1
2
3
4
5
6
7
8
9
10
11
12
 
$count=count($_FILES['userfile']['tmp_name']);
for($i=0;$i<$count;$i++){
	if($_FILES['userfile']['error'][$i]==UPLOAD_ERR_OK && is_uploaded_file($_FILES['userfile']['tmp_name'][$i])){
		$tab=array();
		$tab['name']=$_FILES['userfile']['name'][$i];
		$tab['size']=$_FILES['userfile']['size'][$i];
		$tab['type']=$_FILES['userfile']['type'][$i];
		$mixfiles[]=$tab;
		$mix=true;
	}
}
Elle prend tout type de fichier (quelque soit le nom) et... reste compatible avec la fonction envoi_Mail().


Maintenant, il faut savoir que les fichiers temporaires sont supprimés une fois le script terminé.
__________________

N'oubliez pas le vote des messages utiles ainsi que le Tag [Résolu].

Mon Site Web : Corse - Actualité, Météo, Vidéos, Logiciels, ...
Eric2a est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/04/2011, 14h27   #12
Débutant
 
Homme Laurent
Webmaster
Inscription : octobre 2006
Messages : 2 873
Détails du profil
Informations personnelles :
Nom : Homme Laurent
Âge : 48
Localisation : France, Isère (Rhône Alpes)

Informations professionnelles :
Activité : Webmaster
Secteur : Industrie

Informations forums :
Inscription : octobre 2006
Messages : 2 873
Points : 1 320
Points : 1 320
Je viens de comprendre où sont retirés les underscores ; ici :
Code :
$file=preg_replace('/([^.a-z0-9-\(\)]+)/i','',$file);
laurentSc est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/04/2011, 21h17   #13
Membre Expert
 
Inscription : septembre 2010
Messages : 1 242
Détails du profil
Informations forums :
Inscription : septembre 2010
Messages : 1 242
Points : 1 564
Points : 1 564
Citation:
Envoyé par laurentSc Voir le message
... sachant que un peu plus haut, il y a
Code :
$file=basename($_FILES['userfile']['name'][$i]);
et que le fichier est dans le répertoire courant. Cela dit, le fichier n'est pas effacé. Pourquoi ?
Le fichier temporaire sur le serveur porte le nom... du fichier temporaire
Il faut donc faire le unlink sur $_FILES['userfile']['tmp_name'][$i].
Mais évidemment il faut le faire après avoir récupéré et encodé son contenu avec chunk_split(base64_encode(file_get_contents($_FILES['userfile']['tmp_name'][$i])));
__________________
- Réalisations
- Interface graphique : génération en javascript d'objets défilants, texte et/ou images, mode horizontal ou vertical.
ABCIWEB est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/04/2011, 23h15   #14
Débutant
 
Homme Laurent
Webmaster
Inscription : octobre 2006
Messages : 2 873
Détails du profil
Informations personnelles :
Nom : Homme Laurent
Âge : 48
Localisation : France, Isère (Rhône Alpes)

Informations professionnelles :
Activité : Webmaster
Secteur : Industrie

Informations forums :
Inscription : octobre 2006
Messages : 2 873
Points : 1 320
Points : 1 320
Tu as raison, mais comme j'aime me compliquer la vie , j'ai fait ça :
Code :
1
2
3
		    $file=basename($_FILES['userfile']['name'][$i]);
			$file=preg_replace('/([^.a-z0-9-\(\)]+)/i','',$file);
			unlink($file);
laurentSc est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/04/2011, 23h26   #15
Membre Expert
 
Inscription : septembre 2010
Messages : 1 242
Détails du profil
Informations forums :
Inscription : septembre 2010
Messages : 1 242
Points : 1 564
Points : 1 564
Ben oui mais tu ne supprime pas le fichier temporaire sur le serveur en faisant cela puisque le nom du fichier sur le serveur est $_FILES['userfile']['tmp_name'][$i].
Quand tu fais unlink($_FILES['userfile']['name'][$i]) cela ne correspond à rien puisqu'il n'y a aucun fichier portant ce nom sur le serveur.

Encore une fois le serveur à téléchargé un fichier qu'il a nommé $_FILES['userfile']['tmp_name'] et c'est lui que tu dois effacer.
__________________
- Réalisations
- Interface graphique : génération en javascript d'objets défilants, texte et/ou images, mode horizontal ou vertical.
ABCIWEB est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 01h25.


 
 
 
 
Partenaires

Hébergement Web