Forum Clubic

Pb mail et piece jointes

Salut !

J’ai trouver un script sur internet permettant d’envoyer un mail et une piece jointe

Le mail s’envoi, ds les client mail la piece jointe est visible mai le fichier fai 0Ko !!!

Voici le fichier qui envoi le mail :

[cpp] <?
/* Insert de la class qui envoie la pièce jointe */
require “CMailFile.php3”;

     /* Paramètres d'envoi du mail. */
     $newmail = new CMailFile($sujet,"revlam@tiscali.fr",$email,$message,$fichier,"base 64");
     $newmail->sendfile();

?>[/cpp]

Et la classe associée :

[cpp]<?

class CMailFile {
var $subject;
var $addr_to;
var $text_body;
var $text_encoded;
var $mime_headers;
var $mime_boundary = “–==================846811060==”;
var $smtp_headers;

    function CMailFile($subject,$to,$from,$msg,$filename,$mimetype = "application/octet-stream", $mime_filename = false) {
            $this->subject = $subject;
            $this->addr_to = $to;
            $this->smtp_headers = $this->write_smtpheaders($from);
            $this->text_body = $this->write_body($msg);
            $this->text_encoded = $this->attach_file($filename,$mimetype,$mime_filename);
            $this->mime_headers = $this->write_mimeheaders($filename, $mime_filename);
    }

    function attach_file($filename,$mimetype,$mime_filename) {
            $encoded = $this->encode_file($filename);
            if ($mime_filename) $filename = $mime_filename;
            $out = "--" . $this->mime_boundary . "\n";
            $out = $out . "Content-type: " . $mimetype . "; name=\"$filename\";\n";
            $out = $out . "Content-Transfer-Encoding: base64\n";
            $out = $out . "Content-disposition: attachment; filename=\"$filename\"\n\n";
            $out = $out . $encoded . "\n";
            $out = $out . "--" . $this->mime_boundary . "--" . "\n";
            return $out;

    }

    function encode_file($sourcefile) {
            if (is_readable($sourcefile)) {
                    $fd = fopen($sourcefile, "r");
                    $contents = fread($fd, filesize($sourcefile));
                    $encoded = my_chunk_split(base64_encode($contents));
                    fclose($fd);
            }
            return $encoded;
    }

    function sendfile() {
            $headers = $this->smtp_headers . $this->mime_headers;
            $message = $this->text_body . $this->text_encoded;
            mail($this->addr_to,$this->subject,$message,$headers);
    }

    function write_body($msgtext) {
            $out = "--" . $this->mime_boundary . "\n";
            $out = $out . "Content-Type: text/plain; charset=\"us-ascii\"\n\n";
            $out = $out . $msgtext . "\n";
            return $out;
    }

    function write_mimeheaders($filename, $mime_filename) {
            if ($mime_filename) $filename = $mime_filename;
            $out = "MIME-version: 1.0\n";
            $out = $out . "Content-type: multipart/mixed; ";
            $out = $out . "boundary=\"$this->mime_boundary\"\n";
            $out = $out . "Content-transfer-encoding: 7BIT\n";
            $out = $out . "X-attachments: $filename;\n\n";
            return $out;
    }

    function write_smtpheaders($addr_from) {
            $out = "From: $addr_from\n";
            $out = $out . "Reply-To: $addr_from\n";
            $out = $out . "X-Mailer: PHP3\n";
            $out = $out . "X-Sender: $addr_from\n";
            return $out;
    }

}

function my_chunk_split($str)
{
$stmp = $str;
$len = strlen($stmp);
$out = “”;
while ($len > 0) {
if ($len >= 76) {
$out = $out . substr($stmp, 0, 76) . “\r\n”;
$stmp = substr($stmp, 76);
$len = $len - 76;
}
else {
$out = $out . $stmp . “\r\n”;
$stmp = “”; $len = 0;
}
}
return $out;
}

?>[/cpp]

Si vous avez des idées ??

Au passage j’ai testé sur free et sur Lycos !!!

Personne ne sais ???

Je pensait que ca venait peut etre de l’encodage du fichier (base 64)…

Tjr rien ??? Meme pas des pistes ??

:frowning:

Pourquoi “Base 64”?

Bah ca je sai pas trop, le script été fait comme ca… et dc sachant pas ce que c’été j’ai laissé cette valeur par défault !

Mais j’ai pu faire une erreur a ce niveau la !! Tu sais a quoi cela correspond ds le script ??

base64 permet d’encoder les données du fichier pour les faires passers correctement au format MIME …

mais je ne pourrais pas trop t’aider, car j’utilise la class HTML Mime Mail pour mes envois d’email avec pièce jointe :confused:

question bête : le fichier à joindre est correct sur le serveur ? si c’est un fichier que tu envois via un formulaire, ce dernier est-il correct ? et fais-tu bien référence au fichier transféré ?

La valeur attendue par le script est le mime-type… Faut virer “base 64”

lol ok

Et c koi la valeur de mime-type ?

Désolé jsuis vrmt pas connaisseur en la matiere ! Mais si vous avez un liens qui explique les mime et compagnie jsuis preneur, j’ai soif de connaissance :slight_smile:

Voici la classe que j’utilise, ça peut peut-être t’aider :
Compatible fonction mail() et email() (si la première n’est pas activée sur le serveur)

[cpp]//----------------------------------------------------------------------
// Class d’envoi de mail
//----------------------------------------------------------------------

class sys_mail {

//-------------------
//sys_mail
//Class pour l'envoi de mail
//--
//Dernière modification : 13/01/2005 14:55:27
//-------------------

var $exp;
var $dest;
var $cc;
var $cci;
var $objet;
var $message;
var $html;
var $mail_corps; // Corps total du mail
var $mime_separateur_alter;
var $mime_separateur_mixed;
var $retour_charriot;
var $mail_type; // 0 = text/plain, 1 = multipart/alternative, 2 = multipart/mixed

function sys_mail($exp, $dest, $cc, $cci, $objet, $message, $html = false) {

	/** Initialisation des variables mères de la class **/
		$timehash = md5(uniqid(time()));
		$this->mime_separateur_alter = "----=Separateur_alternative_".$timehash;
		$this->mime_separateur_mixed = "----=Separateur_mixed_".$timehash;
		$this->retour_charriot = "\n"; // Doit prendre "\n" pour un OS Unix et "\r\n" pour un OS Windows //TODO: Détection automatique ?
	//--

	$this->exp = $exp;
	$this->dest = $dest;
	$this->cc = $cc;
	$this->cci = $cci;
	$this->objet = $objet;
	if($this->retour_charriot == "\n") { // Si on utilise le \n,
		$this->message = str_replace("\r\n", "\n", $message); // On remplace tous mes \r\n par des \n
	}
	else { // Sinon,
		$this->message = str_replace("\n", "\r\n", $message); // On fait l'inverse
	}
	$this->html = $html;
	if($this->html == true) { // Si le message du mail est en HTML
		$this->mail_type = 1; // On change le type du mail pour 'multipart/alternative'

		// Partie text/plain
		$this->mail_corps = $this->mime_separateur_alter.$this->retour_charriot;
		$this->mail_corps .= $this->create_text_block("Ce mail est au format HTML, pour le lire, il vous faut un logiciel de messagerie compatible avec les mails au format HTML" . $this->retour_charriot . 
			"Site de téléchargement des logiciels de messagerie Mozilla Mail et Thunderbird (produits gratuits de 'The Mozilla Organization') :" . $this->retour_charriot . 
			"http://www.mozilla.org/products/", 'plain');

		// Partie text/html
		$this->mail_corps .= $this->mime_separateur_alter.$this->retour_charriot;
		$this->mail_corps .= $this->create_text_block($this->message, 'html'); // On mets le message (qui est normallement en HTML)

	}
	else { // Sinon,
		$this->mail_type = 0; // On change le type du mail pour 'text/plain'
		$this->mail_corps = $this->message;
	}
}

function create_text_block($texte, $sub_type) {
	$return = "Content-Type: text/".$sub_type.";".$this->retour_charriot;
	$return .= "\tcharset=\"iso-8859-1\"".$this->retour_charriot;
	$return .= "Content-Transfer-Encoding: quoted-printable".$this->retour_charriot;
	$return .= $this->retour_charriot;
	$return .= $texte.$this->retour_charriot;
	$return .= $this->retour_charriot;
	$return .= "--";
	return $return;
}

function attacher($fichier, $fichier_type = false) {
	// Adaptation du corps du mail si il était en 'multipart/alternative', car il faut mettre cette couche dans une couche de type 'multipart/mixed' qui va creer une sous-couche 'multipart/alternative' pour mettre le corps précedent
	if($this->mail_type == 0) { // Si le fichier est déjà de type 'text/plain'
		// Création du bloc 'text/plain' au sein du corps total du mail avec le message précedent
		$this->mail_corps = $this->mime_separateur_mixed.$this->retour_charriot;
		$this->mail_corps .= $this->create_text_block($this->message, 'plain');
	}
	elseif($this->mail_type == 1) { // Si le fichier est déjà de type 'multipart/alternative'
		// Création de l'en-tête de la sous-couche 'multipart/alternative' au sein du corps total du mail et dans laquelle on va mettre la couche 'multipart/alternative' précedente
		$rajout = $this->mime_separateur_mixed.$this->retour_charriot;
		$rajout .= "Content-Type: multipart/alternative;".$this->retour_charriot;
		$rajout .= "\tboundary=\"".$this->mime_separateur_alter."\"".$this->retour_charriot;
		$rajout .= $this->retour_charriot;
		$rajout .= $this->retour_charriot;
		$rajout .= "--";
		// Modification du corps total du mail
		$this->mail_corps = $rajout.$this->mail_corps; // On mets l'en-tête qu'on vient de créer devant le contenu précedent
		$this->mail_corps .= $this->mime_separateur_alter."--".$this->retour_charriot; // Puis on mets un morceau vide de type 'multipart/alternative'
		$this->mail_corps .= $this->retour_charriot;
		$this->mail_corps .= "--";
	}

	$this->mail_type = 2; // On change le type du mail pour un type 'multipart/mixed'

	$fichier_types = array(
		'.gz' => 'application/x-gzip',
    		'.tgz' => 'application/x-gzip',
    		'.zip' => 'application/zip',
    		'.pdf' => 'application/pdf"',
    		'.png' => 'image/png',
    		'.gif' => 'image/gif',
    		'.jpg' => 'image/jpeg',
    		'.txt' => 'text/plain',
    		'.htm' => 'text/html',
    		'.html' => 'text/html'
    	);
	$fichier_nom = basename($fichier);
	if($fichier_type == false) { // Si le type du fichier n'a pas été spécifié
		$fichier_ext = strrchr($fichier_nom, '.');
		if(array_key_exists($fichier_ext, $fichier_types)) { // Si l'extension est repertoriée dans le tableau
			$fichier_type = $fichier_types[$fichier_ext]; // On peut mettre le type MIME exact
		}
		else {
			$fichier_type = 'application/octet-stream'; // Sinon, on met le type par défaut 'application/octet-stream'
		}
	}

	$sortie = $this->mime_separateur_mixed.$this->retour_charriot;
	$sortie .= "Content-Type: ".$fichier_type.";".$this->retour_charriot;
	$sortie .= "\tname=\"".$fichier_nom ."\"".$this->retour_charriot;
	$sortie .= "Content-Transfer-Encoding: base64".$this->retour_charriot;
	$sortie .= "Content-Disposition: attachment;".$this->retour_charriot;
	$sortie .= "\tfilename=\"".$fichier_nom ."\"".$this->retour_charriot;
	$sortie .= $this->retour_charriot;
	$sortie .= $this->encoder_fichier($fichier).$this->retour_charriot;
	$sortie .= $this->retour_charriot;
	$sortie .= "--";

	if(!empty($this->mail_corps)) { // Si le corps total du mail n'est pas vide, c'est que le mail est déjà en plusieurs parties
		$this->mail_corps .= $sortie; // On rajoute ce fichier et ses en-têtes à la suite du corps total du mail
	}
	else { // Sinon, c'est que le mail est encore en un seul morceau
		$this->mail_corps = $sortie; // Puis on rajoute le fichier et ses en-têtes
	}
}

function encoder_fichier($fichier) {
	if(is_readable($fichier)) {
		$fopen_handle = fopen($fichier, 'r');
		$contenu = fread($fopen_handle, filesize($fichier));
		$encoded = chunk_split(base64_encode($contenu));
		fclose($fopen_handle);	
	}
	return $encoded;
}

function create_smtp_headers() {
	$return = "From: ".$this->exp.$this->retour_charriot;
	if(!empty($this->cc)) {
		$return .= "Cc: ".$this->cc.$this->retour_charriot;
	}
	if(!empty($this->cci)) {
		$return .= "Bcc: ".$this->cci.$this->retour_charriot;
	}
	$return .= "Reply-To: ".$this->exp.$this->retour_charriot;
	$return .= "Return-Path: ".$this->exp.$this->retour_charriot;
	$return .= "X-Mailer: PHP ".phpversion().$this->retour_charriot;
	$return .= "X-Sender: ".$this->exp.$this->retour_charriot;
	return $return;
}

function create_mime_headers() {
	$mail_types = array(
		"text/plain;".$this->retour_charriot."\tcharset=\"iso-8859-1\"".$this->retour_charriot."Content-Transfer-Encoding: 8bit",
		"multipart/alternative;".$this->retour_charriot."\tboundary=\"".$this->mime_separateur_alter."\"",
		"multipart/mixed;".$this->retour_charriot."\tboundary=\"".$this->mime_separateur_mixed."\""
	);

	$return = "MIME-Version: 1.0".$this->retour_charriot;
	$return .= "Content-Type: ".$mail_types[$this->mail_type].$this->retour_charriot;
	return $return;
}

function envoi() {

	if($this->mail_type == 0) {
		$this->mail_corps = $this->message;
	}
	else {
		$this->mail_corps = "This is a multi-part message in MIME format.".$this->retour_charriot.$this->retour_charriot."--".$this->mail_corps; // On rajoute, au début, le texte indiquant que c'est un mail en plusieurs parties (pour les logiciels de messagerie non compatibles)
		if($this->mail_type == 1) {
			$this->mail_corps .= $this->mime_separateur_alter."--".$this->retour_charriot; // Puis on mets un morceau vide de type 'multipart/alternative'
		}
		elseif($this->mail_type == 2) {
			$this->mail_corps .= $this->mime_separateur_mixed."--".$this->retour_charriot; // Puis on mets un morceau vide de type 'multipart/mixed'
		}
	}

	if(function_exists('mail')) {
		/** DEBUG
		echo '<pre>';
		echo '$this->dest : '.$this->dest.'

'; echo '$this->objet : '.$this->objet.'
'; echo '$this->mail_corps : '; echo $this->mail_corps.'
'; echo '$this->create_smtp_headers().$this->create_mime_headers() : '; echo $this->create_smtp_headers().$this->create_mime_headers().'
'; echo ''; **/ if(mail($this->dest, $this->objet, $this->mail_corps, $this->create_smtp_headers().$this->create_mime_headers())) { return true; } else { return false; } } elseif(function_exists('email')) { $smtp_headers = $this->create_smtp_headers(); $smtp_headers = preg_replace("/From: [^(".$this->retour_charriot.")]+".$this->retour_charriot."/", '', $smtp_headers); // On retire From: ... des en-têtes SMTP $smtp_headers = preg_replace("/Reply-To: [^(".$this->retour_charriot.")]+".$this->retour_charriot."/", '', $smtp_headers); // On retire Reply-To: ... des en-têtes SMTP $from = substr($this->exp, 0, strpos($this->exp, '@')); // On retire le '@' et tout ce qui suit $mail_headers = $smtp_headers.$this->create_mime_headers(); /** DEBUG echo '
';
			echo '$from : '.$from.'

'; echo '$this->dest : '.$this->dest.'
'; echo '$this->objet : '.$this->objet.'
'; echo '$this->mail_corps : '; echo $this->mail_corps.'
'; echo '$from : '.$from.'
'; echo '$mail_headers : '; echo $mail_headers.'
'; echo '
'; **/ if(email($from, $this->dest, $this->objet, $this->mail_corps, $from, $mail_headers)) { return true; } else { return false; } } else { return false; }
}

};[/cpp]

Pour l’utilisation :[cpp]
$class_mail = new sys_mail($expediteur, $destinataire, $copieconforme, $copieconformeinvisible, $objet, $message, $mail_en_html__true_ou_false__facultatif);
$class_mail->attacher($chemin_local_vers_le_fichier1, $type_MIME_du_fichier1__facultatif);
$class_mail->attacher($chemin_local_vers_le_fichier2, $type_MIME_du_fichier2__facultatif);
$class_mail->envoi();[/cpp]

pk merci je vai regarder ca !! Mais j’aimerai tt de m savoir le pb de l’autre script :stuck_out_tongue:

Personne ne sait alors ce qui fo mettre a la place du base 64 ?? ou personne qui pourrai m’aider pr trouver car j’ai beau regardé sur le net le principe de mime je capte aps grand chose :frowning:

mime-type -> en gros, c’est prévenir le client du type de fichier qu’il risque de rencontrer

ex : image/gif -> une image gif

La valeur par défaut (application/octet-stream) est très bien, le client de messagerie n’essaiera pas de faire de traitement dessus

Pour une liste complète (en cherchant avec google) :
http://www.hostmeister.com/mime.htm

ok merci de l’explication c pas du tt ce que j’avai compris sur le net :slight_smile:

Et au passage tu sais s’il y a une fonction pr récupérer le mime type d’un fichier ??

http://fr3.php.net/manual/fr/function.mime-content-type.php

j’ai cette erreur avec ta fonction Adri2000 :

Voila ce que j’ai fait :
[cpp]CMailFile($sujet,"revlam@tiscali.fr",$email,$message,$fichier,mime_content_type($fichier));[/cpp]

Des idées ?? JE suis sur un serveur multimania dc je me disait que la fonction était peut etre pas activé sur leur serveur apache !!

Vérifie avec phpinfo().

Voila mon phpinfo http://membres.lycos.fr/revlammail/roger.php j’ai bien l’impression que le truc necessaire n’est pas activé ! a un moment il parle de “magic” et c’est mis en off :frowning:

Marrant :slight_smile: C’est pas mise à jour, ça doit être marrant pour tester les failles :smiley:

comment ca ???

ET sur free la fonction mail ne fonctionne pas je croi ?