Aller au contenu

mail() et destinataire


Sujets conseillés

Posté

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 Bresler
Script permettant d'envoyer un mail grâce à un formulaire sur un site. Ce qu'il fait de plus que les autres
c'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 contructor

function 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 body
if ($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 !

Posté

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é ?

Posté

J'aimerais pouvoir faire comme dans le form, c'est à dire choisir un destinataire parmis plusieurs choix d'un select

Posté

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.

Posté

Je te remercie beaucoup, je n'ai pas eu beaucoup d'autres modifications à faire pour que cela fonctionne !

@ la prochaine :-)

  • 4 months later...
Posté

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 !!!!!

Posté (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 !! :rolleyes:

Modifié par XIII
Posté

$_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.

Posté

Merci beaucoup !!!!! :D

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 ;)

Veuillez vous connecter pour commenter

Vous pourrez laisser un commentaire après vous êtes connecté.



Connectez-vous maintenant
×
×
  • Créer...