Niko Posté 7 Septembre 2004 Posté 7 Septembre 2004 onjour à tous J'ai un petit probleme, j'ai une class mail que j'aimerais transformer, Au lieu de choisir la priorité du message, j'aimerais pouvoir choisir parmis plusieurs destinataires possibles : partie formulaire : Code: <form action="formmail.php" method="post" enctype="multipart/form-data" name="form"><fieldset><label for="priority">Destinataire :</label><select name="priority" id="priority" size="1" class="select"><option value="1" class="texte">test1_AT_test.org</option><option value="2" class="texte">test2_AT_test.org</option><option value="3" class="texte">test3_AT_test.org</option></select><label for="email">Expéditeur :</label><input type="text" name="email" id="email" size="35" class="texte"/><label for="subject">Sujet :</label><input type="text" name="subject" id="subject" size="35" class="texte"/><label for="msg">Message : </label><textarea rows="12" name="msg" id="msg" cols="40" class="texte"></textarea><label for="NomFichier">Fichier joint : </label><input type="hidden" name="MAX_FILE_SIZE" value="100000" class="texte"/><input name="NomFichier" id="NomFichier" type="file" size="16" class="texte" /><input type="submit" value="Envoyer" class="bouton" /></fieldset></form> Class mail Code: <?/* PARAMETRAGE DU SCRIPT *//* ENTREZ VOTRE ADRESSE EMAIL ENTRE LES GUILLEMETS*/$dest="test_AT_test.org";Form Mail +Loïc BreslerScript permettant d'envoyer un mail grâce à un formulaire sur un site. Ce qu'il fait de plus que les autresc'est qu'il gère la priorité du message, les copies et permet d'envoyer un fichier joint si l'hébergeur le permet(en gros presque tous sauf Online et Nexen)Le script utilise une version de la classe Mail() développée par Leo West (lwest.free.fr) et modifiée par mes soins.DESCRIPTION this class encapsulates the PHP mail() function. implements CC, Bcc, Priority headers*/class Mail{ var $sendto= array(); var $from, $msubject; var $acc= array(); var $abcc= array(); var $aattach= array(); var $priorities= array( '1 (Highest)', '2 (High)', '3 (Normal)', '4 (Low)', '5 (Lowest)' );// Mail contructorfunction Mail(){ $this->autoCheck( true );}/* autoCheck( $boolean )* activate or desactivate the email addresses validator* ex: autoCheck( true ) turn the validator on* by default autoCheck feature is on*/function autoCheck( $bool ){ if( $bool ) $this->checkAddress = true; else $this->checkAddress = false;}/* Subject( $subject )* define the subject line of the email* $subject: any valid mono-line string*/function Subject( $subject ){ $this->msubject = strtr( $subject, "\r\n" , " " );}/* From( $from )* set the sender of the mail* $from should be an email address*/function From( $from ){ if( ! is_string($from) ) { echo "Class Mail: error, From is not a string"; exit; } $this->from= $from;}/* To( $to )* set the To ( recipient )* $to : email address, accept both a single address or an array of addresses*/function To( $to ){ // TODO : test validité sur to if( is_array( $to ) ) $this->sendto= $to; else $this->sendto[] = $to; if( $this->checkAddress == true ) $this->CheckAdresses( $this->sendto );}/* Cc()* set the CC headers ( carbon copy )* $cc : email address(es), accept both array and string*/function Cc( $cc ){ if( is_array($cc) ) $this->acc= $cc; else $this->acc[]= $cc; if( $this->checkAddress == true ) $this->CheckAdresses( $this->acc );}/* Bcc()* set the Bcc headers ( blank carbon copy ).* $bcc : email address(es), accept both array and string*/function Bcc( $bcc ){ if( is_array($bcc) ) { $this->abcc = $bcc; } else { $this->abcc[]= $bcc; } if( $this->checkAddress == true ) $this->CheckAdresses( $this->abcc );}/* Body()* set the body of the mail ( message )*/function Body( $body ){ $this->body= $body;}/* Send()* fornat and send the mail*/function Send(){ // build the headers $this->_build_headers(); // include attached files if( sizeof( $this->aattach > 0 ) ) { $this->_build_attachement(); $body = $this->fullBody . $this->attachment; } // envoie du mail aux destinataires principal for( $i=0; $i< sizeof($this->sendto); $i++ ) { $res = mail($this->sendto[$i], $this->msubject,$body, $this->headers); // TODO : trmt res }}/* Organization( $org )* set the Organisation header*/function Organization( $org ){ if( trim( $org != "" ) ) $this->organization= $org;}/* Priority( $priority )* set the mail priority* $priority : integer taken between 1 (highest) and 5 ( lowest )* ex: $m->Priority(1); => Highest*/function Priority( $priority ){ if( ! intval( $priority ) ) return false; if( ! isset( $this->priorities[$priority-1]) ) return false; $this->priority= $this->priorities[$priority-1]; return true;}/* Attach( $filename, $filetype )* attach a file to the mail* $filename : path of the file to attach* $filetype : MIME-type of the file. default to 'application/x-unknown-content-type'* $disposition : instruct the Mailclient to display the file if possible ("inline") or always as a link ("attachment")* possible values are "inline", "attachment"*/function Attach( $filename, $filetype='application/x-unknown-content-type', $disposition = "inline" ){ // TODO : si filetype="", alors chercher dans un tablo de MT connus / extension du fichier $this->aattach[] = $filename; $this->actype[] = $filetype; $this->adispo[] = $disposition;}/* Get()* return the whole e-mail , headers + message* can be used for displaying the message in plain text or logging it*/function Get(){ $this->_build_headers(); if( sizeof( $this->aattach > 0 ) ) { $this->_build_attachement(); $this->body= $this->body . $this->attachment; } $mail = $this->headers; $mail .= "\n$this->body"; return $mail;}/* ValidEmail( $email )* return true if email adress is ok - regex from Manuel Lemos (mlemos_AT_acm.org)* $address : email address to check*/function ValidEmail($address){ if( ereg( ".*<(.+)>", $address, $regs ) ) { $address = $regs[1]; } if(ereg( "^[^@ ]+@([a-zA-Z0-9\-]+\.)+([a-zA-Z0-9\-]{2}|net|com|gov|mil|org|edu|int)\$",$address) ) return true; else return false;}/* CheckAdresses()* check validity of email addresses* if unvalid, output an error message and exit, this may be customized* $aad : array of emails addresses*/function CheckAdresses( $aad ){ for($i=0;$i< sizeof( $aad); $i++ ) { if( ! $this->ValidEmail( $aad[$i]) ) { echo "Class Mail, method Mail : invalid address $aad[$i]"; exit; } }}/********************** PRIVATE METHODS BELOW **********************************//* _build_headers()* [INTERNAL] build the mail headers*/function _build_headers(){ // creation du header mail $this->headers= "From: $this->from\n"; $this->to= implode( ", ", $this->sendto ); if( count($this->acc) > 0 ) { $this->cc= implode( ", ", $this->acc ); $this->headers .= "CC: $this->cc\n"; } if( count($this->abcc) > 0 ) { $this->bcc= implode( ", ", $this->abcc ); $this->headers .= "BCC: $this->bcc\n"; } if( $this->organization != "" ) $this->headers .= "Organization: $this->organization\n"; if( $this->priority != "" ) $this->headers .= "X-Priority: $this->priority\n";}/** _build_attachement()* internal use only - check and encode attach file(s)*/function _build_attachement(){ $this->boundary= "------------" . md5( uniqid("myboundary") ); // TODO : variable bound $this->headers .= "MIME-Version: 1.0\nContent-Type: multipart/mixed;\n boundary=\"$this->boundary\"\n\n"; $this->fullBody = "This is a multi-part message in MIME format.\n--$this->boundary\nContent-Type: text/plain; charset=us-ascii\nContent-Transfer-Encoding: 7bit\n\n" . $this->body ."\n"; $sep= chr(13) . chr(10); $ata= array(); $k=0; // for each attached file, do... for( $i=0; $i < sizeof( $this->aattach); $i++ ) { $filename = $this->aattach[$i]; $basename = basename($filename); $ctype = $this->actype[$i]; // content-type $disposition = $this->adispo[$i]; if( ! file_exists( $filename) ) { echo "Class Mail, method attach : file $filename can't be found"; exit; } $subhdr= "--$this->boundary\nContent-type: $ctype;\n name=\"$basename\"\nContent-Transfer-Encoding: base64\nContent-Disposition: $disposition;\n filename=\"$basename\"\n"; $ata[$k++] = $subhdr; // non encoded line length $linesz= filesize( $filename)+1; $fp= fopen( $filename, 'r' ); $data= base64_encode(fread( $fp, $linesz)); fclose($fp); $ata[$k++] = chunk_split( $data );/* // OLD version - used in php < 3.0.6 - replaced by chunk_split() $deb=0; $len=76; $data_len= strlen($data); do { $ata[$k++]= substr($data,$deb,$len); $deb += $len; } while($deb < $data_len );*/ } $this->attachment= implode($sep, $ata);}} // class Mail$subject=StripSlashes($subject);$msg=StripSlashes($msg);$msg="Message depuis votre site web:$msg";$m= new Mail; // create the mail $m->From( "$email" ); $m->To( "$dest"); $m->Subject( "$subject" ); $m->Body( $msg); // set the bodyif ($email1!="") { $m->Cc( "$email1"); } $m->Priority($priority); if ("$NomFichier_name"!="") { copy("$NomFichier","upload/$NomFichier_name"); $m->Attach( "upload/$NomFichier_name", "application/octet-stream" ); } $m->Send();if ("$NomFichier_name"!="") {Unlink("upload/$NomFichier_name"); } ?><?php echo"Ca roule";?> J'ai essayé de faire une dérivée de la function Priority( $priority ) mais ça ne l'a pas fait :-/ Est ce que quelqu'un pourrait m'aider ? Merci !
Anonymus Posté 7 Septembre 2004 Posté 7 Septembre 2004 Tu voudrais plutot envoyer à un autre destinataire, ou à plusieurs destinataires ? Ou est ce l'expéditeur qui devra choisir le destinataire ? En gros, le destinataire correspond à la variable $email, et elle est inclue dans l'objet à partir de la ligne $m->From( "$email" ); Il te suffirait donc de modifier cette ligne pour obtenir l'effet désiré. Mais... quel est l'effet désiré ?
Niko Posté 7 Septembre 2004 Auteur Posté 7 Septembre 2004 J'aimerais pouvoir faire comme dans le form, c'est à dire choisir un destinataire parmis plusieurs choix d'un select
Anonymus Posté 7 Septembre 2004 Posté 7 Septembre 2004 Donc, tu créé un tableau, avec les différents destinataires. Au lieu de : $dest="test_AT_test.org"; tu mets : $destinataire[0]="test0 _AT_test.org";$destinataire[1]="test1 _AT_test.org";$destinataire[2]="test2 _AT_test.org"; Tu mets un <select option, avec les différents destinataires. Pourquoi pas dynamique : echo"<select name=dest>";foreach($destinataire as $key=>$value)echo"<option value=".$key.">".$value."</option>";echo"</select>"; Et dans la partie de code : $m= new Mail; // create the mail $m->From( "$email" ); $m->To( "$dest"); $m->Subject( "$subject" ); $m->Body( $msg); // set the body Tu remplaces la ligne $m->To( "$dest"); par : $m->To( $destinataire[$dest]); Et ca devrait marcher. (Sinon, tu n'hésites pas à revenir ) Anonymus.
Niko Posté 7 Septembre 2004 Auteur Posté 7 Septembre 2004 Je te remercie beaucoup, je n'ai pas eu beaucoup d'autres modifications à faire pour que cela fonctionne ! @ la prochaine :-)
XIII Posté 3 Février 2005 Posté 3 Février 2005 Bonjour, Je ne suis pas doué et je bloque sur ce script. Je suis passé de easyphp 1.6 à 1.7 et je dois donc déclarer mes variables. Je le fais comme ça : $email = $_POST["email"]; $subject = $_POST["subject"]; $msg = $_POST["msg"]; $priority = $_POST["priority"]; et ça a l'air OK... Les messages sont bien envoyés si je mets pas de pièce jointe. Mon probleme est donc la déclaration de la variable $NomFichier. J'ai essayé : $NomFichier = $_FILES['NomFichier']; $NomFichier_name = $_FILES['NomFichier']['name']; mais ça marche pas. J'ai cette erreur : Warning: copy(Array): failed to open stream: No such file or directory in f:\manon\pages\formmail.php on line 363 Class Mail, method attach : file ../upload/Frunlog.txt can't be found Frunlog.txt est le fichier que j'ai essayé de joindre au message. Quelqu'un peut il m'aider ? Merci beaucoup par avance !!!!!
Antoine Cailliau Posté 4 Février 2005 Posté 4 Février 2005 Ton fichier n'est certainement pas completement et correctement téléchargé. Montre un peu le code qui te pose problème
XIII Posté 4 Février 2005 Posté 4 Février 2005 (modifié) Merci pour cette réponse ! J'utilise le script qui est dans le 1er post de Niko ci-dessus. Si je ne modifie rien j'ai l'erreur suivante : Notice: Undefined variable: subject in f:\manon\pages\formmail.php on line 347 Notice: Undefined variable: msg in f:\manon\pages\formmail.php on line 348 Notice: Undefined variable: email in f:\manon\pages\formmail.php on line 352 Notice: Undefined variable: priority in f:\manon\pages\formmail.php on line 356 Notice: Undefined variable: NomFichier_name in f:\manon\pages\formmail.php on line 357 Notice: Undefined property: priority in f:\manon\pages\formmail.php on line 289 Notice: Undefined variable: NomFichier_name in f:\manon\pages\formmail.php on line 362 Votre message a bien été reçu ! Si je rajoute en début de fichier : $NomFichier = $_FILES['NomFichier']; $NomFichier_name = $_FILES['NomFichier']['name']; $email = $_POST["email"]; $subject = $_POST["subject"]; $msg = $_POST["msg"]; $priority = $_POST["priority"]; -> Le script marche bien sans piece jointe (un mail est envoyé). -> Erreur avec piece jointe : Warning: copy(Array): failed to open stream: No such file or directory in f:\manon\pages\formmail.php on line 363 Class Mail, method attach : file ../upload/Favorites -- 4 and 5 star rated.wpl can't be found Le probleme est visiblement lié à mon utilisation de la variable NomFichier. Si je fais un echo $NomFichier j'ai Array comme résultat.... Merci pour votre aide !! Modifié 4 Février 2005 par XIII
Anonymus Posté 4 Février 2005 Posté 4 Février 2005 $_FILES['NomFichier']; renvoie un tableau, avec toutes les variables dont tu as besoin. D'ailleurs, tu utilises déjà le nom : $_FILES['NomFichier']['name']; Essaies ce code : foreach($_FILES['NomFichier'] as $k => $v)echo "<br>".$k."->".$v; cela te donnera tous les index utilisables pour ce tableau, ainsi que leurs valeurs.
XIII Posté 5 Février 2005 Posté 5 Février 2005 Merci beaucoup !!!!! J'ai fait l'essai en attachant mon fichier style.css. Le script retourne : name->style.css type->text/css tmp_name->C:\Program Files\EasyPHP1-7\tmp\phpD124.TMP error->0 size->3375 J'ai alors ajouté : $NomFichier = $_FILES['NomFichier']['tmp_name']; $NomFichier_name = $_FILES['NomFichier']['name']; ET CA MARCHE !!!! LA PIECE JOINTE A BIEN ETE ATTACHEE ET ENVOYEE !! MERCI BEAUCOUP
Sujets conseillés
Veuillez vous connecter pour commenter
Vous pourrez laisser un commentaire après vous êtes connecté.
Connectez-vous maintenant